trait ConfigStringModule extends ConfigModule with ConfigSourceModule
- Alphabetic
- By Inheritance
- ConfigStringModule
- ConfigModule
- ReadModule
- ConfigDocsModule
- WriteModule
- ConfigDescriptorModule
- ConfigSourceModule
- KeyValueModule
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
-
sealed
trait
ConfigDescriptor[A] extends AnyRef
- Definition Classes
- ConfigDescriptorModule
-
trait
ConfigDescriptorFunctions extends AnyRef
- Definition Classes
- ConfigDescriptorModule
-
sealed
trait
ConfigDocs extends AnyRef
ConfigDocsholds the descriptions and details of aConfigDescriptorwhich can be used to produce documentation.ConfigDocsholds the descriptions and details of aConfigDescriptorwhich can be used to produce documentation.- Definition Classes
- ConfigDocsModule
-
sealed
case class
Table(rows: List[TableRow]) extends Product with Serializable
A Table is a recursive structure that is more easier to be interpreted as Json or Markdown than trying to convert
ConfigDocsto a readable format.A Table is a recursive structure that is more easier to be interpreted as Json or Markdown than trying to convert
ConfigDocsto a readable format.- Definition Classes
- ConfigDocsModule
-
sealed
trait
ConfigSource extends AnyRef
Every ConfigSource at the core is just a
Reader, which is essentially a function that goes fromPropertyTreePathto an actualPropertyTree.Every ConfigSource at the core is just a
Reader, which is essentially a function that goes fromPropertyTreePathto an actualPropertyTree. i.e,f: PropertyTreePath[String] => IO[ReadError[String], PropertyTree[String, String]Later on for eachkeyrepresented asPropertyTreePath[String]internally,fis used to applied to get the value as aPropertyTreeitself.Internal details:
This function
fcan be retrieved under an ZManaged effect. This implies it may involve an IO with managing resources to even form this function. Example: In order to retrieve a property-tree corresponding to a key (PropertyTreePath), it requires a database connection in the very first instance.// pseudo-logic, doesn't compile
val source: ConfigSource = ConfigSource.Reader( ZManaged(getDatabaseConnection) .flatMap(connection => (key: PropertyTreePath[String] => IO.effect(connection.getStatement.executeQuery(s"get key from table"))) )
Note that
ConfigSourcehas a generalisedmemoizefunction that allows you to memoize the effect required to form the function. In the context of the above example, withsource.memoizewe acquire only a single connection to retrieve the values for all the keys in your product/coproduct for an instance ofread.- Definition Classes
- ConfigSourceModule
-
type
CachedReaders = Map[ConfigSource, ManagedReader]
- Definition Classes
- ReadModule
-
type
K = String
- Definition Classes
- ConfigSourceModule → KeyValueModule
-
type
V = String
- Definition Classes
- ConfigSourceModule → KeyValueModule
Value Members
-
object
Table extends Serializable
- Definition Classes
- ConfigDocsModule
-
object
ConfigSource
- Definition Classes
- ConfigSourceModule
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
configLayer[A](config: ConfigDescriptor[A])(implicit tag: Tag[A]): ZLayer[ConfigSource, ReadError[K], A]
Convert a ConfigDescriptor to a Layer, which further requires a ConfigSource as input.
Convert a ConfigDescriptor to a Layer, which further requires a ConfigSource as input. Note: Use
configLayer_instead ofconfigLayerif ConfigSource information is already embedded in the descriptor.Example usage:
final case class MyConfig(age: Int) val appConfigLayer = ConfigSource.fromMap(Map("age" -> "20")).toLayer >>> configLayer(int("age").to[MyConfig]) val app: ZIO[MyConfig with zio.console.Console,java.io.IOException, Unit] = getConfig[MyConfig].flatMap(Console.printLine) app.provideSomeLayer[Console](appConfigLayer) // ZIO[zio.console.Console, Exception, Unit]
This can also be simplified to
val appConfigLayer = configLayer_(int("age").to[MyConfig] from ConfigSource.fromMap(Map("age" -> "20"))) app.provideSomeLayer[Console](appConfigLayer)
The preference depends on how you want to design the entry point to managing config of your app.
- Definition Classes
- ConfigModule
-
final
def
configLayer_[A](config: ConfigDescriptor[A])(implicit tag: Tag[A]): ZLayer[Any, ReadError[K], A]
Convert a ConfigDescriptor to a Layer.
Convert a ConfigDescriptor to a Layer.
Example usage:
final case class MyConfig(age: Int, name: String) object MyConfig { val config = (int("age") zip string("name")).to[MyConfig] from ConfigSource.fromMap(Map("age" -> "20", "name" -> "afsal")) } val app: ZIO[Has[MyConfig] with zio.console.Console, java.io.IOException, Unit] = getConfig[MyConfig].flatMap(putStrLn) val io: ZIO[zio.console.Console, Exception, Unit] = app.provideSomeLayer[Console](configLayer_(MyConfig.config)) println(zio.Runtime.default.unsafeRun(io))
- Definition Classes
- ConfigModule
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
generateDocs[A](config: ConfigDescriptor[A]): ConfigDocs
Generate documentation based on the
ConfigDescriptor, where aConfigDescriptoris a structure representing the logic to fetch the application config from various sources.Generate documentation based on the
ConfigDescriptor, where aConfigDescriptoris a structure representing the logic to fetch the application config from various sources.Once we generate the docs, this can be converted to a light weight
Tablestructure which is much more easier to be converted to markdown or json formats.Example :
val configDescriptor: ConfigDescriptor[MyAppConfig] = ??? generatedDocs(configDescriptor).toTable.toGithubFlavouredMarkdown- Definition Classes
- ConfigDocsModule
-
def
generateReport[A](config: ConfigDescriptor[A], value: A): Either[String, ConfigDocs]
Generate a report based on the
ConfigDescriptorand anA, where aConfigDescriptorrepresents the logic to fetch the application config from various sources, andArepresents the actual config value that was retrieved.Generate a report based on the
ConfigDescriptorand anA, where aConfigDescriptorrepresents the logic to fetch the application config from various sources, andArepresents the actual config value that was retrieved.- Definition Classes
- ConfigDocsModule
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
getConfig[A](implicit tag: Tag[A]): ZIO[A, Nothing, A]
Example usage:
Example usage:
A helper method allowing you to forget passing configs as arguments to all over the place in your app. Whereever, you need to access the config, simply call
getConfig[MyConfig].flatMap(config => ???).PS: if you are familiar with Kleisli, this is similar to using
Kleisi[IO, Config, A], except for the fact that it isHas[Config]instead ofConfigallowing you to mixin with other dependencies keeping yourMonadthe sameimport zio.console._ final case class MyConfig(username: String, port: Int) val app: ZIO[Has[MyConfig] with Console, java.io.IOException, Unit] = for { config <- getConfig[MyConfig] _ <- putStrLn(config.toString) } yield () val configDesc = (string("USERNAME") zip int("PORT")).to[MyConfig] from ConfigSource.fromMap(Map()) val main: ZIO[zio.console.Console, Exception, Unit] = app.provideSomeLayer[Console](configLayer_(configDesc))
- Definition Classes
- ConfigModule
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
read[A](configuration: ConfigDescriptor[A]): IO[ReadError[K], A]
- Definition Classes
- ReadModule
-
final
def
requiredZipAndOrFields[A](config: ConfigDescriptor[A]): Int
- Definition Classes
- ReadModule
-
def
sizeOfZipAndOrErrors(error: ReadError[K]): Int
- Definition Classes
- ReadModule
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
write[A](config: ConfigDescriptor[A], a: A): Either[String, PropertyTree[K, V]]
- Definition Classes
- WriteModule
- object ConfigDescriptor extends ConfigDescriptorFunctions
-
object
ZConfig
Use functions in this
Configobject when you need to retrieve your instance of config in terms of zio.Layer.Use functions in this
Configobject when you need to retrieve your instance of config in terms of zio.Layer.For example:
final case class MyConfig(dburl: String, port: Int) val myConfigDesc: ConfigDescriptor[MyConfig] = (string("dburl") zip int("port")).to[MyConfig] val myConfig: Layer[ReadError[String], Config[MyConfig]] = Config.fromSystemEnv(myConfigDesc)
By using
Config.fromSystemEnv(myConfigDesc), it internally extends your description which ismyConfigDescto include theConfigSource. In the above example, it is theConfigSourcecorresponding tosys.env. It then callszio.config.readwith this new description that includes the source information.Extending an existing config description to include a
ConfigSourceis as simple asmyConfigDesc from configSource
Also, note that
Config[MyConfig]in the above example is a simple type alias toHas[MyConfig].If you want to retrieve your config as scala.Either instead of zio.Layer, then you will have to extend your description to include the information on
ConfigSourcemanually.For example:
import zio.config._, ConfigDescriptor._ final case class MyConfig(dburl: String, port: Int) val myConfig: ConfigDescriptor[MyConfig] = (string("dburl") zip int("port")).to[MyConfig] val constantSource: ConfigSource = ConfigSource.fromMap(Map("dburl" -> "xyz", "port" -> "8080")) val result: Either[ReadError[String], MyConfig] = read(myConfig from constantSource)
Note: With the above approach, we got a simple scala.Either instead of retrieving them in terms of ZIO. Instead of the above approach, if we use
Config.fromMap(constantMap, myConfig), then we will get aLayer[ReadError[String], MyConfig]The above approach is especially useful when we have a custom
ConfigSource. For instance, we can form a customConfigSourceby composing a few existing ConfigSources.For example:
import zio.config._, ConfigDescriptor._ final case class MyConfig(dburl: String, port: Int) val myConfig: ConfigDescriptor[MyConfig] = (string("dburl") zip int("port")).to[MyConfig] val sysEnvSource: UIO[MyConfig] = ConfigSource.fromSystemEnv val constantSource: ConfigSource = ConfigSource.fromMap(Map("dburl" -> "xyz", "port" -> "8080")) val result: IO[ReadError[String], MyConfig] = configSource.flatMap(source => read(myConfig from sysEnvSource.orElse(constantSource))
In the above example, the results returned an UIO because of the existence of ConfigSource
corresponding tosys.env.