moultingyaml
moultingyaml copied to clipboard
Resolved issue with dropping duplicate keys
I am currently using moultingyaml and have ran into the issue of duplicate keys being dropped (see https://github.com/jcazevedo/moultingyaml/issues/12 ). The fix mentioned in the issue has been merged into snakeyaml but the change was not merged into moultingyaml.
@rbuckland has made a fix on his fork - https://github.com/rbuckland/moultingyaml/blob/master/src/main/scala/net/jcazevedo/moultingyaml/package.scala
In this pull request, I have gone for a simpler option where I have simply set the parser to fail on duplicate keys. I can't think of a situation where you wouldn't want to fail on duplicate keys. Having said that, I think it it would be better to allow users to configure the behaviour they want.
Edit: I have come up with a solution that maintains backwards compatibility but gives users the ability to customise the parsing behaviour -
implicit class PimpedString(val string: String) extends AnyVal {
private def loaderOptions(allowDuplicateKeys: Boolean) = {
val loader = new LoaderOptions
loader.setAllowDuplicateKeys(allowDuplicateKeys)
loader
}
def parseYaml: YamlValue =
convertToYamlValue(new Yaml().load(string))
def parseYamls: Seq[YamlValue] =
new Yaml().loadAll(string).asScala.map(convertToYamlValue).toSeq
def parseYaml(allowDuplicateKeys: Boolean): YamlValue =
convertToYamlValue(new Yaml(loaderOptions(allowDuplicateKeys)).load(string))
def parseYamls(allowDuplicateKeys: Boolean): Seq[YamlValue] =
new Yaml(loaderOptions(allowDuplicateKeys)).loadAll(string).asScala.map(convertToYamlValue).toSeq
}
}