@@ -30,67 +30,96 @@ public enum OptionalCopy<T> {
30
30
}
31
31
}
32
32
33
+ {% macro funcParameter type property isLast %}
34
+ {% ifnot property.isOptional %}
35
+ {{ property.name }}: {{ property.typeName }}? = nil{% ifnot isLast %}, {% endif %}
36
+ {% else %}
37
+ {{ property.name }}: {{ type.name }}OptionalCopy<{{ property.typeName.unwrappedTypeName }}> = .noChange{% ifnot isLast %}, {% endif %}
38
+ {% endif %}
39
+ {% endmacro %}
40
+
41
+ {% macro initParameter type property isLast %}
42
+ {% ifnot property.isOptional %}
43
+ {{ property.name }}: {{ property.name }} ?? self.{{ property.name }}{% ifnot isLast %}, {% endif %}
44
+ {% else %}
45
+ {{ property.name }}: {{ property.name }}.update(using: self.{{ property.name }}){% ifnot isLast %}, {% endif %}
46
+ {% endif %}
47
+ {% endmacro %}
48
+
49
+ {% macro iterate type generate %}
50
+ {% if type.allMethods|initializer|count == 0 %}
51
+ {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" and property.defaultValue == nil %}
52
+ {% call generate type property forloop.last %}
53
+ {% endfor %}
54
+ {% endif %}
55
+
56
+ {% for initializer in type.allMethods|initializer %}
57
+ {% for parameter in initializer.parameters %}
58
+ {% call generate type parameter forloop.last %}
59
+ {% endfor %}
60
+ {% endfor %}
61
+ {% endmacro %}
62
+
33
63
import SwiftUI
34
64
35
65
{% for type in types.based.Copyable %}
36
66
{% if type.variables.count > 0 %}
37
67
{% call includeImports type %}
38
-
68
+
39
69
// MARK: {{ type.name }} - Copy
40
70
41
71
extension {{ type.name }} {
42
72
public typealias {{ type.name }}OptionalCopy<T> = OptionalCopy<T>
43
73
44
74
public func copy(
45
- {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" and property.defaultValue == nil %}
46
-
47
- {% ifnot property.isOptional %}
48
- {{ property.name }}: {{ property.typeName }}? = nil{% ifnot forloop.last %}, {% endif %}
49
- {% else %}
50
- {{ property.name }}: {{ type.name }}OptionalCopy<{{ property.typeName.unwrappedTypeName }}> = .noChange{% ifnot forloop.last %}, {% endif %}
51
- {% endif %}
52
- {% endfor %}
75
+ {% call iterate type funcParameter %}
53
76
) -> {{ type.name }} {
54
77
return {{ type.name }}(
55
- {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" and property.defaultValue == nil %}
56
- {% ifnot property.isOptional %}
57
- {{ property.name }}: {{ property.name }} ?? self.{{ property.name }}{% ifnot forloop.last %}, {% endif %}
58
- {% else %}
59
- {{ property.name }}: {{ property.name }}.update(using: self.{{ property.name }}){% ifnot forloop.last %}, {% endif %}
60
- {% endif %}
61
- {% endfor %}
78
+ {% call iterate type initParameter %}
62
79
)
63
80
}
64
81
}
65
82
83
+ {% macro privateValueCheck type property isLast %}
84
+ {% if property.isOptional %}
85
+ true {% ifnot forloop.last %} &&{% endif %} // optional '{{ property.name }}' not required to check
86
+ {% else %}
87
+ _{{ property.name }} != nil {% ifnot forloop.last %} &&{% endif %}
88
+ {% endif %}
89
+ {% endmacro %}
90
+
91
+ {% macro privateInitAssignment type property isLast %}
92
+ {{ property.name }}: _{{ property.name }}{% ifnot forloop.last %}, {% endif %}
93
+ {% endmacro %}
94
+
66
95
// MARK: {{ type.name }} - Builder
67
96
68
- extension {{ type.name }} {
69
- final class Builder: ObservableObject {
70
- let objectDidChange = PassthroughSubject<Void, Never>()
71
-
72
- {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" and property.defaultValue == nil %}
97
+ {% macro builderSetter type property isLast %}
73
98
private var _{{ property.name }}: {{ property.typeName }}{% ifnot property.isOptional %}!{% endif %} {
74
99
willSet { objectWillChange.send() }
75
100
didSet { objectDidChange.send() }
76
101
}
77
-
102
+
78
103
var {{ property.name }}: {{ property.typeName }}{% ifnot property.isOptional %}?{% endif %} {
79
104
get { _{{ property.name }} }
80
105
set { _{{ property.name }} = newValue }
81
106
}
82
-
107
+
83
108
@discardableResult
84
109
func with({{ property.name }}: {{ property.typeName }}) -> Self {
85
110
_{{ property.name }} = {{ property.name }}
86
111
return self
87
112
}
88
- {% endfor %}
113
+ {% endmacro %}
114
+
115
+ extension {{ type.name }} {
116
+ final class Builder: ObservableObject {
117
+ let objectDidChange = PassthroughSubject<Void, Never>()
118
+
119
+ {% call iterate type builderSetter %}
89
120
90
121
func readyToBuild() -> Bool {
91
- {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" and property.defaultValue == nil and property.isOptional == false %}
92
- _{{ property.name }} != nil{% ifnot forloop.last %} &&{% endif %}
93
- {% endfor %}
122
+ {% call iterate type privateValueCheck %}
94
123
}
95
124
96
125
func buildSafely() throws -> {{ type.name }} {
@@ -103,9 +132,7 @@ extension {{ type.name }} {
103
132
104
133
func build() -> {{ type.name }} {
105
134
{{ type.name }}(
106
- {%- for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" and property.defaultValue == nil %}
107
- {{ property.name }}: _{{ property.name }}{% ifnot forloop.last %}, {% endif %}
108
- {% endfor -%}
135
+ {% call iterate type privateInitAssignment %}
109
136
)
110
137
}
111
138
}
@@ -115,31 +142,23 @@ extension {{ type.name }} {
115
142
116
143
import Combine
117
144
118
- {% macro assignProperties type source %}
119
- {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" %}
120
- _{{ property.name }} = {{ source }}.{{ property.name }}
121
- {% endfor %}
145
+ {% macro privateAssignment type property isLast %}
146
+ {{ property.name }}: _{{ property.name }}{% ifnot forloop.last %}, {% endif %}
122
147
{% endmacro %}
123
148
124
- extension {{ type.name }} {
125
-
126
- protocol Changeable: ObservableObject {
127
- {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" %}
149
+ {% macro protocolMembers type property isLast %}
128
150
var {{ property.name }}: {{ property.typeName }} { get set }
129
- {% endfor %}
130
- }
131
-
132
- func updater() -> Updater {
133
- .init({{ type.name|lowerFirstLetter }}: self)
134
- }
151
+ {% endmacro %}
135
152
136
- final class Updater: Changeable {
137
- private let initial: {{ type.name }}
138
- private var notifyUpdates = true
139
-
140
- let objectDidChange = PassthroughSubject<Void, Never>()
141
-
142
- {% for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" %}
153
+ {% macro sourceAssignment type property isLast %}
154
+ _{{ property.name }} = {{ type.name|lowerFirstLetter }}.{{ property.name }}
155
+ {% endmacro %}
156
+
157
+ {% macro assignProperties type %}
158
+ {% call iterate type sourceAssignment %}
159
+ {% endmacro %}
160
+
161
+ {% macro updaterSetter type property isLast %}
143
162
private var _{{ property.name }}: {{ property.typeName }} {
144
163
willSet { if notifyUpdates { objectWillChange.send() } }
145
164
didSet { if notifyUpdates { objectDidChange.send() } }
@@ -155,11 +174,29 @@ extension {{ type.name }} {
155
174
_{{ property.name }} = {{ property.name }}
156
175
return self
157
176
}
158
- {% endfor %}
177
+ {% endmacro %}
178
+
179
+ extension {{ type.name }} {
180
+
181
+ protocol Changeable: ObservableObject {
182
+ {% call iterate type protocolMembers %}
183
+ }
184
+
185
+ func updater() -> Updater {
186
+ .init({{ type.name|lowerFirstLetter }}: self)
187
+ }
188
+
189
+ final class Updater: Changeable {
190
+ private let initial: {{ type.name }}
191
+ private var notifyUpdates = true
192
+
193
+ let objectDidChange = PassthroughSubject<Void, Never>()
194
+
195
+ {% call iterate type updaterSetter %}
159
196
160
197
init({{ type.name|lowerFirstLetter }}: {{ type.name }}) {
161
198
self.initial = {{ type.name|lowerFirstLetter }}
162
- {% call assignProperties type type.name|lowerFirstLetter %}
199
+ {% call assignProperties type %}
163
200
}
164
201
165
202
{% if type.based.Equatable %}
@@ -172,7 +209,7 @@ extension {{ type.name }} {
172
209
notifyUpdates = false
173
210
objectWillChange.send()
174
211
175
- {% call assignProperties type type.name|lowerFirstLetter %}
212
+ {% call assignProperties type %}
176
213
177
214
notifyUpdates = true
178
215
objectDidChange.send()
@@ -184,9 +221,7 @@ extension {{ type.name }} {
184
221
185
222
func build() -> {{ type.name }} {
186
223
{{ type.name }}(
187
- {%- for property in type.variables|instance|!computed where property.readAccess != "private" and property.readAccess != "fileprivate" %}
188
- {{ property.name }}: _{{ property.name }}{% ifnot forloop.last %}, {% endif %}
189
- {% endfor -%}
224
+ {% call iterate type privateInitAssignment %}
190
225
)
191
226
}
192
227
}
0 commit comments