/
AutoDerivationPureConfig.scala
164 lines (136 loc) · 4.13 KB
/
AutoDerivationPureConfig.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package zio.config.examples.autoderivation
import zio.config._
import zio.config.derivation.{name, discriminator}
import zio.config.examples.typesafe.EitherImpureOps
import zio.config.magnolia.deriveConfig
import zio.config.typesafe.TypesafeConfigProvider
import examples._
/**
* An example on how to configure Config classes to work with the below pattern (often followed in many libraries such
* as pure-config)
*
* {{{
* {
* type : sublcassname
* field1 : a
* field2 : b
* }
* }}}
*
* Note that all sealed traits should be annotated with @discriminator
*/
object AutoDerivationSealedTraitPureConfig extends App with EitherImpureOps {
/**
* An example that describes automatic derivation with a few name customisations (done using annotations) for
* coproducts (sealed traits) with objects and case classes as terms
*/
final case class AppConfig(awsConfig: AwsConfig, appName: String)
final case class AwsConfig(field: RandomSealedTrait1)
@discriminator("type")
sealed trait RandomSealedTrait1
object RandomSealedTrait1 {
case object SubObject1 extends RandomSealedTrait1
@name("randomcustomname")
case object SubObject2 extends RandomSealedTrait1
final case class Trait1SubClass1(value: String, g: RandomCaseClass) extends RandomSealedTrait1
final case class Trait1SubClass2(value: RandomSealedTrait2) extends RandomSealedTrait1
final case class Trait1SubClass3(@name("customfieldname") a: String, b: Int) extends RandomSealedTrait1
final case class Trait1SubClass4(a: String, b: Option[Int], c: RandomSealedTrait2) extends RandomSealedTrait1
final case class RandomCaseClass(l: String)
}
@discriminator("type")
sealed trait RandomSealedTrait2
object RandomSealedTrait2 {
case class Trait2SubClass(a: String) extends RandomSealedTrait2
}
import RandomSealedTrait1._
import RandomSealedTrait2._
val s1: String =
"""
|awsConfig {
| field {
| type = Trait1SubClass1
| value = b
| g {
| l = hi
| }
| }
|}
|appName = l
|
|""".stripMargin
assert(
read(deriveConfig[AppConfig] from TypesafeConfigProvider.fromHoconString(s1)) equalM
AppConfig(AwsConfig(Trait1SubClass1("b", RandomCaseClass("hi"))), "l")
)
val s2: String =
"""
|field = SubObject1
|""".stripMargin
assert(read(deriveConfig[AwsConfig] from TypesafeConfigProvider.fromHoconString(s2)) equalM AwsConfig(SubObject1))
val s3: String =
"""
|field = randomcustomname
|""".stripMargin
assert(read(deriveConfig[AwsConfig] from TypesafeConfigProvider.fromHoconString(s3)) equalM AwsConfig(SubObject2))
val s4: String =
"""
|field {
| type = Trait1SubClass2
| value {
| type = Trait2SubClass
| a = 1
| }
|}
|""".stripMargin
assert(
read(deriveConfig[AwsConfig] from TypesafeConfigProvider.fromHoconString(s4))
.mapError(_.prettyPrint()) equalM AwsConfig(
Trait1SubClass2(Trait2SubClass("1"))
)
)
val s5: String =
"""
|field {
| type = Trait1SubClass3
| customfieldname = 1
| b = 2
|}
|""".stripMargin
assert(
read(deriveConfig[AwsConfig] from TypesafeConfigProvider.fromHoconString(s5)) equalM AwsConfig(
Trait1SubClass3("1", 2)
)
)
val s6: String =
"""
|field {
| type = Trait1SubClass4
| a = 1
| c {
| type = Trait2SubClass
| a = 2
| }
|}
|""".stripMargin
assert(
read(deriveConfig[AwsConfig] from TypesafeConfigProvider.fromHoconString(s6)) equalM
AwsConfig(Trait1SubClass4("1", None, Trait2SubClass("2")))
)
val s7: String =
"""
|field {
| type = Trait1SubClass4
| a = 1
| b = 2
| c {
| type = Trait2SubClass
| a = 2
| }
|}
|""".stripMargin
assert(
read(deriveConfig[AwsConfig] from TypesafeConfigProvider.fromHoconString(s7)) equalM
AwsConfig(Trait1SubClass4("1", Some(2), Trait2SubClass("2")))
)
}