Skip to content

Commit a5b1723

Browse files
committed
wip
1 parent 6d06754 commit a5b1723

File tree

2 files changed

+75
-9
lines changed

2 files changed

+75
-9
lines changed

Sources/StructuredQueriesMacros/TableMacro.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,15 @@ extension TableMacro: ExtensionMacro {
7070
}
7171
if declaration.is(EnumDeclSyntax.self), !declaration.hasMacroApplication("CasePathable") {
7272
var newAttributes: AttributeListSyntax = declaration.attributes
73-
newAttributes.append(
73+
newAttributes.insert(
7474
.attribute(
7575
AttributeSyntax(
76-
leadingTrivia: Trivia.space,
7776
atSign: .atSignToken(),
78-
attributeName: IdentifierTypeSyntax(name: "CasePathable")
77+
attributeName: IdentifierTypeSyntax(name: "CasePathable"),
78+
trailingTrivia: .space
7979
)
80-
)
80+
),
81+
at: newAttributes.startIndex
8182
)
8283
context.diagnose(
8384
Diagnostic(

Tests/StructuredQueriesMacrosTests/TableMacroTests.swift

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2445,7 +2445,7 @@ extension SnapshotTests {
24452445
"""
24462446
} fixes: {
24472447
"""
2448-
@Table @CasePathable
2448+
@CasePathable @Table
24492449
enum Post {
24502450
case photo(Photo)
24512451
case note(String = "")
@@ -2547,18 +2547,83 @@ extension SnapshotTests {
25472547
"""
25482548
} fixes: {
25492549
"""
2550-
@Table @CasePathableenum Post {
2550+
@CasePathable @Table enum Post {
25512551
case photo(Photo)
25522552
case note(String = "")
25532553
}
25542554
"""
25552555
} expansion: {
2556-
"""
2557-
@Table @CasePathableenum Post {
2556+
#"""
2557+
@CasePathable enum Post {
25582558
case photo(Photo)
25592559
case note(String = "")
2560+
2561+
public nonisolated struct TableColumns: StructuredQueriesCore.TableDefinition {
2562+
public typealias QueryValue = Post
2563+
public let photo = StructuredQueriesCore._TableColumn<QueryValue, Photo?>.for("photo", keyPath: \QueryValue.photo)
2564+
public let note = StructuredQueriesCore._TableColumn<QueryValue, String?>.for("note", keyPath: \QueryValue.note, default: "")
2565+
public static var allColumns: [any StructuredQueriesCore.TableColumnExpression] {
2566+
var allColumns: [any StructuredQueriesCore.TableColumnExpression] = []
2567+
allColumns.append(contentsOf: QueryValue.columns.photo._allColumns)
2568+
allColumns.append(contentsOf: QueryValue.columns.note._allColumns)
2569+
return allColumns
2570+
}
2571+
public static var writableColumns: [any StructuredQueriesCore.WritableTableColumnExpression] {
2572+
var writableColumns: [any StructuredQueriesCore.WritableTableColumnExpression] = []
2573+
writableColumns.append(contentsOf: QueryValue.columns.photo._writableColumns)
2574+
writableColumns.append(contentsOf: QueryValue.columns.note._writableColumns)
2575+
return writableColumns
2576+
}
2577+
public var queryFragment: QueryFragment {
2578+
"\(self.photo), \(self.note)"
2579+
}
2580+
}
2581+
2582+
public struct Selection: StructuredQueriesCore.TableExpression {
2583+
public typealias QueryValue = Post
2584+
public let allColumns: [any StructuredQueriesCore.QueryExpression]
2585+
public static func photo(
2586+
_ photo: some StructuredQueriesCore.QueryExpression<Photo>
2587+
) -> Self {
2588+
var allColumns: [any StructuredQueriesCore.QueryExpression] = []
2589+
allColumns.append(contentsOf: photo._allColumns)
2590+
allColumns.append(contentsOf: Photo?(queryOutput: nil)._allColumns)
2591+
return Self(allColumns: allColumns)
2592+
}
2593+
public static func note(
2594+
_ note: some StructuredQueriesCore.QueryExpression<String>
2595+
) -> Self {
2596+
var allColumns: [any StructuredQueriesCore.QueryExpression] = []
2597+
allColumns.append(contentsOf: String?(queryOutput: nil)._allColumns)
2598+
allColumns.append(contentsOf: note._allColumns)
2599+
return Self(allColumns: allColumns)
2600+
}
2601+
}
25602602
}
2561-
"""
2603+
2604+
nonisolated extension Post: StructuredQueriesCore.Table, StructuredQueriesCore.PartialSelectStatement {
2605+
public typealias QueryValue = Self
2606+
public typealias From = Swift.Never
2607+
public nonisolated static var columns: TableColumns {
2608+
TableColumns()
2609+
}
2610+
public nonisolated static var _columnWidth: Int {
2611+
[Photo._columnWidth, String._columnWidth].reduce(0, +)
2612+
}
2613+
public nonisolated static var tableName: String {
2614+
"posts"
2615+
}
2616+
public nonisolated init(decoder: inout some StructuredQueriesCore.QueryDecoder) throws {
2617+
if let photo = try decoder.decode(Photo.self) {
2618+
self = .photo(photo)
2619+
} else if let note = try decoder.decode(String.self) {
2620+
self = .note(note)
2621+
} else {
2622+
throw StructuredQueriesCore.QueryDecodingError.missingRequiredColumn
2623+
}
2624+
}
2625+
}
2626+
"""#
25622627
}
25632628
}
25642629

0 commit comments

Comments
 (0)