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