import $ivy.`io.github.jto:validation-xml_2.12:2.1.1`
import jto.validation._
import jto.validation.xml._
import jto.validation.xml.Rules._
import scala.xml._
import scala.reflect.runtime.universe._

final case class Test(x: Int, y: Int)

implicit val testR: Rule[Node, Test] =
  From[Node] { __ =>
    ((__ \ "x").read[Int] ~
     (__ \ "y").read[Int])(Test.apply)
  }


val xml1 =
  <Truc>
    <Test>
      <x>1</x>
      <y>2</y>
    </Test>
    <Test>
      <x>3</x>
      <y>4</y>
    </Test>
    <Test>
      <x>5</x>
      <y>6</y>
    </Test>
  </Truc>

val xml2 =
 <Machin>
    <Tasp>
      <x>1</x>
      <y>2</y>
    </Tasp>
    <Tiks>
      <x>3</x>
      <y>4</y>
    </Tiks>
    <Tops>
      <x>5</x>
      <y>6</y>
    </Tops>
  </Machin>

val xml3 = <Machin></Machin>

val fullR: Rule[Node, Seq[Test]] =
  From[Node] { __ =>
    __.read[Seq[Test]]{ p => Rules.pickInNode(p)(Rules.pickSeq(testR)) }
  }

fullR.validate(xml1)
fullR.validate(xml2)
fullR.validate(xml3)

/*
showCode((reify { From[Node] { __ =>
    __.read[Option[Seq[Test]]]
  } }).tree)
*/

// OPT: { p => ooo(p)({ p => pickInNode(p)(RuleLike.zero) }, pickSeq(cmd15.testR))) }