Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolved issue with dropping duplicate keys #36

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

Michaelt293
Copy link

@Michaelt293 Michaelt293 commented Apr 26, 2018

I am currently using moultingyaml and have ran into the issue of duplicate keys being dropped (see #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
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant