Skip to content

Commit a51d21b

Browse files
committed
ZIO config
1 parent 0c92d50 commit a51d21b

File tree

9 files changed

+136
-13
lines changed

9 files changed

+136
-13
lines changed

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,11 @@ ZIO A type-safe, composable library for asynchronous and concurrent programming
9292

9393
Here we cover with some practical examples, the most common use of ZIO library.
9494

95-
* **[ZIO monad](scala_features/src/main/scala/app/impl/scalaz/zio/ZIOMonad.scala)**
96-
* **[ZIO Actor](scala_features/src/main/scala/app/impl/scalaz/zio/ZIOActor.scala)**
97-
* **[ZIO ZLayer](scala_features/src/main/scala/app/impl/scalaz/zio/ZIOLayer.scala)**
98-
* **[ZIO ZStream](scala_features/src/main/scala/app/impl/scalaz/zio/ZIOZStream.scala)**
95+
* **[ZIO monad](scala_features/src/main/scala/app/impl/zio/ZIOMonad.scala)**
96+
* **[ZIO Actor](scala_features/src/main/scala/app/impl/zio/ZIOActor.scala)**
97+
* **[ZIO ZLayer](scala_features/src/main/scala/app/impl/zio/ZIOLayer.scala)**
98+
* **[ZIO ZStream](scala_features/src/main/scala/app/impl/zio/ZIOZStream.scala)**
99+
* **[ZIO Config](scala_features/src/main/scala/app/impl/zio/ZIOConfigFeature.scala)**
99100

100101
![My image](scala_features/src/main/resources/img/native.jpg)
101102
# Scala-native

