Skip to content

Commit

Permalink
Update quick example and modules documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
vlovgr committed Oct 4, 2022
1 parent 4f2ece5 commit c7f537e
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 52 deletions.
47 changes: 27 additions & 20 deletions docs/src/main/mdoc/modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,41 +10,43 @@ The following sections describe the additional modules.
The `@CIRCE_MODULE_NAME@` module provides [`ConfigDecoder`][configdecoder]s for JSON using [Circe](https://github.com/circe/circe).

```scala mdoc
import ciris._
import ciris.circe._
import ciris.ConfigDecoder
import io.circe.{Decoder, Json}

ConfigDecoder[String, Json]
import io.circe.Decoder

case class SerialNumber(value: String)

object SerialNumber {
implicit val serialNumberDecoder: Decoder[SerialNumber] =
Decoder[String].map(apply)

implicit val serialNumberConfigDecoder: ConfigDecoder[String, SerialNumber] =
circeConfigDecoder("SerialNumber")
}

circeConfigDecoder[SerialNumber]("SerialNumber")
env("SERIAL").as[SerialNumber]
```

## Circe YAML

The `@CIRCE_YAML_MODULE_NAME@` module provides [`ConfigDecoder`][configdecoder]s for YAML using [`circe-yaml`](https://github.com/circe/circe-yaml).

```scala mdoc:reset
import ciris._
import ciris.circe.yaml._
import ciris.ConfigDecoder
import io.circe.{Decoder, Json}

ConfigDecoder[String, Json]
import io.circe.Decoder

case class SerialNumber(value: String)

object SerialNumber {
implicit val serialNumberDecoder: Decoder[SerialNumber] =
Decoder[String].map(apply)

implicit val serialNumberConfigDecoder: ConfigDecoder[String, SerialNumber] =
circeYamlConfigDecoder("SerialNumber")
}

circeYamlConfigDecoder[SerialNumber]("SerialNumber")
env("SERIAL").as[SerialNumber]
```

## Enumeratum
Expand All @@ -53,7 +55,8 @@ The `@ENUMERATUM_MODULE_NAME@` module provides [`ConfigDecoder`][configdecoder]s

For regular `Enum`s, also mix in `CirisEnum` to derive a [`ConfigDecoder`][configdecoder] instance.

```scala mdoc
```scala mdoc:reset
import ciris.env
import enumeratum.{CirisEnum, Enum, EnumEntry}
import enumeratum.EnumEntry.Lowercase

Expand All @@ -68,12 +71,13 @@ object Suit extends Enum[Suit] with CirisEnum[Suit] {
val values = findValues
}

ConfigDecoder[String, Suit]
env("SUIT").as[Suit]
```

For `ValueEnum`s, also mix in the matching `CirisValueEnum` to derive a [`ConfigDecoder`][configdecoder] instance.

```scala mdoc
```scala mdoc:reset
import ciris.env
import enumeratum.values.{StringCirisEnum, StringEnum, StringEnumEntry}

sealed abstract class Color(val value: String) extends StringEnumEntry
Expand All @@ -86,40 +90,43 @@ object Color extends StringEnum[Color] with StringCirisEnum[Color] {
val values = findValues
}

ConfigDecoder[String, Color]
env("COLOR").as[Color]
```

## Http4s

The `@HTTP4S_MODULE_NAME@` module provides [`ConfigDecoder`][configdecoder]s for the [http4s](https://github.com/http4s/http4s) `Uri` type.

```scala mdoc
```scala mdoc:reset
import ciris.env
import ciris.http4s._
import org.http4s.Uri

ConfigDecoder[String, Uri]
env("URI").as[Uri]
```

## Refined

The `@REFINED_MODULE_NAME@` module provides [`ConfigDecoder`][configdecoder]s for [refined](https://github.com/fthomas/refined) refinement types.

```scala mdoc
```scala mdoc:reset
import ciris.env
import ciris.refined._
import eu.timepit.refined.types.numeric.PosInt

ConfigDecoder[String, PosInt]
env("POS_INT").as[PosInt]
```

## Squants

The `@SQUANTS_MODULE_NAME@` module provides [`ConfigDecoder`][configdecoder]s for [squants](https://github.com/typelevel/squants) quantities.

```scala mdoc
```scala mdoc:reset
import ciris.env
import ciris.squants._
import squants.market.Money

ConfigDecoder[String, Money]
env("MONEY").as[Money]
```

[configdecoder]: @API_BASE_URL@/ConfigDecoder.html
50 changes: 18 additions & 32 deletions docs/src/main/mdoc/quick-example.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Following is an example showing how to:
- use `load` to return an effect for loading the configuration.

```scala mdoc:reset-object:silent
import cats.effect.{ExitCode, IO, IOApp}
import cats.effect.{IO, IOApp}
import cats.syntax.all._
import ciris._
import ciris.refined._
Expand Down Expand Up @@ -45,7 +45,7 @@ type ApiKey = String Refined MatchesRegex["[a-zA-Z0-9]{25,40}"]
type DatabasePassword = String Refined MinSize[30]

final case class ApiConfig(
port: UserPortNumber,
port: Option[UserPortNumber],
key: Secret[ApiKey],
timeout: Option[FiniteDuration]
)
Expand All @@ -56,26 +56,20 @@ final case class DatabaseConfig(
)

final case class Config(
appName: NonEmptyString,
environment: AppEnvironment,
name: NonEmptyString,
api: ApiConfig,
database: DatabaseConfig
)

def apiConfig(environment: AppEnvironment): ConfigValue[Effect, ApiConfig] =
(
env("API_PORT").or(prop("api.port")).as[UserPortNumber].option,
env("API_KEY").as[ApiKey].secret
).parMapN { (port, key) =>
ApiConfig(
port = port getOrElse 9000,
key = key,
timeout = environment match {
case Local | Testing => None
case Production => Some(10.seconds)
}
)
}
env("API_KEY").as[ApiKey].secret,
default(environment match {
case Local | Testing => None
case Production => Some(10.seconds)
})
).parMapN(ApiConfig)

val databaseConfig: ConfigValue[Effect, DatabaseConfig] =
(
Expand All @@ -84,22 +78,14 @@ val databaseConfig: ConfigValue[Effect, DatabaseConfig] =
).parMapN(DatabaseConfig)

val config: ConfigValue[Effect, Config] =
env("APP_ENV").as[AppEnvironment].flatMap { environment =>
(
apiConfig(environment),
databaseConfig
).parMapN { (api, database) =>
Config(
appName = "my-api",
environment = environment,
api = api,
database = database
)
}
}

object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] =
config.load[IO].as(ExitCode.Success)
(
default("my-api").as[NonEmptyString],
env("APP_ENV").as[AppEnvironment].flatMap(apiConfig),
databaseConfig
).parMapN(Config)

object Main extends IOApp.Simple {
def run: IO[Unit] =
config.load[IO].flatMap(IO.println)
}
```

0 comments on commit c7f537e

Please sign in to comment.