Skip to content

Commit dfb6fb0

Browse files
committed
add EInt, remove EBool as it's incompatible with swift-mustache
1 parent 9fc7b1c commit dfb6fb0

File tree

12 files changed

+287
-57
lines changed

12 files changed

+287
-57
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
extension Bool {
2+
init(_ string: EString) {
3+
switch string.lowercased() {
4+
case "true", "1", "yes", "y", "on", "":
5+
self = true
6+
default:
7+
self = false
8+
}
9+
}
10+
}

Sources/EnumeratorMacroImpl/Types/EArray.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ extension EArray: EMustacheTransformable {
8080
return EArray<EKeyValue>(underlying: split)
8181
default:
8282
if let keyValues = self as? EArray<EKeyValue> {
83-
let value = keyValues.first(where: { $0.key == name })?.value
84-
return EOptional(value)
83+
return keyValues.underlying.first(named: EString(name))
8584
}
8685
RenderingContext.current.addOrReplaceDiagnostic(
8786
.invalidTransform(

Sources/EnumeratorMacroImpl/Types/EBool.swift

Lines changed: 0 additions & 33 deletions
This file was deleted.

Sources/EnumeratorMacroImpl/Types/ECase.swift

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import SwiftDiagnostics
22
import SwiftSyntax
3+
import Foundation
34
import Mustache
45

56
struct ECase {
6-
let index: Int
7+
let index: EInt
78
let name: EString
89
let parameters: EParameters
910
let comments: EArray<EString>
1011

1112
init(index: Int, from element: EnumCaseElementSyntax) throws {
12-
self.index = index
13+
self.index = .init(index)
1314
self.name = .init(element.name.trimmedDescription)
1415
let parameters = element.parameterClause?.parameters ?? []
1516
self.parameters = .init(
@@ -20,8 +21,23 @@ struct ECase {
2021
.replacingOccurrences(of: "///", with: "") /// remove comment signs
2122
.replacingOccurrences(of: "//", with: "") /// remove comment signs
2223
.split(separator: ";") /// separator of parameters
24+
.map {
25+
$0.trimmingCharacters(in: .whitespaces)
26+
}
2327

24-
self.comments = .init(underlying: keyValueParts.map(EString.init))
28+
self.comments = .init(underlying: keyValueParts.map(EString.init(stringLiteral:)))
29+
}
30+
31+
init(
32+
index: Int,
33+
name: EString,
34+
parameters: EParameters,
35+
comments: [EString]
36+
) {
37+
self.index = EInt(index)
38+
self.name = name
39+
self.parameters = parameters
40+
self.comments = .init(underlying: comments)
2541
}
2642
}
2743

Sources/EnumeratorMacroImpl/Types/ECases.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import SwiftSyntax
44
struct ECases {
55
fileprivate let underlying: EArray<ECase>
66

7+
init(underlying: [ECase]) {
8+
self.underlying = .init(underlying: underlying)
9+
}
10+
711
init(elements: [EnumCaseElementSyntax]) throws {
812
self.underlying = .init(
913
underlying: try elements.enumerated().map { idx, element in
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import Mustache
2+
3+
struct EInt {
4+
static var normalizedTypeName: String {
5+
"Int"
6+
}
7+
8+
var underlying: Int
9+
10+
init(_ underlying: Int) {
11+
self.underlying = underlying
12+
}
13+
}
14+
15+
extension EInt: CustomStringConvertible {
16+
var description: String {
17+
self.underlying.description
18+
}
19+
}
20+
21+
extension EInt: CustomReflectable {
22+
var customMirror: Mirror {
23+
self.underlying.customMirror
24+
}
25+
}
26+
27+
extension EInt: Comparable {
28+
static func < (lhs: EInt, rhs: EInt) -> Bool {
29+
lhs.underlying < rhs.underlying
30+
}
31+
}
32+
33+
extension EInt: EMustacheTransformable {
34+
func transform(_ name: String) -> Any? {
35+
switch name {
36+
case "equalZero":
37+
return self.underlying == 0
38+
case "plusOne":
39+
return EInt(self.underlying + 1)
40+
case "minusOne":
41+
return EInt(self.underlying - 1)
42+
case "even":
43+
return (self.underlying & 1) == 0
44+
case "odd":
45+
return (self.underlying & 1) == 1
46+
default:
47+
RenderingContext.current.addOrReplaceDiagnostic(
48+
.invalidTransform(
49+
transform: name,
50+
normalizedTypeName: Self.normalizedTypeName
51+
)
52+
)
53+
return nil
54+
}
55+
}
56+
}

Sources/EnumeratorMacroImpl/Types/EKeyValue.swift

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ extension EKeyValue: EMustacheTransformable {
3838
case "key":
3939
return self.key
4040
case "value":
41-
return self.value
41+
return Value(base: self)
4242
default:
4343
RenderingContext.current.addOrReplaceDiagnostic(
4444
.invalidTransform(
@@ -50,3 +50,79 @@ extension EKeyValue: EMustacheTransformable {
5050
}
5151
}
5252
}
53+
54+
extension EKeyValue {
55+
struct Value {
56+
fileprivate let base: EKeyValue?
57+
58+
init(base: EKeyValue?) {
59+
self.base = base
60+
}
61+
}
62+
}
63+
64+
extension [EKeyValue] {
65+
func first(named name: EString) -> EKeyValue.Value {
66+
EKeyValue.Value(
67+
base: self.first(where: { $0.key == name })
68+
)
69+
}
70+
}
71+
72+
extension EKeyValue.Value: CustomStringConvertible {
73+
var description: String {
74+
String(describing: self.base?.value)
75+
}
76+
}
77+
78+
extension EKeyValue.Value: WithNormalizedTypeName {
79+
static var normalizedTypeName: String {
80+
"KeyValue<String, String>.Value"
81+
}
82+
}
83+
84+
extension EKeyValue.Value: Comparable {
85+
static func < (lhs: EKeyValue.Value, rhs: EKeyValue.Value) -> Bool {
86+
EOptional(lhs.base?.value) < EOptional(rhs.base?.value)
87+
}
88+
89+
static func == (lhs: EKeyValue.Value, rhs: EKeyValue.Value) -> Bool {
90+
lhs.base?.value == rhs.base?.value
91+
}
92+
}
93+
94+
extension EKeyValue.Value: EMustacheTransformable {
95+
func transform(_ name: String) -> Any? {
96+
switch self.base {
97+
case .none:
98+
switch name {
99+
case "exists":
100+
return false
101+
case "empty":
102+
return true
103+
case "bool":
104+
return false
105+
default:
106+
RenderingContext.current.addOrReplaceDiagnostic(
107+
.invalidTransform(
108+
transform: name,
109+
normalizedTypeName: Self.normalizedTypeName
110+
)
111+
)
112+
return nil
113+
}
114+
case let .some(keyValue):
115+
let value = keyValue.value
116+
switch name {
117+
case "exists":
118+
return true
119+
case "empty":
120+
return value.isEmpty
121+
case "bool":
122+
return Bool(value)
123+
default:
124+
return value.transform(name)
125+
}
126+
}
127+
}
128+
}

Sources/EnumeratorMacroImpl/Types/EParameter.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ import SwiftSyntax
33
struct EParameter {
44
let name: EOptional<EString>
55
let type: EString
6-
let isOptional: EBool
6+
let isOptional: Bool
77

88
init(parameter: EnumCaseParameterSyntax) {
99
let parameterName = parameter.secondName ?? parameter.firstName
1010
self.name = .init(parameterName.map { .init($0.trimmedDescription) })
1111
self.type = .init(parameter.type.trimmedDescription)
12-
self.isOptional = EBool(parameter.type.isOptional)
12+
self.isOptional = parameter.type.isOptional
1313
}
1414

1515
init(name: EString?, type: EString, isOptional: Bool = false) {
1616
self.name = .init(name)
1717
self.type = type
18-
self.isOptional = EBool(isOptional)
18+
self.isOptional = isOptional
1919
}
2020
}
2121

Sources/EnumeratorMacroImpl/Types/EParameters.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ extension EParameters: EMustacheTransformable {
4747
let types = self.map(\.type)
4848
let array = EArray(underlying: types)
4949
return array
50-
case "isOptionals":
51-
let types = self.map(\.isOptional)
52-
let array = EArray(underlying: types)
53-
return array
50+
// case "isOptionals":
51+
// let types = self.map(\.isOptional)
52+
// let array = EArray(underlying: types)
53+
// return array
5454
case "namesAndTypes":
5555
let namesAndTypes = self
5656
.enumerated()

Sources/EnumeratorMacroImpl/Types/EString.swift

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,7 @@ extension EString: EMustacheTransformable {
5050
case "withParens":
5151
return self.isEmpty ? self : "(\(self))"
5252
case "bool":
53-
switch self.lowercased() {
54-
case "true", "1", "yes", "y", "on", "":
55-
return true
56-
default:
57-
return false
58-
}
53+
return Bool(self)
5954
case "keyValue":
6055
let split = self.split(
6156
separator: ":",

Tests/EnumeratorMacroTests/EParameterTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ final class EParameterTests: XCTestCase {
1616

1717
XCTAssertEqual(parameter.name.toOptional()?.underlying, name)
1818
XCTAssertEqual(parameter.type.underlying, type)
19-
XCTAssertEqual(parameter.isOptional.underlying, false)
19+
XCTAssertEqual(parameter.isOptional, false)
2020
}
2121

2222
func testParameterWithSecondName() throws {
@@ -31,7 +31,7 @@ final class EParameterTests: XCTestCase {
3131

3232
XCTAssertEqual(parameter.name.toOptional()?.underlying, secondName)
3333
XCTAssertEqual(parameter.type.underlying, type)
34-
XCTAssertEqual(parameter.isOptional.underlying, false)
34+
XCTAssertEqual(parameter.isOptional, false)
3535
}
3636

3737
func testParameterWithOptionalType() throws {
@@ -45,7 +45,7 @@ final class EParameterTests: XCTestCase {
4545

4646
XCTAssertEqual(parameter.name.toOptional()?.underlying, name)
4747
XCTAssertEqual(parameter.type.underlying, type)
48-
XCTAssertEqual(parameter.isOptional.underlying, true)
48+
XCTAssertEqual(parameter.isOptional, true)
4949
}
5050

5151
func testParameterWithImplicitlyOptionalType() throws {
@@ -59,7 +59,7 @@ final class EParameterTests: XCTestCase {
5959

6060
XCTAssertEqual(parameter.name.toOptional()?.underlying, name)
6161
XCTAssertEqual(parameter.type.underlying, type)
62-
XCTAssertEqual(parameter.isOptional.underlying, true)
62+
XCTAssertEqual(parameter.isOptional, true)
6363
}
6464

6565
func testParameterWithSpelledOutOptionalType() throws {
@@ -73,7 +73,7 @@ final class EParameterTests: XCTestCase {
7373

7474
XCTAssertEqual(parameter.name.toOptional()?.underlying, name)
7575
XCTAssertEqual(parameter.type.underlying, type)
76-
XCTAssertEqual(parameter.isOptional.underlying, true)
76+
XCTAssertEqual(parameter.isOptional, true)
7777
}
7878

7979
private func makeParameter(

0 commit comments

Comments
 (0)