scala_features/build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@ dependencies {
2424
compile group: 'org.glassfish.grizzly', name: 'grizzly-http-server', version: '2.4.0'
2525
compile group: 'org.scalaz', name: 'scalaz-zio_2.12', version: '0.19'
2626
compile 'org.scala-lang:scala-library:2.12.8'
27-
compile group: 'dev.zio', name: 'zio_2.12', version: '1.0.0-RC18-2'
2827
compile project(':macros')
2928
compile project(':h2')
30-
// compile group: 'io.vertx', name: 'vertx-web-client', version: '3.6.0'
29+
//ZIO
30+
compile group: 'dev.zio', name: 'zio-config_2.12', version: '1.0.0-RC15'
31+
compile group: 'dev.zio', name: 'zio_2.12', version: '1.0.0-RC18-2'
3132
//Akka
3233
compile group: 'com.typesafe.akka', name: 'akka-http_2.12', version: '10.1.7'
3334
compile group: 'com.typesafe.akka', name: 'akka-actor_2.12', version: '2.5.19'

scala_features/src/main/scala/app/impl/scalaz/zio/ZIOActor.scala renamed to scala_features/src/main/scala/app/impl/zio/ZIOActor.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package app.impl.scalaz.zio
1+
package app.impl.zio
22

3-
import app.impl.scalaz.zio.ZIOActorSystem.{Capacity, Permit, ZIOActor, createActor}
3+
import app.impl.zio.ZIOActorSystem.{Capacity, Permit, ZIOActor, createActor}
44
import org.junit.Test
55
import scalaz.zio.{DefaultRuntime, Queue, Semaphore, UIO, ZIO}
66

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package app.impl.zio
2+
3+
import java.util.Properties
4+
5+
import org.junit.Test
6+
import zio.config.ConfigDescriptor._
7+
import zio.config._
8+
import zio.{Layer, ZIO}
9+
10+
class ZIOConfigFeature {
11+
12+
val runtime: zio.Runtime[zio.ZEnv] = zio.Runtime.default
13+
14+
case class UserName(value: String)
15+
16+
/**
17+
* ADT to contain the config info we want to load to use in our program
18+
*/
19+
case class UserConfig(username: UserName,
20+
password: String,
21+
age: Int,
22+
address: Option[String],
23+
multiValue: String)
24+
25+
/**
26+
* [ConfigDescriptor] Config structure where we can specify which config alias we want to load into our [UserConfig] structure.
27+
* The way to bond the config with the ADT is by the order of definition.
28+
*
29+
* We can define strong type of T for a primitive, (T.apply, T.unapply) after primitive definition.
30+
* We can define one attribute as Option[T] type, using [optional] operator after definition.
31+
* We can define one attribute with default value using [default] passing the value for that config, if it does not exit.
32+
* We can bond one attribute or in case it is not in config to another, using <> operator, which is a [orElse] sugar syntax.
33+
*/
34+
val userConfig: ConfigDescriptor[String, String, UserConfig] =
35+
(string("USERNAME")(UserName.apply, UserName.unapply) |@|
36+
string("PASSWORD") |@|
37+
int("AGE").default(18) |@|
38+
string("ADDRESS").optional |@|
39+
string("VALUE1") <> string("VALUE2")) (UserConfig.apply, UserConfig.unapply)
40+
41+
/**
42+
* An example program where we load as Env argument the Config[UserConfig]
43+
* Once in the program using config[ADT] we can load the config in the program to be used.
44+
*/
45+
val configProgram: ZIO[Config[UserConfig], Nothing, Unit] = for {
46+
myConfig <- config[UserConfig]
47+
_ <- ZIO.succeed(println(myConfig.username))
48+
_ <- ZIO.succeed(println(myConfig.password))
49+
_ <- ZIO.succeed(println(myConfig.age))
50+
_ <- ZIO.succeed(println(myConfig.address))
51+
_ <- ZIO.succeed(println(myConfig.multiValue))
52+
} yield ()
53+
54+
/**
55+
* We can create ZLayer config using [Config.fromMap] where we have to pass the map with the config info
56+
* and the ConfigDescriptor [userConfig] to bond the config info into the ADT [UserConfig]
57+
* To run our program passing the config as Env argument we use [provideCustomLayer] passing the
58+
* ZLayer configLayer
59+
*/
60+
@Test
61+
def configLayerFromMap(): Unit = {
62+
val map = Map(
63+
"USERNAME" -> "Politrons",
64+
"PASSWORD" -> "Rpdiuo34f@rr",
65+
"VALUE1" -> "Value1",
66+
"NotUsed" -> "Foo"
67+
)
68+
69+
val configLayer: Layer[ReadError[String], Config[UserConfig]] = Config.fromMap(map, userConfig)
70+
71+
runtime.unsafeRun(configProgram.provideCustomLayer(configLayer))
72+
73+
}
74+
75+
/**
76+
* We can also provide the Config in our ADT using java.util.Properties using [fromProperties]
77+
*/
78+
@Test
79+
def configLayerFromProperties(): Unit = {
80+
val properties = new Properties()
81+
properties.put("USERNAME", "Politrons")
82+
properties.put("PASSWORD", "112223344")
83+
properties.put("AGE", "38")
84+
properties.put("ADDRESS", "Camilo Jose Cela")
85+
properties.put("VALUE2", "Value2")
86+
87+
88+
val configLayer: Layer[ReadError[String], Config[UserConfig]] = Config.fromProperties(properties, userConfig, "")
89+
90+
runtime.unsafeRun(configProgram.provideCustomLayer(configLayer))
91+
92+
}
93+
94+
/**
95+
* Another ADT to load some env variable in our program
96+
*/
97+
case class SysEnvConfig(home: String,
98+
javaHome: String)
99+
100+
val sysEnvConfig: ConfigDescriptor[String, String, SysEnvConfig] =
101+
(string("HOME") |@| string("JAVA_HOME")) (SysEnvConfig.apply, SysEnvConfig.unapply)
102+
103+
val sysEnvProgram: ZIO[Config[SysEnvConfig], Nothing, Unit] = for {
104+
myConfig <- config[SysEnvConfig]
105+
_ <- ZIO.succeed(println(myConfig.home))
106+
_ <- ZIO.succeed(println(myConfig.javaHome))
107+
} yield ()
108+
109+
/**
110+
* We can also create ZLayer config using [fromSystemEnv] which it will get all System environment of the machine
111+
* and it will bond with the [ConfigDescriptor] passed in the Config factory
112+
*/
113+
@Test
114+
def configLayerFromSysEnv(): Unit = {
115+
116+
val configLayer: Layer[ReadError[String], Config[SysEnvConfig]] = Config.fromSystemEnv(sysEnvConfig)
117+
118+
runtime.unsafeRun(sysEnvProgram.provideCustomLayer(configLayer))
119+
120+
}
121+
}

scala_features/src/main/scala/app/impl/scalaz/zio/ZIOLayer.scala renamed to scala_features/src/main/scala/app/impl/zio/ZIOLayer.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.impl.scalaz.zio
1+
package app.impl.zio
22

33
import java.util.UUID
44

scala_features/src/main/scala/app/impl/scalaz/zio/ZIOMonad.scala renamed to scala_features/src/main/scala/app/impl/zio/ZIOMonad.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.impl.scalaz.zio
1+
package app.impl.zio
22

33
import org.junit.Test
44
import scalaz.zio.{DefaultRuntime, IO, Task, ZIO}

scala_features/src/main/scala/app/impl/scalaz/zio/ZIOMonadWorkshop.scala renamed to scala_features/src/main/scala/app/impl/zio/ZIOMonadWorkshop.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.impl.scalaz.zio
1+
package app.impl.zio
22

33
import org.junit.Test
44
import scalaz.zio.{DefaultRuntime, Fiber, IO, ZIO}

scala_features/src/main/scala/app/impl/scalaz/zio/ZIOStreamFeature.scala renamed to scala_features/src/main/scala/app/impl/zio/ZIOStreamFeature.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.impl.scalaz.zio
1+
package app.impl.zio
22

33
import org.junit.Test
44
import scalaz.zio._

scala_features/src/main/scala/app/impl/scalaz/zio/ZIOZStream.scala renamed to scala_features/src/main/scala/app/impl/zio/ZIOZStream.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.impl.scalaz.zio
1+
package app.impl.zio
22

33
import org.junit.Test
44
import scalaz.zio._

0 commit comments

Comments
 (0)