SwiftUI Canvas Text - scale to fill rectangle

How do I draw a single line of text in a SwiftUI Canvas, scaled to fill a given rectangle?

Example:

Canvas { context, size in

    let r = CGRect(origin: CGPointZero, size: size);  // Whole canvas

    let t = Text("Hello World");

    context.draw(t, in: r);

}

Outside of Canvas I'd add .minimumScaleFactor(0) .lineLimit(1), and I guess set a large default font size, and I'd get the result I want.

But inside Canvas, .minimumScaleFactor and .lineLimit don't seem to be available; they return some View, not Text, which can't be used in context.draw. (Is there a trick to make that work?)

I have written the following to do this, but I think there must be an easier way to achieve this! Suggestions?

extension GraphicsContext {

    mutating func draw_text_in_rect(string: String, rect: CGRect)
    {
        let text = Text(string) .font(.system(size: 25));
          // The font size used here does matter, because e.g. letter spacing
          // varies with the font size.
        
        let resolved = resolve(text);
        let text_size = resolved.measure(in: CGSize(width: CGFloat.infinity, height: CGFloat.infinity));
        let text_aspect = text_size.width / text_size.height;
        let fit_size = CGSize(width: min(rect.size.width, rect.size.height*text_aspect),
                              height: min(rect.size.height, rect.size.width/text_aspect));
        let fit_rect = CGRect(x: rect.origin.x + (rect.size.width-fit_size.width)/2,
                              y: rect.origin.y + (rect.size.height-fit_size.height)/2,
                              width: fit_size.width,
                              height: fit_size.height);
        let scale = fit_size.width / text_size.width;
        
        // For debug:
        // var p = Path();
        // p.addRect(fit_rect);
        // stroke(p, with: GraphicsContext.Shading.color(.red), lineWidth: 1);
        
        translateBy(x: fit_rect.minX, y: fit_rect.minY);
        scaleBy(x:scale, y:scale);

        draw(resolved, at: CGPointZero, anchor: UnitPoint.topLeading);
        
        transform = CGAffineTransformIdentity;
    }
};
SwiftUI Canvas Text - scale to fill rectangle
 
 
Q