waterui 0.3.0

A modern UI framework for Rust
import CoreGraphics

/// Shared helper that drives measurements and placement using the Rust layout FFI.
/// Uses the SubView callback protocol - Rust calls back to Swift to measure children.
@MainActor
struct NativeLayoutBridge {
    /// Creates a cached SubView array for repeated Rust layout calls.
    /// The measure closure will be called by Rust during layout.
    func createCachedSubViewArray<V: WuiComponent>(
        children: [V],
        measureChild: @escaping (V, WuiProposalSize) -> WuiViewDimensions
    ) -> CachedSubViewArray {
        let proxies = children.map { child in
            SubViewProxy(
                stretchAxis: child.stretchAxis,
                priority: child.layoutPriority()
            ) { proposal in
                measureChild(child, proposal)
            }
        }
        return CachedSubViewArray(proxies)
    }

    /// Calculate the full measurement packet for a container.
    func containerMeasure(
        layout: WuiLayout,
        parentProposal: WuiProposalSize,
        children: CachedSubViewArray
    ) -> WuiViewDimensions {
        children.resetMeasurements()
        return layout.measure(proposal: parentProposal, children: children)
    }

    /// Calculate the container size using Rust layout engine.
    func containerSize(
        layout: WuiLayout,
        parentProposal: WuiProposalSize,
        children: CachedSubViewArray
    ) -> CGSize {
        containerMeasure(layout: layout, parentProposal: parentProposal, children: children).cgSize
    }

    /// Get placement rects for all children.
    /// Rust will call back to measure each child as needed during placement.
    func placements(
        layout: WuiLayout,
        bounds: CGRect,
        children: CachedSubViewArray
    ) -> [CGRect] {
        children.resetMeasurements()
        return layout.place(bounds: bounds, children: children)
    }
}