moultingyaml icon indicating copy to clipboard operation
moultingyaml copied to clipboard

Resolved issue with dropping duplicate keys

Open Michaelt293 opened this issue 6 years ago • 0 comments

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
  }
}

Michaelt293 avatar Apr 26 '18 10:04 Michaelt293