@zio.dev/zio-blocks 0.0.33 → 0.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/guides/compile-time-resource-safety-with-scope.md +16 -17
- package/guides/getting-started-with-mux.md +1507 -0
- package/guides/query-dsl-extending.md +161 -102
- package/guides/query-dsl-fluent-builder.md +217 -157
- package/guides/query-dsl-reified-optics.md +12 -10
- package/guides/query-dsl-sql.md +246 -165
- package/guides/telemetry-guide.md +1069 -0
- package/guides/zio-schema-migration.md +29 -22
- package/index.md +292 -50
- package/package.json +1 -1
- package/plans/config-follow-up-prs.md +188 -0
- package/plans/config-pr-assessment-roadmap.md +310 -0
- package/reference/MuxDataFlow.jsx +250 -0
- package/reference/async.md +651 -0
- package/reference/chunk.md +3533 -308
- package/reference/codegen/case-class.md +436 -0
- package/reference/codegen/emitter-config.md +383 -0
- package/reference/codegen/examples.md +664 -0
- package/reference/codegen/field.md +316 -0
- package/reference/codegen/index.md +317 -0
- package/reference/codegen/scala-emitter.md +392 -0
- package/reference/codegen/scala-file.md +276 -0
- package/reference/codegen/sealed-trait.md +408 -0
- package/reference/codegen/type-definition.md +340 -0
- package/reference/codegen/type-ref.md +201 -0
- package/reference/combinators.md +347 -117
- package/reference/config.md +158 -0
- package/reference/context.md +4 -4
- package/reference/datastar.md +346 -0
- package/reference/docs.md +1461 -345
- package/reference/endpoint/auth-type.md +146 -0
- package/reference/endpoint/endpoint.md +297 -0
- package/reference/endpoint/http-codec.md +249 -0
- package/reference/endpoint/index.md +825 -0
- package/reference/endpoint/path-codec.md +237 -0
- package/reference/endpoint/route-pattern.md +196 -0
- package/reference/endpoint/route-tree.md +111 -0
- package/reference/endpoint/segment-codec.md +212 -0
- package/reference/html.md +1120 -0
- package/reference/htmx/attribute-values.md +359 -0
- package/reference/htmx/hx-encoding.md +111 -0
- package/reference/htmx/hx-params.md +204 -0
- package/reference/htmx/hx-swap.md +276 -0
- package/reference/htmx/hx-sync.md +251 -0
- package/reference/htmx/hx-target.md +314 -0
- package/reference/htmx/hx-trigger.md +457 -0
- package/reference/htmx/hx-url-update.md +239 -0
- package/reference/htmx/index.md +855 -0
- package/reference/http-model/index.md +47 -0
- package/reference/http-model/model.md +1481 -0
- package/reference/http-model/schema.md +747 -0
- package/reference/maybe.md +826 -0
- package/reference/media-type.md +2 -2
- package/reference/mux.mdx +823 -0
- package/reference/openapi.md +1351 -0
- package/reference/resource-management/defer-handle.md +1 -1
- package/reference/resource-management/resource.md +31 -2
- package/reference/resource-management/scope.md +28 -12
- package/reference/resource-management/wire.md +3 -7
- package/reference/ringbuffer/MpmcDiagram.jsx +717 -0
- package/reference/ringbuffer/MpscDiagram.jsx +618 -0
- package/reference/ringbuffer/SpmcDiagram.jsx +680 -0
- package/reference/ringbuffer/SpscDiagram.jsx +677 -0
- package/reference/ringbuffer/advanced.mdx +109 -0
- package/reference/ringbuffer/index.mdx +145 -0
- package/reference/ringbuffer/mpmc.mdx +151 -0
- package/reference/ringbuffer/mpsc.mdx +132 -0
- package/reference/ringbuffer/spmc.mdx +108 -0
- package/reference/ringbuffer/spsc.mdx +344 -0
- package/reference/{allows.md → schema/allows.md} +4 -4
- package/reference/{binding-resolver.md → schema/binding-resolver.md} +1 -1
- package/reference/{binding.md → schema/binding.md} +2 -3
- package/reference/schema/built-in-codecs/avro.md +451 -0
- package/reference/schema/built-in-codecs/bson.md +480 -0
- package/reference/schema/built-in-codecs/csv.md +564 -0
- package/reference/schema/built-in-codecs/index.md +77 -0
- package/reference/schema/built-in-codecs/json/index.md +295 -0
- package/reference/schema/built-in-codecs/json/json-config.md +217 -0
- package/reference/{json-patch.md → schema/built-in-codecs/json/json-patch.md} +5 -5
- package/reference/{json-schema.md → schema/built-in-codecs/json/json-schema.md} +14 -47
- package/reference/schema/built-in-codecs/json/json-selection.md +322 -0
- package/reference/{json.md → schema/built-in-codecs/json/json.md} +32 -64
- package/reference/schema/built-in-codecs/messagepack.md +508 -0
- package/reference/schema/built-in-codecs/thrift.md +433 -0
- package/reference/schema/built-in-codecs/toon.md +1078 -0
- package/reference/{xml.md → schema/built-in-codecs/xml.md} +13 -9
- package/reference/schema/built-in-codecs/yaml.md +552 -0
- package/reference/{codec.md → schema/codec.md} +10 -10
- package/reference/{dynamic-optic.md → schema/dynamic-optic.md} +151 -5
- package/reference/{dynamic-schema.md → schema/dynamic-schema.md} +8 -8
- package/reference/schema/format.md +92 -0
- package/reference/schema/index.md +50 -0
- package/reference/schema/migration.md +297 -0
- package/reference/{modifier.md → schema/modifier.md} +58 -7
- package/reference/{optics.md → schema/optics.md} +2 -2
- package/reference/{patch.md → schema/patch.md} +1 -1
- package/{path-interpolator.md → reference/schema/path-interpolator.md} +165 -72
- package/reference/{schema-evolution → schema/schema-evolution}/as.md +8 -8
- package/reference/{schema-evolution → schema/schema-evolution}/index.md +2 -2
- package/reference/{schema-evolution → schema/schema-evolution}/into.md +8 -8
- package/reference/{schema-expr.md → schema/schema-expr.md} +110 -175
- package/reference/{schema.md → schema/schema.md} +12 -0
- package/reference/{structural-types.md → schema/structural-types.md} +1 -1
- package/reference/{type-class-derivation.md → schema/type-class-derivation.md} +63 -1
- package/reference/smithy.md +533 -0
- package/reference/sql/db-codec-deriver.md +71 -0
- package/reference/sql/db-codec.md +687 -0
- package/reference/sql/db-con.md +271 -0
- package/reference/sql/db-connection.md +153 -0
- package/reference/sql/db-param-writer.md +77 -0
- package/reference/sql/db-param.md +66 -0
- package/reference/sql/db-result-reader.md +146 -0
- package/reference/sql/db-tx.md +82 -0
- package/reference/sql/db-value.md +41 -0
- package/reference/sql/ddl.md +85 -0
- package/reference/sql/frag.md +254 -0
- package/reference/sql/index.md +341 -0
- package/reference/sql/repo.md +600 -0
- package/reference/sql/sql-dialect.md +73 -0
- package/reference/sql/sql-logger.md +62 -0
- package/reference/sql/sql-name-mapper.md +70 -0
- package/reference/sql/table-metadata.md +134 -0
- package/reference/sql/table.md +448 -0
- package/reference/sql/transactor-zio.md +399 -0
- package/reference/sql/transactor.md +353 -0
- package/reference/sql-zio.md +112 -0
- package/reference/streams/concurrent-operators.md +106 -0
- package/reference/streams/index.md +653 -0
- package/reference/streams/pipeline.md +718 -0
- package/reference/streams/reader.md +1284 -0
- package/reference/streams/scala-2-compatibility.md +55 -0
- package/reference/streams/sink.md +1426 -0
- package/reference/streams/stream.md +2526 -0
- package/reference/streams/writer.md +1045 -0
- package/reference/streams/zero-boxing.md +275 -0
- package/reference/telemetry.md +693 -0
- package/reference/typeid.md +5 -19
- package/sidebars.js +238 -43
- package/reference/formats.md +0 -694
- package/reference/http-model.md +0 -1716
- package/reference/streams.md +0 -989
- package/ringbuffer.md +0 -249
- /package/reference/{json-differ.md → schema/built-in-codecs/json/json-differ.md} +0 -0
- /package/reference/{dynamic-value.md → schema/dynamic-value.md} +0 -0
- /package/reference/{lazy.md → schema/lazy.md} +0 -0
- /package/reference/{reflect.md → schema/reflect.md} +0 -0
- /package/reference/{registers.md → schema/registers.md} +0 -0
- /package/reference/{schema-error.md → schema/schema-error.md} +0 -0
- /package/reference/{syntax.md → schema/syntax.md} +0 -0
- /package/reference/{validation.md → schema/validation.md} +0 -0
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: case-class
|
|
3
|
+
title: "CaseClass"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`CaseClass` represents an immutable case class in the IR. Use it when generating Scala code from data models, APIs, or structured data—it's the most frequently chosen type definition.
|
|
7
|
+
|
|
8
|
+
## Use Cases
|
|
9
|
+
|
|
10
|
+
- Modeling product types (records) from OpenAPI schemas, JSON Schema, or data formats
|
|
11
|
+
- Defining data transfer objects (DTOs) with named fields
|
|
12
|
+
- Creating immutable value types with automatic `equals`, `hashCode`, `copy`
|
|
13
|
+
|
|
14
|
+
## Construction
|
|
15
|
+
|
|
16
|
+
Build a case class with a name and field list:
|
|
17
|
+
|
|
18
|
+
```scala
|
|
19
|
+
import zio.blocks.codegen.ir._
|
|
20
|
+
|
|
21
|
+
val person = CaseClass(
|
|
22
|
+
name = "Person",
|
|
23
|
+
fields = List(
|
|
24
|
+
Field("id", TypeRef.Long),
|
|
25
|
+
Field("name", TypeRef.String),
|
|
26
|
+
Field("email", TypeRef.String)
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
With optional type parameters:
|
|
32
|
+
|
|
33
|
+
```scala
|
|
34
|
+
import zio.blocks.codegen.ir._
|
|
35
|
+
|
|
36
|
+
val box = CaseClass(
|
|
37
|
+
name = "Box",
|
|
38
|
+
fields = List(Field("value", TypeRef("T"))),
|
|
39
|
+
typeParams = List(TypeParam("T"))
|
|
40
|
+
)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
With derives clauses:
|
|
44
|
+
|
|
45
|
+
```scala
|
|
46
|
+
import zio.blocks.codegen.ir._
|
|
47
|
+
|
|
48
|
+
val user = CaseClass(
|
|
49
|
+
name = "User",
|
|
50
|
+
fields = List(
|
|
51
|
+
Field("id", TypeRef.Long),
|
|
52
|
+
Field("name", TypeRef.String)
|
|
53
|
+
),
|
|
54
|
+
derives = List("Show", "Eq", "Codec")
|
|
55
|
+
)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Key Operations
|
|
59
|
+
|
|
60
|
+
All `CaseClass` instances support these core operations:
|
|
61
|
+
|
|
62
|
+
### Accessing Components
|
|
63
|
+
|
|
64
|
+
Extract parts of a case class:
|
|
65
|
+
|
|
66
|
+
```scala
|
|
67
|
+
import zio.blocks.codegen.ir._
|
|
68
|
+
|
|
69
|
+
val person = CaseClass(
|
|
70
|
+
name = "Person",
|
|
71
|
+
fields = List(
|
|
72
|
+
Field("id", TypeRef.Long),
|
|
73
|
+
Field("name", TypeRef.String),
|
|
74
|
+
Field("email", TypeRef.String)
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Access each component by reading their properties:
|
|
80
|
+
|
|
81
|
+
```scala
|
|
82
|
+
import zio.blocks.codegen.ir._
|
|
83
|
+
|
|
84
|
+
val person = CaseClass(
|
|
85
|
+
name = "Person",
|
|
86
|
+
fields = List(
|
|
87
|
+
Field("id", TypeRef.Long),
|
|
88
|
+
Field("name", TypeRef.String),
|
|
89
|
+
Field("email", TypeRef.String)
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Each component can be accessed and displayed:
|
|
95
|
+
|
|
96
|
+
```scala
|
|
97
|
+
import zio.blocks.codegen.ir._
|
|
98
|
+
|
|
99
|
+
person.name // "Person"
|
|
100
|
+
// res4: String = "Person"
|
|
101
|
+
person.fields // List[Field]
|
|
102
|
+
// res5: List[Field] = List(
|
|
103
|
+
// Field(
|
|
104
|
+
// name = "id",
|
|
105
|
+
// typeRef = TypeRef(name = "Long", typeArgs = List()),
|
|
106
|
+
// defaultValue = None,
|
|
107
|
+
// annotations = List(),
|
|
108
|
+
// doc = None
|
|
109
|
+
// ),
|
|
110
|
+
// Field(
|
|
111
|
+
// name = "name",
|
|
112
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
113
|
+
// defaultValue = None,
|
|
114
|
+
// annotations = List(),
|
|
115
|
+
// doc = None
|
|
116
|
+
// ),
|
|
117
|
+
// Field(
|
|
118
|
+
// name = "email",
|
|
119
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
120
|
+
// defaultValue = None,
|
|
121
|
+
// annotations = List(),
|
|
122
|
+
// doc = None
|
|
123
|
+
// )
|
|
124
|
+
// )
|
|
125
|
+
person.typeParams // List[TypeParam] (empty if not generic)
|
|
126
|
+
// res6: List[TypeParam] = List()
|
|
127
|
+
person.derives // List[String]
|
|
128
|
+
// res7: List[String] = List()
|
|
129
|
+
person.annotations // List[Annotation]
|
|
130
|
+
// res8: List[Annotation] = List()
|
|
131
|
+
person.isValueClass // Boolean
|
|
132
|
+
// res9: Boolean = false
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Building with Copy
|
|
136
|
+
|
|
137
|
+
Use the copy method to modify a case class:
|
|
138
|
+
|
|
139
|
+
```scala
|
|
140
|
+
import zio.blocks.codegen.ir._
|
|
141
|
+
|
|
142
|
+
val person = CaseClass(
|
|
143
|
+
name = "Person",
|
|
144
|
+
fields = List(
|
|
145
|
+
Field("id", TypeRef.Long),
|
|
146
|
+
Field("name", TypeRef.String),
|
|
147
|
+
Field("email", TypeRef.String)
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Create a new version with additional fields:
|
|
153
|
+
|
|
154
|
+
```scala
|
|
155
|
+
import zio.blocks.codegen.ir._
|
|
156
|
+
|
|
157
|
+
val extended = person.copy(
|
|
158
|
+
fields = person.fields :+ Field("phone", TypeRef.String),
|
|
159
|
+
derives = List("Show")
|
|
160
|
+
)
|
|
161
|
+
// extended: CaseClass = CaseClass(
|
|
162
|
+
// name = "Person",
|
|
163
|
+
// fields = List(
|
|
164
|
+
// Field(
|
|
165
|
+
// name = "id",
|
|
166
|
+
// typeRef = TypeRef(name = "Long", typeArgs = List()),
|
|
167
|
+
// defaultValue = None,
|
|
168
|
+
// annotations = List(),
|
|
169
|
+
// doc = None
|
|
170
|
+
// ),
|
|
171
|
+
// Field(
|
|
172
|
+
// name = "name",
|
|
173
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
174
|
+
// defaultValue = None,
|
|
175
|
+
// annotations = List(),
|
|
176
|
+
// doc = None
|
|
177
|
+
// ),
|
|
178
|
+
// Field(
|
|
179
|
+
// name = "email",
|
|
180
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
181
|
+
// defaultValue = None,
|
|
182
|
+
// annotations = List(),
|
|
183
|
+
// doc = None
|
|
184
|
+
// ),
|
|
185
|
+
// Field(
|
|
186
|
+
// name = "phone",
|
|
187
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
188
|
+
// defaultValue = None,
|
|
189
|
+
// annotations = List(),
|
|
190
|
+
// doc = None
|
|
191
|
+
// )
|
|
192
|
+
// ),
|
|
193
|
+
// typeParams = List(),
|
|
194
|
+
// extendsTypes = List(),
|
|
195
|
+
// derives = List("Show"),
|
|
196
|
+
// annotations = List(),
|
|
197
|
+
// companion = None,
|
|
198
|
+
// doc = None,
|
|
199
|
+
// isValueClass = false
|
|
200
|
+
// )
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Adding a Companion Object
|
|
204
|
+
|
|
205
|
+
Case classes can have companion objects with static members:
|
|
206
|
+
|
|
207
|
+
```scala
|
|
208
|
+
import zio.blocks.codegen.ir._
|
|
209
|
+
|
|
210
|
+
val withCompanion = CaseClass(
|
|
211
|
+
name = "Config",
|
|
212
|
+
fields = List(Field("timeout", TypeRef.Long)),
|
|
213
|
+
companion = Some(
|
|
214
|
+
CompanionObject(
|
|
215
|
+
members = List(
|
|
216
|
+
ObjectMember.ValMember("Default", TypeRef("Config"), "Config(5000L)")
|
|
217
|
+
)
|
|
218
|
+
)
|
|
219
|
+
)
|
|
220
|
+
)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Examples
|
|
224
|
+
|
|
225
|
+
Here are concrete examples demonstrating typical `CaseClass` usage patterns:
|
|
226
|
+
|
|
227
|
+
### Example 1: Simple Case Class
|
|
228
|
+
|
|
229
|
+
A basic case class with primitive fields:
|
|
230
|
+
|
|
231
|
+
```scala
|
|
232
|
+
import zio.blocks.codegen.ir._
|
|
233
|
+
import zio.blocks.codegen.emit._
|
|
234
|
+
|
|
235
|
+
val order = CaseClass(
|
|
236
|
+
name = "Order",
|
|
237
|
+
fields = List(
|
|
238
|
+
Field("id", TypeRef.Long),
|
|
239
|
+
Field("total", TypeRef("BigDecimal")),
|
|
240
|
+
Field("status", TypeRef.String)
|
|
241
|
+
)
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
val file = ScalaFile(
|
|
245
|
+
packageDecl = PackageDecl("com.shop"),
|
|
246
|
+
types = List(order)
|
|
247
|
+
)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Emits:
|
|
251
|
+
|
|
252
|
+
```scala
|
|
253
|
+
import zio.blocks.codegen.emit._
|
|
254
|
+
|
|
255
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
256
|
+
// res13: String = """package com.shop
|
|
257
|
+
//
|
|
258
|
+
// case class Order(
|
|
259
|
+
// id: Long,
|
|
260
|
+
// total: BigDecimal,
|
|
261
|
+
// status: String,
|
|
262
|
+
// )
|
|
263
|
+
// """
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Example 2: Nested Types
|
|
267
|
+
|
|
268
|
+
A case class with optional and collection fields:
|
|
269
|
+
|
|
270
|
+
```scala
|
|
271
|
+
import zio.blocks.codegen.ir._
|
|
272
|
+
import zio.blocks.codegen.emit._
|
|
273
|
+
|
|
274
|
+
val user = CaseClass(
|
|
275
|
+
name = "User",
|
|
276
|
+
fields = List(
|
|
277
|
+
Field("id", TypeRef.Long),
|
|
278
|
+
Field("name", TypeRef.String),
|
|
279
|
+
Field("email", TypeRef("Option", List(TypeRef.String))),
|
|
280
|
+
Field("tags", TypeRef("List", List(TypeRef.String)))
|
|
281
|
+
)
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
val file = ScalaFile(
|
|
285
|
+
packageDecl = PackageDecl("com.example"),
|
|
286
|
+
types = List(user)
|
|
287
|
+
)
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Emits:
|
|
291
|
+
|
|
292
|
+
```scala
|
|
293
|
+
import zio.blocks.codegen.emit._
|
|
294
|
+
|
|
295
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
296
|
+
// res15: String = """package com.example
|
|
297
|
+
//
|
|
298
|
+
// case class User(
|
|
299
|
+
// id: Long,
|
|
300
|
+
// name: String,
|
|
301
|
+
// email: Option[String],
|
|
302
|
+
// tags: List[String],
|
|
303
|
+
// )
|
|
304
|
+
// """
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Example 3: Generic Case Class
|
|
308
|
+
|
|
309
|
+
A polymorphic case class with type parameters:
|
|
310
|
+
|
|
311
|
+
```scala
|
|
312
|
+
import zio.blocks.codegen.ir._
|
|
313
|
+
import zio.blocks.codegen.emit._
|
|
314
|
+
|
|
315
|
+
val page = CaseClass(
|
|
316
|
+
name = "Page",
|
|
317
|
+
fields = List(
|
|
318
|
+
Field("items", TypeRef("List", List(TypeRef("T")))),
|
|
319
|
+
Field("total", TypeRef.Long),
|
|
320
|
+
Field("pageSize", TypeRef.Int)
|
|
321
|
+
),
|
|
322
|
+
typeParams = List(TypeParam("T"))
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
val file = ScalaFile(
|
|
326
|
+
packageDecl = PackageDecl("com.example"),
|
|
327
|
+
types = List(page)
|
|
328
|
+
)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Emits:
|
|
332
|
+
|
|
333
|
+
```scala
|
|
334
|
+
import zio.blocks.codegen.emit._
|
|
335
|
+
|
|
336
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
337
|
+
// res17: String = """package com.example
|
|
338
|
+
//
|
|
339
|
+
// case class Page[T](
|
|
340
|
+
// items: List[T],
|
|
341
|
+
// total: Long,
|
|
342
|
+
// pageSize: Int,
|
|
343
|
+
// )
|
|
344
|
+
// """
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Example 4: Case Class with Derives
|
|
348
|
+
|
|
349
|
+
Automatic typeclass derivation:
|
|
350
|
+
|
|
351
|
+
```scala
|
|
352
|
+
import zio.blocks.codegen.ir._
|
|
353
|
+
import zio.blocks.codegen.emit._
|
|
354
|
+
|
|
355
|
+
val product = CaseClass(
|
|
356
|
+
name = "Product",
|
|
357
|
+
fields = List(
|
|
358
|
+
Field("id", TypeRef.String),
|
|
359
|
+
Field("name", TypeRef.String),
|
|
360
|
+
Field("price", TypeRef("java.math.BigDecimal"))
|
|
361
|
+
)
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
val file = ScalaFile(
|
|
365
|
+
packageDecl = PackageDecl("com.example"),
|
|
366
|
+
types = List(product)
|
|
367
|
+
)
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
Emits:
|
|
371
|
+
|
|
372
|
+
```scala
|
|
373
|
+
import zio.blocks.codegen.emit._
|
|
374
|
+
|
|
375
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
376
|
+
// res19: String = """package com.example
|
|
377
|
+
//
|
|
378
|
+
// case class Product(
|
|
379
|
+
// id: String,
|
|
380
|
+
// name: String,
|
|
381
|
+
// price: java.math.BigDecimal,
|
|
382
|
+
// )
|
|
383
|
+
// """
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Example 5: Case Class with Companion
|
|
387
|
+
|
|
388
|
+
A case class with factory methods in the companion:
|
|
389
|
+
|
|
390
|
+
```scala
|
|
391
|
+
import zio.blocks.codegen.ir._
|
|
392
|
+
import zio.blocks.codegen.emit._
|
|
393
|
+
|
|
394
|
+
val config = CaseClass(
|
|
395
|
+
name = "AppConfig",
|
|
396
|
+
fields = List(
|
|
397
|
+
Field("host", TypeRef.String),
|
|
398
|
+
Field("port", TypeRef.Int)
|
|
399
|
+
),
|
|
400
|
+
companion = Some(
|
|
401
|
+
CompanionObject(
|
|
402
|
+
members = List(
|
|
403
|
+
ObjectMember.ValMember(
|
|
404
|
+
"Default",
|
|
405
|
+
TypeRef("AppConfig"),
|
|
406
|
+
"AppConfig(\"localhost\", 8080)"
|
|
407
|
+
)
|
|
408
|
+
)
|
|
409
|
+
)
|
|
410
|
+
)
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
val file = ScalaFile(
|
|
414
|
+
packageDecl = PackageDecl("com.example"),
|
|
415
|
+
types = List(config)
|
|
416
|
+
)
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
Emits:
|
|
420
|
+
|
|
421
|
+
```scala
|
|
422
|
+
import zio.blocks.codegen.emit._
|
|
423
|
+
|
|
424
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
425
|
+
// res21: String = """package com.example
|
|
426
|
+
//
|
|
427
|
+
// case class AppConfig(
|
|
428
|
+
// host: String,
|
|
429
|
+
// port: Int,
|
|
430
|
+
// )
|
|
431
|
+
//
|
|
432
|
+
// object AppConfig {
|
|
433
|
+
// val Default: AppConfig = AppConfig("localhost", 8080)
|
|
434
|
+
// }
|
|
435
|
+
// """
|
|
436
|
+
```
|