@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,408 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: sealed-trait
|
|
3
|
+
title: "SealedTrait"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`SealedTrait` represents a sealed trait in the IR—a sum type (algebraic data type) that enumerates all possible cases. It's essential for modeling discriminated unions and exhaustive pattern matching.
|
|
7
|
+
|
|
8
|
+
## Use Cases
|
|
9
|
+
|
|
10
|
+
- Modeling sum types (ADTs) from API responses or domain models
|
|
11
|
+
- Creating hierarchies of case classes and case objects
|
|
12
|
+
- Defining error types with multiple failure cases
|
|
13
|
+
- Implementing discriminated unions with exhaustive matching
|
|
14
|
+
|
|
15
|
+
## Construction
|
|
16
|
+
|
|
17
|
+
Build a sealed trait with cases:
|
|
18
|
+
|
|
19
|
+
```scala
|
|
20
|
+
import zio.blocks.codegen.ir._
|
|
21
|
+
|
|
22
|
+
val httpStatus = SealedTrait(
|
|
23
|
+
name = "HttpStatus",
|
|
24
|
+
cases = List(
|
|
25
|
+
SealedTraitCase.CaseObjectCase("Ok"),
|
|
26
|
+
SealedTraitCase.CaseObjectCase("NotFound"),
|
|
27
|
+
SealedTraitCase.CaseObjectCase("ServerError")
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
With case classes as cases:
|
|
33
|
+
|
|
34
|
+
```scala
|
|
35
|
+
import zio.blocks.codegen.ir._
|
|
36
|
+
|
|
37
|
+
val result = SealedTrait(
|
|
38
|
+
name = "Result",
|
|
39
|
+
cases = List(
|
|
40
|
+
SealedTraitCase.CaseClassCase(
|
|
41
|
+
CaseClass("Success", List(Field("value", TypeRef.String)))
|
|
42
|
+
),
|
|
43
|
+
SealedTraitCase.CaseClassCase(
|
|
44
|
+
CaseClass("Failure", List(Field("error", TypeRef.String)))
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
With type parameters:
|
|
51
|
+
|
|
52
|
+
```scala
|
|
53
|
+
import zio.blocks.codegen.ir._
|
|
54
|
+
|
|
55
|
+
val option = SealedTrait(
|
|
56
|
+
name = "Option",
|
|
57
|
+
typeParams = List(TypeParam("A")),
|
|
58
|
+
cases = List(
|
|
59
|
+
SealedTraitCase.CaseObjectCase("None"),
|
|
60
|
+
SealedTraitCase.CaseClassCase(
|
|
61
|
+
CaseClass("Some", List(Field("value", TypeRef("A"))), typeParams = List(TypeParam("A")))
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Key Operations
|
|
68
|
+
|
|
69
|
+
All core operations are shown below:
|
|
70
|
+
|
|
71
|
+
### Accessing Components
|
|
72
|
+
|
|
73
|
+
Extract parts of a sealed trait:
|
|
74
|
+
|
|
75
|
+
```scala
|
|
76
|
+
import zio.blocks.codegen.emit._
|
|
77
|
+
result.name // "Result"
|
|
78
|
+
// res2: String = "Result"
|
|
79
|
+
result.cases // List[SealedTraitCase]
|
|
80
|
+
// res3: List[SealedTraitCase] = List(
|
|
81
|
+
// CaseClassCase(
|
|
82
|
+
// CaseClass(
|
|
83
|
+
// name = "Success",
|
|
84
|
+
// fields = List(
|
|
85
|
+
// Field(
|
|
86
|
+
// name = "value",
|
|
87
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
88
|
+
// defaultValue = None,
|
|
89
|
+
// annotations = List(),
|
|
90
|
+
// doc = None
|
|
91
|
+
// )
|
|
92
|
+
// ),
|
|
93
|
+
// typeParams = List(),
|
|
94
|
+
// extendsTypes = List(),
|
|
95
|
+
// derives = List(),
|
|
96
|
+
// annotations = List(),
|
|
97
|
+
// companion = None,
|
|
98
|
+
// doc = None,
|
|
99
|
+
// isValueClass = false
|
|
100
|
+
// )
|
|
101
|
+
// ),
|
|
102
|
+
// CaseClassCase(
|
|
103
|
+
// CaseClass(
|
|
104
|
+
// name = "Failure",
|
|
105
|
+
// fields = List(
|
|
106
|
+
// Field(
|
|
107
|
+
// name = "error",
|
|
108
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
109
|
+
// defaultValue = None,
|
|
110
|
+
// annotations = List(),
|
|
111
|
+
// doc = None
|
|
112
|
+
// )
|
|
113
|
+
// ),
|
|
114
|
+
// typeParams = List(),
|
|
115
|
+
// extendsTypes = List(),
|
|
116
|
+
// derives = List(),
|
|
117
|
+
// annotations = List(),
|
|
118
|
+
// companion = None,
|
|
119
|
+
// doc = None,
|
|
120
|
+
// isValueClass = false
|
|
121
|
+
// )
|
|
122
|
+
// )
|
|
123
|
+
// )
|
|
124
|
+
result.typeParams // List[TypeParam] (empty if not generic)
|
|
125
|
+
// res4: List[TypeParam] = List()
|
|
126
|
+
result.derives // List[String]
|
|
127
|
+
// res5: List[String] = List()
|
|
128
|
+
result.annotations // List[Annotation]
|
|
129
|
+
// res6: List[Annotation] = List()
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Working with Cases
|
|
133
|
+
|
|
134
|
+
Each case is either a `CaseObjectCase` or `CaseClassCase`:
|
|
135
|
+
|
|
136
|
+
```scala
|
|
137
|
+
import zio.blocks.codegen.ir._
|
|
138
|
+
|
|
139
|
+
val caseObj = SealedTraitCase.CaseObjectCase("Unknown")
|
|
140
|
+
|
|
141
|
+
val caseClass = SealedTraitCase.CaseClassCase(
|
|
142
|
+
CaseClass("Error", List(Field("msg", TypeRef.String)))
|
|
143
|
+
)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Building with Copy
|
|
147
|
+
|
|
148
|
+
Modify a sealed trait:
|
|
149
|
+
|
|
150
|
+
```scala
|
|
151
|
+
import zio.blocks.codegen.emit._
|
|
152
|
+
val updated = result.copy(
|
|
153
|
+
cases = result.cases :+ SealedTraitCase.CaseObjectCase("Pending")
|
|
154
|
+
)
|
|
155
|
+
// updated: SealedTrait = SealedTrait(
|
|
156
|
+
// name = "Result",
|
|
157
|
+
// typeParams = List(),
|
|
158
|
+
// extendsTypes = List(),
|
|
159
|
+
// cases = List(
|
|
160
|
+
// CaseClassCase(
|
|
161
|
+
// CaseClass(
|
|
162
|
+
// name = "Success",
|
|
163
|
+
// fields = List(
|
|
164
|
+
// Field(
|
|
165
|
+
// name = "value",
|
|
166
|
+
// typeRef = TypeRef(name = "String", typeArgs = List()),
|
|
167
|
+
// defaultValue = None,
|
|
168
|
+
// annotations = List(),
|
|
169
|
+
// doc = None
|
|
170
|
+
// )
|
|
171
|
+
// ),
|
|
172
|
+
// typeParams = List(),
|
|
173
|
+
// extendsTypes = List(),
|
|
174
|
+
// derives = List(),
|
|
175
|
+
// annotations = List(),
|
|
176
|
+
// companion = None,
|
|
177
|
+
// doc = None,
|
|
178
|
+
// isValueClass = false
|
|
179
|
+
// )
|
|
180
|
+
// ),
|
|
181
|
+
// CaseClassCase(
|
|
182
|
+
// CaseClass(
|
|
183
|
+
// name = "Failure",
|
|
184
|
+
// fields = List(
|
|
185
|
+
// Field(
|
|
186
|
+
// name = "error",
|
|
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(),
|
|
196
|
+
// annotations = List(),
|
|
197
|
+
// companion = None,
|
|
198
|
+
// doc = None,
|
|
199
|
+
// isValueClass = false
|
|
200
|
+
// )
|
|
201
|
+
// ),
|
|
202
|
+
// CaseObjectCase("Pending")
|
|
203
|
+
// ),
|
|
204
|
+
// ...
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Examples
|
|
208
|
+
|
|
209
|
+
Practical examples demonstrate common usage:
|
|
210
|
+
|
|
211
|
+
### Example 1: Simple Enum-Like Sealed Trait
|
|
212
|
+
|
|
213
|
+
A sealed trait with only case objects:
|
|
214
|
+
|
|
215
|
+
```scala
|
|
216
|
+
import zio.blocks.codegen.ir._
|
|
217
|
+
import zio.blocks.codegen.emit._
|
|
218
|
+
|
|
219
|
+
val color = SealedTrait(
|
|
220
|
+
name = "Color",
|
|
221
|
+
cases = List(
|
|
222
|
+
SealedTraitCase.CaseObjectCase("Red"),
|
|
223
|
+
SealedTraitCase.CaseObjectCase("Green"),
|
|
224
|
+
SealedTraitCase.CaseObjectCase("Blue")
|
|
225
|
+
)
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
val file = ScalaFile(
|
|
229
|
+
packageDecl = PackageDecl("com.graphics"),
|
|
230
|
+
types = List(color)
|
|
231
|
+
)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Emits:
|
|
235
|
+
|
|
236
|
+
```scala
|
|
237
|
+
import zio.blocks.codegen.emit._
|
|
238
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
239
|
+
// res9: String = """package com.graphics
|
|
240
|
+
//
|
|
241
|
+
// sealed trait Color
|
|
242
|
+
//
|
|
243
|
+
// object Color {
|
|
244
|
+
// case object Red extends Color
|
|
245
|
+
// case object Green extends Color
|
|
246
|
+
// case object Blue extends Color
|
|
247
|
+
// }
|
|
248
|
+
// """
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Example 2: Mixed Case Objects and Case Classes
|
|
252
|
+
|
|
253
|
+
A sealed trait with both simple and complex cases:
|
|
254
|
+
|
|
255
|
+
```scala
|
|
256
|
+
import zio.blocks.codegen.ir._
|
|
257
|
+
import zio.blocks.codegen.emit._
|
|
258
|
+
|
|
259
|
+
val payment = SealedTrait(
|
|
260
|
+
name = "Payment",
|
|
261
|
+
cases = List(
|
|
262
|
+
SealedTraitCase.CaseClassCase(
|
|
263
|
+
CaseClass("CreditCard", List(
|
|
264
|
+
Field("number", TypeRef.String),
|
|
265
|
+
Field("expiry", TypeRef.String)
|
|
266
|
+
))
|
|
267
|
+
),
|
|
268
|
+
SealedTraitCase.CaseClassCase(
|
|
269
|
+
CaseClass("BankTransfer", List(
|
|
270
|
+
Field("accountNumber", TypeRef.String)
|
|
271
|
+
))
|
|
272
|
+
),
|
|
273
|
+
SealedTraitCase.CaseObjectCase("Cash"),
|
|
274
|
+
SealedTraitCase.CaseObjectCase("Check")
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
val file = ScalaFile(
|
|
279
|
+
packageDecl = PackageDecl("com.example"),
|
|
280
|
+
types = List(payment)
|
|
281
|
+
)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Emits:
|
|
285
|
+
|
|
286
|
+
```scala
|
|
287
|
+
import zio.blocks.codegen.emit._
|
|
288
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
289
|
+
// res11: String = """package com.example
|
|
290
|
+
//
|
|
291
|
+
// sealed trait Payment
|
|
292
|
+
//
|
|
293
|
+
// object Payment {
|
|
294
|
+
// case class CreditCard(
|
|
295
|
+
// number: String,
|
|
296
|
+
// expiry: String,
|
|
297
|
+
// ) extends Payment
|
|
298
|
+
// case class BankTransfer(
|
|
299
|
+
// accountNumber: String,
|
|
300
|
+
// ) extends Payment
|
|
301
|
+
// case object Cash extends Payment
|
|
302
|
+
// case object Check extends Payment
|
|
303
|
+
// }
|
|
304
|
+
// """
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Example 3: Generic Sealed Trait
|
|
308
|
+
|
|
309
|
+
A polymorphic sealed trait with type parameters:
|
|
310
|
+
|
|
311
|
+
```scala
|
|
312
|
+
import zio.blocks.codegen.ir._
|
|
313
|
+
import zio.blocks.codegen.emit._
|
|
314
|
+
|
|
315
|
+
val either = SealedTrait(
|
|
316
|
+
name = "Either",
|
|
317
|
+
typeParams = List(TypeParam("L"), TypeParam("R")),
|
|
318
|
+
cases = List(
|
|
319
|
+
SealedTraitCase.CaseClassCase(
|
|
320
|
+
CaseClass("Left", List(Field("value", TypeRef("L"))), typeParams = List(TypeParam("L")))
|
|
321
|
+
),
|
|
322
|
+
SealedTraitCase.CaseClassCase(
|
|
323
|
+
CaseClass("Right", List(Field("value", TypeRef("R"))), typeParams = List(TypeParam("R")))
|
|
324
|
+
)
|
|
325
|
+
)
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
val file = ScalaFile(
|
|
329
|
+
packageDecl = PackageDecl("com.example"),
|
|
330
|
+
types = List(either)
|
|
331
|
+
)
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Emits:
|
|
335
|
+
|
|
336
|
+
```scala
|
|
337
|
+
import zio.blocks.codegen.emit._
|
|
338
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
339
|
+
// res13: String = """package com.example
|
|
340
|
+
//
|
|
341
|
+
// sealed trait Either[L, R]
|
|
342
|
+
//
|
|
343
|
+
// object Either {
|
|
344
|
+
// case class Left[L](
|
|
345
|
+
// value: L,
|
|
346
|
+
// ) extends Either[L, R]
|
|
347
|
+
// case class Right[R](
|
|
348
|
+
// value: R,
|
|
349
|
+
// ) extends Either[L, R]
|
|
350
|
+
// }
|
|
351
|
+
// """
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Example 4: Error ADT
|
|
355
|
+
|
|
356
|
+
A sealed trait for error handling:
|
|
357
|
+
|
|
358
|
+
```scala
|
|
359
|
+
import zio.blocks.codegen.ir._
|
|
360
|
+
import zio.blocks.codegen.emit._
|
|
361
|
+
|
|
362
|
+
val appError = SealedTrait(
|
|
363
|
+
name = "AppError",
|
|
364
|
+
cases = List(
|
|
365
|
+
SealedTraitCase.CaseClassCase(
|
|
366
|
+
CaseClass("ValidationError", List(
|
|
367
|
+
Field("field", TypeRef.String),
|
|
368
|
+
Field("reason", TypeRef.String)
|
|
369
|
+
))
|
|
370
|
+
),
|
|
371
|
+
SealedTraitCase.CaseClassCase(
|
|
372
|
+
CaseClass("NotFound", List(
|
|
373
|
+
Field("id", TypeRef.Long)
|
|
374
|
+
))
|
|
375
|
+
),
|
|
376
|
+
SealedTraitCase.CaseObjectCase("Unauthorized"),
|
|
377
|
+
SealedTraitCase.CaseObjectCase("InternalServerError")
|
|
378
|
+
)
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
val file = ScalaFile(
|
|
382
|
+
packageDecl = PackageDecl("com.example"),
|
|
383
|
+
types = List(appError)
|
|
384
|
+
)
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
Emits:
|
|
388
|
+
|
|
389
|
+
```scala
|
|
390
|
+
import zio.blocks.codegen.emit._
|
|
391
|
+
ScalaEmitter.emit(file, EmitterConfig())
|
|
392
|
+
// res15: String = """package com.example
|
|
393
|
+
//
|
|
394
|
+
// sealed trait AppError
|
|
395
|
+
//
|
|
396
|
+
// object AppError {
|
|
397
|
+
// case class ValidationError(
|
|
398
|
+
// field: String,
|
|
399
|
+
// reason: String,
|
|
400
|
+
// ) extends AppError
|
|
401
|
+
// case class NotFound(
|
|
402
|
+
// id: Long,
|
|
403
|
+
// ) extends AppError
|
|
404
|
+
// case object Unauthorized extends AppError
|
|
405
|
+
// case object InternalServerError extends AppError
|
|
406
|
+
// }
|
|
407
|
+
// """
|
|
408
|
+
```
|