WIP
This commit is contained in:
parent
d51890f5bf
commit
642d8dfc73
2 changed files with 67 additions and 0 deletions
|
@ -5,6 +5,8 @@ import cats.syntax.all.*
|
||||||
import gs.config.audit.ConfigManifest
|
import gs.config.audit.ConfigManifest
|
||||||
import gs.config.audit.ConfigQueryResult
|
import gs.config.audit.ConfigQueryResult
|
||||||
import gs.config.source.ConfigSource
|
import gs.config.source.ConfigSource
|
||||||
|
import gs.config.source.EnvironmentConfigSource
|
||||||
|
import gs.config.source.MemoryConfigSource
|
||||||
|
|
||||||
final class AuditedConfiguration[F[_]: Sync](
|
final class AuditedConfiguration[F[_]: Sync](
|
||||||
val sources: List[ConfigSource[F]],
|
val sources: List[ConfigSource[F]],
|
||||||
|
@ -68,6 +70,47 @@ final class AuditedConfiguration[F[_]: Sync](
|
||||||
|
|
||||||
object AuditedConfiguration:
|
object AuditedConfiguration:
|
||||||
|
|
||||||
|
def forSources[F[_]: Sync](sources: List[ConfigSource[F]])
|
||||||
|
: F[Configuration[F]] =
|
||||||
|
ConfigManifest
|
||||||
|
.standard[F]
|
||||||
|
.map(manifest =>
|
||||||
|
new AuditedConfiguration[F](
|
||||||
|
sources = sources,
|
||||||
|
manifest = manifest
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def builder[F[_]: Sync]: Builder[F] = Builder[F](Vector.empty)
|
||||||
|
|
||||||
|
case class Builder[F[_]: Sync](sources: Vector[ConfigSource[F]]):
|
||||||
|
|
||||||
|
def withEnvironmentSource(): Builder[F] =
|
||||||
|
copy(sources = this.sources.appended(new EnvironmentConfigSource[F]))
|
||||||
|
|
||||||
|
def withMemorySource(configs: Map[String, String]): Builder[F] =
|
||||||
|
copy(sources = this.sources.appended(new MemoryConfigSource[F](configs)))
|
||||||
|
|
||||||
|
def withSource(source: ConfigSource[F]): Builder[F] =
|
||||||
|
copy(sources = this.sources.appended(source))
|
||||||
|
|
||||||
|
def build(): F[Configuration[F]] =
|
||||||
|
ConfigManifest
|
||||||
|
.standard[F]
|
||||||
|
.map(manifest =>
|
||||||
|
new AuditedConfiguration[F](
|
||||||
|
sources = sources.toList,
|
||||||
|
manifest = manifest
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
/** Internal class for accumulating a result across sources.
|
||||||
|
*
|
||||||
|
* @param sources
|
||||||
|
* The seen sources.
|
||||||
|
* @param result
|
||||||
|
* The result, or `None` if no result has been found.
|
||||||
|
*/
|
||||||
private case class Acc(
|
private case class Acc(
|
||||||
sources: Vector[String],
|
sources: Vector[String],
|
||||||
result: Option[String]
|
result: Option[String]
|
||||||
|
|
|
@ -1,4 +1,28 @@
|
||||||
package gs.config
|
package gs.config
|
||||||
|
|
||||||
|
import cats.effect.Sync
|
||||||
|
|
||||||
|
/** Interface for loading configuration.
|
||||||
|
*/
|
||||||
trait Configuration[F[_]]:
|
trait Configuration[F[_]]:
|
||||||
def getValue[A: Configurable](key: ConfigKey[A]): F[Either[ConfigError, A]]
|
def getValue[A: Configurable](key: ConfigKey[A]): F[Either[ConfigError, A]]
|
||||||
|
|
||||||
|
object Configuration:
|
||||||
|
|
||||||
|
/** Start building a new [[AuditedConfiguration]].
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* Fluent builder for the [[AuditedConfiguration]] class.
|
||||||
|
*/
|
||||||
|
def audited[F[_]: Sync]: AuditedConfiguration.Builder[F] =
|
||||||
|
AuditedConfiguration.builder[F]
|
||||||
|
|
||||||
|
/** Create a new [[AuditedConfiguration]] that reads from the environment.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* The new [[Configuration]].
|
||||||
|
*/
|
||||||
|
def auditedEnvironmentOnly[F[_]: Sync]: F[Configuration[F]] =
|
||||||
|
audited[F].withEnvironmentSource().build()
|
||||||
|
|
||||||
|
end Configuration
|
||||||
|
|
Loading…
Add table
Reference in a new issue