Skip to content

Commit ebde49d

Browse files
committed
does this work?
1 parent c232db4 commit ebde49d

File tree

3 files changed

+30
-11
lines changed

3 files changed

+30
-11
lines changed

Sources/DiscriminatedUnion/DiscriminatedUnion.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11

2+
@attached(
3+
extension,
4+
conformances: DiscriminatedUnion
5+
)
26
@attached(
37
member,
4-
names: named(Discriminant), named(discriminant), prefixed(associatedValueFor)
8+
names: arbitrary, named(Discriminant), named(discriminant), named(ExtractorError)
59
)
6-
@attached(extension, conformances: DiscriminatedUnion)
710
public macro discriminatedUnion() = #externalMacro(
811
module: "DiscriminatedUnionMacros",
912
type: "DiscriminatedUnionMacro")

Sources/DiscriminatedUnionClient/main.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ enum Pet {
88
case parrot(loud: Bool)
99
case snake
1010
case turtle(snapper: Bool)
11+
// case bird(name: String, Int)
12+
1113
}
1214

1315
Swift.print("usiyan::: Pet.Discriminant.dog == Pet.dog.discriminant: \(String(describing: Pet.Discriminant.dog == Pet.dog.discriminant))")

Sources/DiscriminatedUnionMacros/DiscriminatedUnionMacro.swift

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,31 @@ extension DiscriminatedUnionMacro: MemberMacro {
5454

5555
let unvalidatedPropertyDecl = try instance.declareDiscriminantProperty()
5656
let validatedPropertyDecl = try DeclSyntax(validating: unvalidatedPropertyDecl)
57+
let validatedExtractors = try instance.doSomethingSpecial().map {
58+
try DeclSyntax(validating: $0)
59+
}
60+
61+
let validatedExtractorError = try DeclSyntax(validating: extractorErrorDecl())
5762

5863
return try [
5964
DeclSyntax(validating: "\(raw: discriminantDecl)"),
60-
validatedPropertyDecl
61-
]
65+
validatedPropertyDecl,
66+
validatedExtractorError
67+
] + validatedExtractors
6268
}
6369

6470
enum Error: Swift.Error {
6571
case attemptPrint(String)
6672
}
6773

74+
static func extractorErrorDecl() -> DeclSyntax {
75+
"""
76+
public enum ExtractorError: Swift.Error {
77+
case invalidExtraction
78+
}
79+
"""
80+
}
81+
6882
func declareDiscriminantType() throws -> EnumDeclSyntax {
6983
return try EnumDeclSyntax("public enum Discriminant: DiscriminantType") {
7084

@@ -133,16 +147,16 @@ extension DiscriminatedUnionMacro: MemberMacro {
133147
}
134148

135149
let theSomethings: [DeclSyntax] = theCases.map { caseName, tupleType, pBindings, returnValue in
136-
let titleCasedName = "\(caseName.first!.uppercased())\(caseName.dropFirst())"
150+
// let titleCasedName = "\(caseName.first!.uppercased())\(caseName.dropFirst())"
137151
return """
138152
139-
public var associatedValueFor\(raw: titleCasedName): \(raw: tupleType) {
140-
if case .\(raw: caseName)(raw: \(raw: pBindings)) = self {
141-
return \(raw: returnValue)
142-
} else {
143-
return nil
144-
}
153+
public func \(raw: caseName)AssociatedValue() throws -> \(raw: tupleType) {
154+
if case .\(raw: caseName)(\(raw: pBindings)) = self {
155+
return \(raw: returnValue)
156+
} else {
157+
throw ExtractorError.invalidExtraction
145158
}
159+
}
146160
147161
"""
148162
}

0 commit comments

Comments
 (0)