diff --git a/Sources/EnumeratorMacroImpl/Types/EArray.swift b/Sources/EnumeratorMacroImpl/Types/EArray.swift index 5a86ec0..3751f10 100644 --- a/Sources/EnumeratorMacroImpl/Types/EArray.swift +++ b/Sources/EnumeratorMacroImpl/Types/EArray.swift @@ -49,7 +49,7 @@ extension EArray: EMustacheTransformable { return EOptionalsArray(underlying: self.reversed().map { $0 }) case "count": return self.underlying.count - case "empty": + case "isEmpty": return self.underlying.isEmpty case "joined": let joined = self.underlying @@ -79,7 +79,9 @@ extension EArray: EMustacheTransformable { default: if let keyValues = self as? EArray { /// Don't throw even if the key doesn't exist. - return keyValues.underlying.first(named: EString(name)) + return EOptional( + keyValues.underlying.first(where: { $0.key.underlying == name })?.value + ) } if let comparable = self as? EComparableSequence { /// The underlying type is in charge of adding a diagnostic, if needed. diff --git a/Sources/EnumeratorMacroImpl/Types/EKeyValue.swift b/Sources/EnumeratorMacroImpl/Types/EKeyValue.swift index 6ef13f7..4a4a1a4 100644 --- a/Sources/EnumeratorMacroImpl/Types/EKeyValue.swift +++ b/Sources/EnumeratorMacroImpl/Types/EKeyValue.swift @@ -38,7 +38,7 @@ extension EKeyValue: EMustacheTransformable { case "key": return self.key case "value": - return Value(base: self) + return self.value default: RenderingContext.current.addOrReplaceDiagnostic( .invalidTransform( @@ -50,87 +50,3 @@ extension EKeyValue: EMustacheTransformable { } } } - -extension EKeyValue { - struct Value { - fileprivate let base: EOptional - - init(base: EKeyValue?) { - self.base = .init(base) - } - } -} - -extension [EKeyValue] { - func first(named name: EString) -> EKeyValue.Value { - EKeyValue.Value( - base: self.first(where: { $0.key == name }) - ) - } -} - -extension [EOptional] { - func first(named name: EString) -> EKeyValue.Value { - EKeyValue.Value( - base: self.first(where: { $0.toOptional()?.key == .some(name) })?.toOptional() - ) - } -} - -extension EKeyValue.Value: CustomStringConvertible { - var description: String { - String(describing: self.base.map(\.value)) - } -} - -extension EKeyValue.Value: WithNormalizedTypeName { - static var normalizedTypeName: String { - "KeyValue.Value" - } -} - -extension EKeyValue.Value: Comparable { - static func < (lhs: EKeyValue.Value, rhs: EKeyValue.Value) -> Bool { - lhs.base.map(\.value) < rhs.base.map(\.value) - } - - static func == (lhs: EKeyValue.Value, rhs: EKeyValue.Value) -> Bool { - lhs.base.map(\.value) == rhs.base.map(\.value) - } -} - -extension EKeyValue.Value: EMustacheTransformable { - func transform(_ name: String) -> Any? { - switch self.base { - case .none: - switch name { - case "exists": - return false - case "empty": - return true - case "bool": - return false - default: - RenderingContext.current.addOrReplaceDiagnostic( - .invalidTransform( - transform: name, - normalizedTypeName: Self.normalizedTypeName - ) - ) - return nil - } - case let .some(keyValue): - let value = keyValue.value - switch name { - case "exists": - return true - case "empty": - return value.isEmpty - case "bool": - return Bool(value) - default: - return value.transform(name) - } - } - } -} diff --git a/Sources/EnumeratorMacroImpl/Types/EOptional.swift b/Sources/EnumeratorMacroImpl/Types/EOptional.swift index 1405959..0c072e3 100644 --- a/Sources/EnumeratorMacroImpl/Types/EOptional.swift +++ b/Sources/EnumeratorMacroImpl/Types/EOptional.swift @@ -110,7 +110,7 @@ extension EOptional: EMustacheTransformable { switch self { case .none: switch name { - case "empty": + case "isEmpty": return true case "bool": return false diff --git a/Sources/EnumeratorMacroImpl/Types/EOptionalsArray.swift b/Sources/EnumeratorMacroImpl/Types/EOptionalsArray.swift index 5f27b54..f249014 100644 --- a/Sources/EnumeratorMacroImpl/Types/EOptionalsArray.swift +++ b/Sources/EnumeratorMacroImpl/Types/EOptionalsArray.swift @@ -52,7 +52,7 @@ extension EOptionalsArray: EMustacheTransformable { return EOptionalsArray(underlying: self.reversed().map { $0 }) case "count": return self.underlying.count - case "empty": + case "isEmpty": return self.underlying.isEmpty case "joined": let joined = self.underlying @@ -83,7 +83,12 @@ extension EOptionalsArray: EMustacheTransformable { default: if let keyValues = self as? EOptionalsArray { /// Don't throw even if the key doesn't exist. - return keyValues.underlying.first(named: EString(name)) + switch keyValues.underlying.first(where: { $0.toOptional()?.key.underlying == name }) { + case let .some(wrapped): + return wrapped.map(\.value) + case nil: + return EOptional.none + } } if let comparable = self as? EComparableSequence { /// The underlying type is in charge of adding a diagnostic, if needed. diff --git a/Sources/EnumeratorMacroImpl/Types/EString.swift b/Sources/EnumeratorMacroImpl/Types/EString.swift index 4d38d42..7d0e4ec 100644 --- a/Sources/EnumeratorMacroImpl/Types/EString.swift +++ b/Sources/EnumeratorMacroImpl/Types/EString.swift @@ -29,7 +29,7 @@ extension EString: CustomReflectable { extension EString: EMustacheTransformable { func transform(_ name: String) -> Any? { switch name { - case "empty": + case "isEmpty": return self.isEmpty case "capitalized": if self.isEmpty || self[self.startIndex].isUppercase { diff --git a/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift b/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift index 79c82fa..76e3a30 100644 --- a/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift +++ b/Tests/EnumeratorMacroTests/EnumeratorMacroTests.swift @@ -195,7 +195,7 @@ final class EnumeratorMacroTests: XCTestCase { #""" @Enumerator(""" {{#cases}} - {{^empty(parameters)}} + {{^isEmpty(parameters)}} func get{{capitalized(name)}}() -> ({{joined(tupleValue(parameters))}})? { switch self { case let .{{name}}{{withParens(joined(names(parameters)))}}: @@ -204,7 +204,7 @@ final class EnumeratorMacroTests: XCTestCase { return nil } } - {{/empty(parameters)}} + {{/isEmpty(parameters)}} {{/cases}} """) enum TestEnum { diff --git a/Tests/EnumeratorMacroTests/TransformTests.swift b/Tests/EnumeratorMacroTests/TransformTests.swift index ecaf08b..006afec 100644 --- a/Tests/EnumeratorMacroTests/TransformTests.swift +++ b/Tests/EnumeratorMacroTests/TransformTests.swift @@ -5,7 +5,7 @@ import XCTest final class TransformTests: XCTestCase { func testCommentsValueIsEmptyBecauseDoesNotExist() throws { do { - let template = "{{empty(custom_params(keyValues(comments)))}}" + let template = "{{isEmpty(custom_params(keyValues(comments)))}}" let render = try MustacheTemplate( string: "{{%CONTENT_TYPE:TEXT}}\n" + template ).render( @@ -27,7 +27,7 @@ final class TransformTests: XCTestCase { func testCommentsValueIsEmptyButExists() throws { do { - let template = "{{empty(custom_params(keyValues(comments)))}}" + let template = "{{isEmpty(custom_params(keyValues(comments)))}}" let render = try MustacheTemplate( string: "{{%CONTENT_TYPE:TEXT}}\n" + template ).render(