package config
- Alphabetic
- By Inheritance
- config
- ImplicitTupleConversion
- ConfigStringModule
- ConfigModule
- ReadModule
- ConfigDocsModule
- WriteModule
- ConfigDescriptorModule
- ConfigSourceModule
- KeyValueModule
- KeyConversionFunctions
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Type Members
-
type
CachedReaders = Map[ConfigSource, ManagedReader]
- Definition Classes
- ReadModule
-
trait
ConfigDescriptorModule extends ConfigSourceModule
- Annotations
- @silent( "Unused import" )
-
sealed
trait
ConfigDescriptor[A] extends AnyRef
- Definition Classes
- ConfigDescriptorModule
-
trait
ConfigDescriptorFunctions extends AnyRef
- Definition Classes
- ConfigDescriptorModule
- trait ConfigDocsModule extends WriteModule
-
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
- trait ConfigModule extends ConfigDescriptorModule with ConfigSourceModule with ConfigDocsModule with ReadModule with WriteModule
- trait ConfigSourceModule extends KeyValueModule
-
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
- trait ConfigStringModule extends ConfigModule with ConfigSourceModule
- trait ImplicitTupleConversion extends AnyRef
- implicit final class Interpolator extends AnyVal
- trait InvariantZip[A, B] extends AnyRef
- trait InvariantZipLowPriority0 extends InvariantZipLowPriority1
- trait InvariantZipLowPriority1 extends AnyRef
-
abstract
type
K
- Definition Classes
- KeyValueModule
- trait KeyValueModule extends AnyRef
- implicit class MapOps[A] extends AnyRef
-
sealed
trait
PropertyTree[+K, +V] extends AnyRef
- Annotations
- @silent( "Unused import" )
- final case class PropertyTreePath[K](path: Vector[Step[K]]) extends Product with Serializable
- trait PropertyType[V, A] extends AnyRef
- trait PropertyTypePlatformSpecific extends AnyRef
- sealed trait ReadError[+A] extends Exception with NoStackTrace
- trait TupleConversion[A, B] extends AnyRef
-
abstract
type
V
- Definition Classes
- KeyValueModule
Value Members
-
def
addPostFixToKey(string: String): (String) ⇒ String
Add a post fix to an existing key
Add a post fix to an existing key
- Definition Classes
- KeyConversionFunctions
-
def
addPrefixToKey(prefix: String): (String) ⇒ String
Add a prefix to an existing key
Add a prefix to an existing key
- Definition Classes
- KeyConversionFunctions
-
implicit macro
def
autoTupleConversion[P <: Product, T]: TupleConversion[P, T]
- Definition Classes
- ImplicitTupleConversion
-
def
autoTupleConversion1[P, A](implicit ev: TupleConversion[P, (A)]): TupleConversion[P, A]
- Definition Classes
- ImplicitTupleConversion
-
def
camelToDelimiter(input: String, delimiter: String): String
Convert camelCase to any delimited string.
Convert camelCase to any delimited string. Example:
camelToDelimiter("abcDef", "-") === abc-def
- Definition Classes
- KeyConversionFunctions
-
final
def
configLayer[A](config: ConfigDescriptor[A])(implicit tag: Tag[A]): ZLayer[ConfigSource, ReadError[config.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[config.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
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
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
-
final
def
read[A](configuration: ConfigDescriptor[A]): IO[ReadError[config.K], A]
- Definition Classes
- ReadModule
-
final
def
requiredZipAndOrFields[A](config: ConfigDescriptor[A]): Int
- Definition Classes
- ReadModule
-
def
sizeOfZipAndOrErrors(error: ReadError[config.K]): Int
- Definition Classes
- ReadModule
-
val
toKebabCase: (String) ⇒ String
Convert a camelCase key to kebab-case val s = abcDef toKebabCase(s) === abc-def
Convert a camelCase key to kebab-case val s = abcDef toKebabCase(s) === abc-def
- Definition Classes
- KeyConversionFunctions
-
val
toSnakeCase: (String) ⇒ String
Convert a camelCase key to snake_case
Convert a camelCase key to snake_case
- Definition Classes
- KeyConversionFunctions
-
final
def
write[A](config: ConfigDescriptor[A], a: A): Either[String, PropertyTree[config.K, config.V]]
- Definition Classes
- WriteModule
-
object
BuildInfo extends Product with Serializable
This object was generated by sbt-buildinfo.
-
object
Table extends Serializable
- Definition Classes
- ConfigDocsModule
-
object
ConfigSource
- Definition Classes
- ConfigSourceModule
-
object
ConfigDescriptor extends ConfigDescriptorFunctions
- Definition Classes
- ConfigStringModule
-
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.- Definition Classes
- ConfigStringModule
- object InvariantZip extends InvariantZipLowPriority0
- object PropertyTree
-
object
PropertyTreePath extends Serializable
- Annotations
- @silent( "Unused import" )
- object PropertyType extends PropertyTypePlatformSpecific
- object ReadError extends Serializable
- object TupleConversion