import Common struct Gaps: ConvenienceMutable, Equatable, Sendable { var inner: Inner var outer: Outer static let zero = Gaps(inner: .zero, outer: .zero) struct Inner: ConvenienceMutable, Equatable, Sendable { var vertical: DynamicConfigValue var horizontal: DynamicConfigValue static let zero = Inner(vertical: 0, horizontal: 0) init(vertical: Int, horizontal: Int) { self.vertical = .constant(vertical) self.horizontal = .constant(horizontal) } init(vertical: DynamicConfigValue, horizontal: DynamicConfigValue) { self.vertical = vertical self.horizontal = horizontal } } struct Outer: ConvenienceMutable, Equatable, Sendable { var left: DynamicConfigValue var bottom: DynamicConfigValue var top: DynamicConfigValue var right: DynamicConfigValue static let zero = Outer(left: 0, bottom: 0, top: 0, right: 0) init(left: Int, bottom: Int, top: Int, right: Int) { self.left = .constant(left) self.bottom = .constant(bottom) self.top = .constant(top) self.right = .constant(right) } init(left: DynamicConfigValue, bottom: DynamicConfigValue, top: DynamicConfigValue, right: DynamicConfigValue) { self.left = left self.bottom = bottom self.top = top self.right = right } } } struct ResolvedGaps { let inner: Inner let outer: Outer struct Inner { let vertical: Int let horizontal: Int func get(_ orientation: Orientation) -> Int { orientation == .h ? horizontal : vertical } } struct Outer { let left: Int let bottom: Int let top: Int let right: Int } @MainActor init(gaps: Gaps, monitor: any MonitorInfo) { inner = .init( vertical: gaps.inner.vertical.getValue(for: monitor), horizontal: gaps.inner.horizontal.getValue(for: monitor), ) outer = .init( left: gaps.outer.left.getValue(for: monitor), bottom: gaps.outer.bottom.getValue(for: monitor), top: gaps.outer.top.getValue(for: monitor), right: gaps.outer.right.getValue(for: monitor), ) } } private let gapsParser: [String: any ParserProtocol] = [ "inner": Parser(\.inner, parseInner), "outer": Parser(\.outer, parseOuter), ] private let innerParser: [String: any ParserProtocol] = [ "vertical": Parser(\.vertical, parseIntDynamicValue), "horizontal": Parser(\.horizontal, parseIntDynamicValue), ] private let outerParser: [String: any ParserProtocol] = [ "left": Parser(\.left, parseIntDynamicValue), "bottom": Parser(\.bottom, parseIntDynamicValue), "top": Parser(\.top, parseIntDynamicValue), "right": Parser(\.right, parseIntDynamicValue), ] private func parseIntDynamicValue(_ raw: OrderedJson, _ backtrace: ConfigBacktrace, _ c: inout ConfigParserContext) -> DynamicConfigValue { parseDynamicValue(raw, ofType: Int.self, 0, backtrace, &c) } func parseGaps(_ raw: OrderedJson, _ backtrace: ConfigBacktrace, _ c: inout ConfigParserContext) -> Gaps { parseTable(raw, .zero, gapsParser, backtrace, &c) } func parseInner(_ raw: OrderedJson, _ backtrace: ConfigBacktrace, _ c: inout ConfigParserContext) -> Gaps.Inner { parseTable(raw, Gaps.Inner.zero, innerParser, backtrace, &c) } func parseOuter(_ raw: OrderedJson, _ backtrace: ConfigBacktrace, _ c: inout ConfigParserContext) -> Gaps.Outer { parseTable(raw, Gaps.Outer.zero, outerParser, backtrace, &c) }