Skip to content

Commit

Permalink
Disable comma separation in values in ZIO for complex configs handled…
Browse files Browse the repository at this point in the history
… by zio-config (#1114)


* Allow users to disable/enable considering comma separated value as list
  • Loading branch information
afsalthaj committed Mar 9, 2023
1 parent 5519412 commit 1c9d98d
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 41 deletions.
Expand Up @@ -27,29 +27,28 @@ object TypesafeConfigProvider {
* ConfigProvider.fromResourcePath.load(deriveConfig[MyConfig])
* }}}
*/
def fromResourcePath: ConfigProvider =
fromTypesafeConfig(ConfigFactory.load.resolve)
def fromResourcePath(enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
fromTypesafeConfig(ConfigFactory.load.resolve, enableCommaSeparatedValueAsList)

/**
* Retrieve a `ConfigProvider` from `typesafe-config` from a given config file
*/
def fromHoconFile[A](file: File): ConfigProvider =
fromTypesafeConfig(ConfigFactory.parseFile(file).resolve)
def fromHoconFile[A](file: File, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
fromTypesafeConfig(ConfigFactory.parseFile(file).resolve, enableCommaSeparatedValueAsList)

/**
* Retrieve a `ConfigProvider` from `typesafe-config` from a path to a config file
*/
def fromHoconFilePath[A](filePath: String): ConfigProvider =
fromHoconFile(new File(filePath))
def fromHoconFilePath[A](filePath: String, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
fromHoconFile(new File(filePath), enableCommaSeparatedValueAsList)

/**
* Retrieve a `ConfigProvider` from `typesafe-config` HOCON string.
*/
def fromHoconString(input: String, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
fromTypesafeConfig(ConfigFactory.parseString(input).resolve, enableCommaSeparatedValueAsList)

def fromHoconString(input: String): ConfigProvider =
fromTypesafeConfig(ConfigFactory.parseString(input).resolve)

def fromTypesafeConfig(config: com.typesafe.config.Config): ConfigProvider = {
def fromTypesafeConfig(config: com.typesafe.config.Config, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider = {
lazy val hiddenDelim = "\uFEFF"

val indexedMapWithHiddenDelimiter =
Expand All @@ -59,7 +58,8 @@ object TypesafeConfigProvider {

ConfigProvider.fromMap(
indexedMapWithHiddenDelimiter,
pathDelim = hiddenDelim
pathDelim = hiddenDelim,
seqDelim = if(enableCommaSeparatedValueAsList) "," else hiddenDelim
)
}

Expand Down
21 changes: 11 additions & 10 deletions typesafe/shared/src/main/scala/zio/config/typesafe/package.scala
Expand Up @@ -7,22 +7,23 @@ import java.io.File
package object typesafe {

implicit class FromConfigSourceTypesafe(configProvider: ConfigProvider.type) {
def fromResourcePath: ConfigProvider =
TypesafeConfigProvider.fromResourcePath
def fromResourcePath(enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
TypesafeConfigProvider.fromResourcePath(enableCommaSeparatedValueAsList)

def fromHoconFile[A](file: File): ConfigProvider =
TypesafeConfigProvider.fromHoconFile(file)
def fromHoconFile[A](file: File, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
TypesafeConfigProvider.fromHoconFile(file, enableCommaSeparatedValueAsList)

def fromHoconFilePath[A](filePath: String): ConfigProvider =
TypesafeConfigProvider.fromHoconFilePath(filePath)
def fromHoconFilePath[A](filePath: String, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
TypesafeConfigProvider.fromHoconFilePath(filePath, enableCommaSeparatedValueAsList)

def fromHoconString(input: String): ConfigProvider =
TypesafeConfigProvider.fromHoconString(input)
def fromHoconString(input: String, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
TypesafeConfigProvider.fromHoconString(input, enableCommaSeparatedValueAsList)

def fromTypesafeConfig(
rawConfig: com.typesafe.config.Config
rawConfig: com.typesafe.config.Config,
enableCommaSeparatedValueAsList: Boolean = false
): ConfigProvider =
TypesafeConfigProvider.fromTypesafeConfig(rawConfig)
TypesafeConfigProvider.fromTypesafeConfig(rawConfig, enableCommaSeparatedValueAsList)
}

}
26 changes: 16 additions & 10 deletions yaml/shared/src/main/scala/zio/config/yaml/YamlConfigProvider.scala
Expand Up @@ -33,8 +33,8 @@ object YamlConfigProvider {
* .flatMap(source => read(deriveConfig[MyConfig] from source)))
* }}}
*/
def fromYamlFile(file: File): ConfigProvider =
getIndexedConfigProvider(loadYaml(file))
def fromYamlFile(file: File, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
getIndexedConfigProvider(loadYaml(file), enableCommaSeparatedValueAsList)

/**
* Retrieve a `ConfigSource` from yaml path.
Expand All @@ -50,8 +50,8 @@ object YamlConfigProvider {
* .flatMap(source => read(deriveConfig[MyConfig] from source)))
* }}}
*/
def fromYamlPath(path: Path): ConfigProvider =
fromYamlFile(path.toFile)
def fromYamlPath(path: Path, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
fromYamlFile(path.toFile, enableCommaSeparatedValueAsList)

/**
* Retrieve a `ConfigSource` from yaml reader.
Expand Down Expand Up @@ -82,9 +82,10 @@ object YamlConfigProvider {
* }}}
*/
def fromYamlReader(
reader: Reader
reader: Reader,
enableCommaSeparatedValueAsList: Boolean = false
): ConfigProvider = {
getIndexedConfigProvider(loadYaml(reader))
getIndexedConfigProvider(loadYaml(reader), enableCommaSeparatedValueAsList)
}

/**
Expand All @@ -104,13 +105,14 @@ object YamlConfigProvider {
* }}}
*/
def fromYamlString(
yamlString: String
yamlString: String,
enableCommaSeparatedValueAsList: Boolean = false
): ConfigProvider = {
val configStream = new ByteArrayInputStream(yamlString.getBytes(Charset.forName("UTF-8")))
fromYamlReader(new BufferedReader(new InputStreamReader(configStream)))
fromYamlReader(new BufferedReader(new InputStreamReader(configStream)), enableCommaSeparatedValueAsList)
}

private[yaml] def getIndexedConfigProvider(data: AnyRef): ConfigProvider = {
private[yaml] def getIndexedConfigProvider(data: AnyRef, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider = {
def flattened(data: AnyRef, chunk: Chunk[String]): Map[Chunk[String], String] =
data match {
case null => Map.empty
Expand Down Expand Up @@ -153,7 +155,11 @@ object YamlConfigProvider {

lazy val hiddenDelim = "\uFEFF"

ConfigProvider.fromMap(flattened(data, Chunk.empty).map({ case (k, v) => (k.mkString(hiddenDelim), v) }), pathDelim = hiddenDelim)
ConfigProvider.fromMap(
flattened(data, Chunk.empty).map({ case (k, v) => (k.mkString(hiddenDelim), v) }),
pathDelim = hiddenDelim,
seqDelim = if (enableCommaSeparatedValueAsList) "," else hiddenDelim
)

}

Expand Down
23 changes: 13 additions & 10 deletions yaml/shared/src/main/scala/zio/config/yaml/package.scala
Expand Up @@ -7,26 +7,29 @@ import java.nio.file.Path

package object yaml {
implicit class FromConfigSourceYaml(c: ConfigProvider.type) {
def fromYamlFile(file: File): ConfigProvider =
YamlConfigProvider.fromYamlFile(file)
def fromYamlFile(file: File, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
YamlConfigProvider.fromYamlFile(file, enableCommaSeparatedValueAsList)

def fromYamlPath(path: Path): ConfigProvider =
YamlConfigProvider.fromYamlPath(path)
def fromYamlPath(path: Path, enableCommaSeparatedValueAsList: Boolean = false): ConfigProvider =
YamlConfigProvider.fromYamlPath(path, enableCommaSeparatedValueAsList)

def fromYamlReader(
reader: Reader
reader: Reader,
enableCommaSeparatedValueAsList: Boolean = false
): ConfigProvider =
YamlConfigProvider.fromYamlReader(reader)
YamlConfigProvider.fromYamlReader(reader, enableCommaSeparatedValueAsList)

def fromYamlString(
yamlString: String
yamlString: String,
enableCommaSeparatedValueAsList: Boolean = false
): ConfigProvider =
YamlConfigProvider.fromYamlString(yamlString)
YamlConfigProvider.fromYamlString(yamlString, enableCommaSeparatedValueAsList)

def fromYamlRepr[A](repr: A)(
loadYaml: A => AnyRef
loadYaml: A => AnyRef,
enableCommaSeparatedValueAsList: Boolean = false
): ConfigProvider =
YamlConfigProvider.getIndexedConfigProvider(loadYaml(repr))
YamlConfigProvider.getIndexedConfigProvider(loadYaml(repr), enableCommaSeparatedValueAsList)
}

}

0 comments on commit 1c9d98d

Please sign in to comment.