@@ -2728,5 +2728,140 @@ extension SnapshotTests {
27282728 """#
27292729 }
27302730 }
2731+
2732+ @Test func nested( ) {
2733+ assertMacro {
2734+ """
2735+ @Table
2736+ private struct Row {
2737+ let id: UUID
2738+ @Columns
2739+ var timestamps: Timestamps
2740+ }
2741+ """
2742+ } expansion: {
2743+ #"""
2744+ private struct Row {
2745+ let id: UUID
2746+ @Columns
2747+ var timestamps: Timestamps
2748+
2749+ public nonisolated struct TableColumns: StructuredQueriesCore.TableDefinition, StructuredQueriesCore.PrimaryKeyedTableDefinition {
2750+ public typealias QueryValue = Row
2751+ public let id = StructuredQueriesCore.TableColumn<QueryValue, UUID>("id", keyPath: \QueryValue.id)
2752+ public let timestamps = StructuredQueriesCore.ColumnGroup<QueryValue, Timestamps>(keyPath: \QueryValue.timestamps)
2753+ public var primaryKey: StructuredQueriesCore.TableColumn<QueryValue, UUID> {
2754+ self.id
2755+ }
2756+ public static var allColumns: [any StructuredQueriesCore.TableColumnExpression] {
2757+ [[QueryValue.columns.id], StructuredQueriesCore.ColumnGroup.allColumns(keyPath: \QueryValue.timestamps)].flatMap(\.self)
2758+ }
2759+ public static var writableColumns: [any StructuredQueriesCore.WritableTableColumnExpression] {
2760+ [[QueryValue.columns.id], StructuredQueriesCore.ColumnGroup.writableColumns(keyPath: \QueryValue.timestamps)].flatMap(\.self)
2761+ }
2762+ public var queryFragment: QueryFragment {
2763+ "\(self.id), \(self.timestamps)"
2764+ }
2765+ }
2766+
2767+ public struct Selection: StructuredQueriesCore.TableExpression {
2768+ public typealias QueryValue = Row
2769+ public let allColumns: [any StructuredQueriesCore.QueryExpression]
2770+ public init(
2771+ id: some StructuredQueriesCore.QueryExpression<UUID>,
2772+ timestamps: some StructuredQueriesCore.QueryExpression<Timestamps>
2773+ ) {
2774+ self.allColumns = [id, timestamps]
2775+ }
2776+ }
2777+
2778+ public struct Draft: StructuredQueriesCore.TableDraft {
2779+ public typealias PrimaryTable = Row
2780+ let id: UUID?
2781+ @Columns var timestamps: Timestamps
2782+ public nonisolated struct TableColumns: StructuredQueriesCore.TableDefinition {
2783+ public typealias QueryValue = Draft
2784+ public let id = StructuredQueriesCore.TableColumn<QueryValue, UUID?>("id", keyPath: \QueryValue.id)
2785+ public let timestamps = StructuredQueriesCore.ColumnGroup<QueryValue, Timestamps>(keyPath: \QueryValue.timestamps)
2786+ public static var allColumns: [any StructuredQueriesCore.TableColumnExpression] {
2787+ [[QueryValue.columns.id], StructuredQueriesCore.ColumnGroup.allColumns(keyPath: \QueryValue.timestamps)].flatMap(\.self)
2788+ }
2789+ public static var writableColumns: [any StructuredQueriesCore.WritableTableColumnExpression] {
2790+ [[QueryValue.columns.id], StructuredQueriesCore.ColumnGroup.writableColumns(keyPath: \QueryValue.timestamps)].flatMap(\.self)
2791+ }
2792+ public var queryFragment: QueryFragment {
2793+ "\(self.id), \(self.timestamps)"
2794+ }
2795+ }
2796+ public struct Selection: StructuredQueriesCore.TableExpression {
2797+ public typealias QueryValue = Draft
2798+ public let allColumns: [any StructuredQueriesCore.QueryExpression]
2799+ public init(
2800+ id: some StructuredQueriesCore.QueryExpression<UUID?>,
2801+ timestamps: some StructuredQueriesCore.QueryExpression<Timestamps>
2802+ ) {
2803+ self.allColumns = [id, timestamps]
2804+ }
2805+ }
2806+ public typealias QueryValue = Self
2807+
2808+ public typealias From = Swift.Never
2809+
2810+ public nonisolated static var columns: TableColumns {
2811+ TableColumns()
2812+ }
2813+
2814+ public nonisolated static var tableName: String {
2815+ Row.tableName
2816+ }
2817+
2818+ public nonisolated init(decoder: inout some StructuredQueriesCore.QueryDecoder) throws {
2819+ self.id = try decoder.decode(UUID.self)
2820+ let timestamps = try decoder.decode(Timestamps.self)
2821+ guard let timestamps else {
2822+ throw QueryDecodingError.missingRequiredColumn
2823+ }
2824+ self.timestamps = timestamps
2825+ }
2826+
2827+ public nonisolated init(_ other: Row) {
2828+ self.id = other.id
2829+ self.timestamps = other.timestamps
2830+ }
2831+ public init(
2832+ id: UUID? = nil,
2833+ timestamps: Timestamps
2834+ ) {
2835+ self.id = id
2836+ self.timestamps = timestamps
2837+ }
2838+ }
2839+ }
2840+
2841+ nonisolated extension Row: StructuredQueriesCore.Table, StructuredQueriesCore.PrimaryKeyedTable, StructuredQueriesCore.PartialSelectStatement {
2842+ public typealias QueryValue = Self
2843+ public typealias From = Swift.Never
2844+ public nonisolated static var columns: TableColumns {
2845+ TableColumns()
2846+ }
2847+ public nonisolated static var tableName: String {
2848+ "rows"
2849+ }
2850+ public nonisolated init(decoder: inout some StructuredQueriesCore.QueryDecoder) throws {
2851+ let id = try decoder.decode(UUID.self)
2852+ let timestamps = try decoder.decode(Timestamps.self)
2853+ guard let id else {
2854+ throw QueryDecodingError.missingRequiredColumn
2855+ }
2856+ guard let timestamps else {
2857+ throw QueryDecodingError.missingRequiredColumn
2858+ }
2859+ self.id = id
2860+ self.timestamps = timestamps
2861+ }
2862+ }
2863+ """#
2864+ }
2865+ }
27312866 }
27322867}
0 commit comments