diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39359f4d..1cf4d4bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -92,11 +92,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: mkdir -p modules/circe/.jvm/target target .js/target modules/docs/target modules/core/js/target modules/circe/.js/target modules/core/jvm/target modules/tests/js/target .jvm/target .native/target modules/refined/.js/target modules/refined/.jvm/target modules/tests/jvm/target modules/example/target project/target + run: mkdir -p modules/circe/.jvm/target target .js/target modules/docs/target modules/core/js/target modules/circe/.js/target modules/core/jvm/target modules/tests/js/target .jvm/target .native/target modules/refined/.js/target modules/refined/.jvm/target modules/tests/jvm/target modules/scalaxml/target modules/example/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: tar cf targets.tar modules/circe/.jvm/target target .js/target modules/docs/target modules/core/js/target modules/circe/.js/target modules/core/jvm/target modules/tests/js/target .jvm/target .native/target modules/refined/.js/target modules/refined/.jvm/target modules/tests/jvm/target modules/example/target project/target + run: tar cf targets.tar modules/circe/.jvm/target target .js/target modules/docs/target modules/core/js/target modules/circe/.js/target modules/core/jvm/target modules/tests/js/target .jvm/target .native/target modules/refined/.js/target modules/refined/.jvm/target modules/tests/jvm/target modules/scalaxml/target modules/example/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') diff --git a/build.sbt b/build.sbt index 3d6c040b..eaeeff79 100644 --- a/build.sbt +++ b/build.sbt @@ -136,7 +136,7 @@ lazy val commonSettings = Seq( lazy val skunk = tlCrossRootProject .settings(name := "skunk") - .aggregate(core, tests, circe, refined, example) + .aggregate(core, tests, circe, refined, example, `scala-xml`) .settings(commonSettings) lazy val core = crossProject(JVMPlatform, JSPlatform) @@ -198,10 +198,26 @@ lazy val circe = crossProject(JVMPlatform, JSPlatform) ) ) +lazy val `scala-xml` = project + .in(file("modules/scalaxml")) + .dependsOn(core.jvm) + .settings( + tlVersionIntroduced := List("2.12", "2.13", "3").map(_ -> "0.3.2").toMap + ) + .enablePlugins(AutomateHeaderPlugin) + .settings(commonSettings) + .settings( + name := "skunk-scala-xml", + libraryDependencies ++= Seq( + "org.scala-lang.modules" %% "scala-xml" % "2.1.0" + ) + ) + lazy val tests = crossProject(JVMPlatform, JSPlatform) .crossType(CrossType.Full) .in(file("modules/tests")) .dependsOn(core, circe) + .jvmConfigure(_.dependsOn(`scala-xml`)) .enablePlugins(AutomateHeaderPlugin, NoPublishPlugin) .settings(commonSettings) .settings( diff --git a/modules/scalaxml/src/main/scala/XmlCodecs.scala b/modules/scalaxml/src/main/scala/XmlCodecs.scala new file mode 100644 index 00000000..a5f8a74f --- /dev/null +++ b/modules/scalaxml/src/main/scala/XmlCodecs.scala @@ -0,0 +1,20 @@ +// Copyright (c) 2018-2021 by Rob Norris +// This software is licensed under the MIT License (MIT). +// For more information see LICENSE or https://opensource.org/licenses/MIT + +package skunk +package scalaxml.codec + +import cats.syntax.all._ + +import scala.xml._ +import skunk.data.{Arr, Type} + +trait XmlCodecs { + val xml: Codec[Elem] = Codec.simple(_.toString, s => Either.catchNonFatal(XML.loadString(s)).leftMap(_.getMessage), Type.xml) + val _xml: Codec[Arr[Elem]] = Codec.array(_.toString, s => Either.catchNonFatal(XML.loadString(s)).leftMap(_.getMessage), Type._xml) +} + +object xml extends XmlCodecs + +object all extends XmlCodecs diff --git a/modules/tests/jvm/src/test/scala/codec/XmlCodecTest.scala b/modules/tests/jvm/src/test/scala/codec/XmlCodecTest.scala new file mode 100644 index 00000000..eab57535 --- /dev/null +++ b/modules/tests/jvm/src/test/scala/codec/XmlCodecTest.scala @@ -0,0 +1,21 @@ +// Copyright (c) 2018-2021 by Rob Norris +// This software is licensed under the MIT License (MIT). +// For more information see LICENSE or https://opensource.org/licenses/MIT + +package tests +package codec + +import cats.Eq +import skunk.scalaxml.codec.all._ + +import scala.xml.{Elem, XML} + +class XmlCodecTest extends CodecTest { + implicit val eq: Eq[Elem] = Eq.fromUniversalEquals + + val x: Elem = XML.loadString("bar") + + roundtripTest(xml)(x) +} + +