diff --git a/Sources/Common/Support.swift b/Sources/Common/Support.swift index 616c1c7..58b9625 100644 --- a/Sources/Common/Support.swift +++ b/Sources/Common/Support.swift @@ -139,3 +139,5 @@ extension Result: CustomStringConvertible { #externalMacro(module: "Macros", type: "RequireErrorResult") @freestanding(expression) public macro UseOkResult(_: Result) -> T = #externalMacro(module: "Macros", type: "UseOkResult") +@freestanding(expression) public macro UseErrorResult(_: Result) -> Error = + #externalMacro(module: "Macros", type: "UseErrorResult") diff --git a/Sources/Macros/Macros.swift b/Sources/Macros/Macros.swift index bcf84b9..18ade3b 100644 --- a/Sources/Macros/Macros.swift +++ b/Sources/Macros/Macros.swift @@ -42,6 +42,29 @@ public struct UseOkResult: ExpressionMacro { } } +public struct UseErrorResult: ExpressionMacro { + public static func expansion( + of node: some FreestandingMacroExpansionSyntax, + in context: some MacroExpansionContext + ) throws -> ExprSyntax { + + guard let argument = node.argumentList.first?.expression else { + throw Require.Error.SyntaxError + } + + return """ + { + switch \(argument) { + case Result.Error(let __error): return __error + case Result.Ok(let __good): + print("Unexpected result: \\(__good)") + throw Require.Error.UnexpectedResult + } + }() + """ + } +} + public struct Require { public enum Error: Swift.Error { case UnexpectedResult @@ -101,6 +124,6 @@ public struct RequireErrorResult: ExpressionMacro { @main struct P4Macros: CompilerPlugin { var providingMacros: [Macro.Type] = [ - RequireResult.self, RequireErrorResult.self, UseOkResult.self, + RequireResult.self, RequireErrorResult.self, UseOkResult.self, UseErrorResult.self ] }