rapture icon indicating copy to clipboard operation
rapture copied to clipboard

XML: extraction from nested structures with customized behavior

Open juanjovazquez opened this issue 7 years ago • 1 comments

Xml module is not able to dispatch a valid Extractor from nested structures when the extraction of some middle elements has been customized. The behavior has been observed starting from nested structures greater than three elements. See the next code snippet as an example of this issue:

object RaptureXmlOk {
  import rapture.xml._

  case class Foo(bar: Bar)
  case class Bar(baz: Baz)
  case class Baz(qux: Qux)
  case class Qux(value: String)

  implicitly[Extractor[Bar, Xml]] // works
  implicitly[Extractor[Foo, Xml]] // works
}

// REPL
// :paste
// Entering paste mode (ctrl-D to finish)
// CTRL +D
// Exiting paste mode, now interpreting.
// defined object RaptureXmlOk

object RaptureXmlKo {
  import rapture.xml._, xmlBackends.stdlib._

  case class Foo(bar: Bar)
  case class Bar(baz: Baz)
  case class Baz(qux: Qux)
  object Baz {
    // custom extractor in order to be able to extract this:
    // xml"""<foo><bar><baz><value>xxx</value></baz></bar></foo>""".as[Foo]
    // i.e. without the extra <qux>...</qux>
    implicit val bazExtractor: Extractor[Baz, Xml] =
      Xml.extractor[Qux].map(Baz(_))
  }
  case class Qux(value: String)

  implicitly[Extractor[Bar, Xml]] // works
  implicitly[Extractor[Foo, Xml]] // fails!!!
}

// REPL
// :paste
// Entering paste mode (ctrl-D to finish)
// CTRL +D
// Exiting paste mode, now interpreting.
// <console>:27: error: cannot extract type RaptureXmlKo.Foo from rapture.xml.Xml.
//  implicitly[Extractor[Foo, Xml]] // fails!!!

juanjovazquez avatar Mar 13 '17 12:03 juanjovazquez

Thanks for the report, @juanjovazquez! We've shifted development to a complete rewrite called Xylophone which avoids several of the fundamental problems with Rapture XML, though we haven't yet got the generic serialization and extraction done. However, I think this is a known problem, which is fixed in the latest source, and will certainly be fixed in Xylophone when it's ready. (Hopefully quite soon!)

I'll leave this open for now as a reminder to check it in Xylophone.

propensive avatar Mar 14 '17 18:03 propensive