@@ -54,17 +54,31 @@ extension DiscriminatedUnionMacro: MemberMacro {
54
54
55
55
let unvalidatedPropertyDecl = try instance. declareDiscriminantProperty ( )
56
56
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 ( ) )
57
62
58
63
return try [
59
64
DeclSyntax ( validating: " \( raw: discriminantDecl) " ) ,
60
- validatedPropertyDecl
61
- ]
65
+ validatedPropertyDecl,
66
+ validatedExtractorError
67
+ ] + validatedExtractors
62
68
}
63
69
64
70
enum Error : Swift . Error {
65
71
case attemptPrint( String )
66
72
}
67
73
74
+ static func extractorErrorDecl( ) -> DeclSyntax {
75
+ """
76
+ public enum ExtractorError: Swift.Error {
77
+ case invalidExtraction
78
+ }
79
+ """
80
+ }
81
+
68
82
func declareDiscriminantType( ) throws -> EnumDeclSyntax {
69
83
return try EnumDeclSyntax ( " public enum Discriminant: DiscriminantType " ) {
70
84
@@ -133,16 +147,16 @@ extension DiscriminatedUnionMacro: MemberMacro {
133
147
}
134
148
135
149
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())"
137
151
return """
138
152
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
145
158
}
159
+ }
146
160
147
161
"""
148
162
}
0 commit comments