Skip to content

Commit 1103976

Browse files
Add vulcan avro integration (#418)
1 parent 6c7a39a commit 1103976

File tree

5 files changed

+70
-1
lines changed

5 files changed

+70
-1
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ jobs:
6868
run: sbt ++${{ matrix.scala }} test
6969

7070
- name: Compress target directories
71-
run: tar cf targets.tar modules/tests/target modules/tethys/target modules/pureconfig/target modules/catsTagless/target modules/ciris/target modules/scalacheck/target modules/circeMagnolia/target modules/circe/target target modules/tethysMagnolia/target modules/cats/target modules/core/target modules/sangria/target modules/reactivemongo/target project/target
71+
run: tar cf targets.tar modules/tests/target modules/tethys/target modules/pureconfig/target modules/catsTagless/target modules/ciris/target modules/scalacheck/target modules/circeMagnolia/target modules/circe/target target modules/tethysMagnolia/target modules/cats/target modules/core/target modules/vulcan/target modules/sangria/target modules/reactivemongo/target project/target
7272

7373
- name: Upload target directories
7474
uses: actions/upload-artifact@v2

build.sbt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ lazy val derevo = project
5151
tethys,
5252
tethysMagnolia,
5353
sangria,
54+
vulcan,
5455
tests,
5556
)
5657

@@ -164,6 +165,15 @@ lazy val sangria =
164165
)
165166
.dependsOn(core)
166167

168+
lazy val vulcan =
169+
(project in file("modules/vulcan"))
170+
.settings(publishSettings)
171+
.settings(
172+
name := "derevo-vulcan",
173+
libraryDependencies ++= Seq(Dependencies.vulcanGeneric),
174+
)
175+
.dependsOn(core)
176+
167177
lazy val tests =
168178
(project in file("modules/tests"))
169179
.settings(noPublishSettings)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package derevo.vulcan
2+
3+
import derevo.{Derivation, NewTypeDerivation}
4+
import magnolia.{CaseClass, Magnolia, SealedTrait}
5+
import vulcan.Codec
6+
import vulcan.generic._
7+
8+
object avroCodec extends Derivation[Codec] with NewTypeDerivation[Codec] {
9+
10+
type Typeclass[A] = Codec[A]
11+
12+
def combine[A](caseClass: CaseClass[Codec, A]): Codec[A] = Codec.combine(caseClass)
13+
14+
def dispatch[A](sealedTrait: SealedTrait[Codec, A]): Codec.Aux[Any, A] = Codec.dispatch(sealedTrait)
15+
16+
def instance[A]: Codec[A] = macro Magnolia.gen[A]
17+
18+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package derevo.vulcan
2+
3+
import org.apache.avro.Schema
4+
import derevo.derive
5+
import org.scalatest.Assertion
6+
import org.scalatest.flatspec.AnyFlatSpec
7+
import org.scalatest.matchers.should.Matchers
8+
import vulcan.Codec
9+
import vulcan.generic.{AvroDoc, AvroName}
10+
11+
import java.time.Instant
12+
13+
@derive(avroCodec)
14+
case class Foo(i: Int, s: String, bar: Bar)
15+
16+
@derive(avroCodec)
17+
case class Bar(
18+
@AvroName("time_dttm") @AvroDoc("Timestamp")
19+
timestamp: Instant,
20+
@AvroName("int_list") @AvroDoc("List of ints")
21+
intList: List[Int]
22+
)
23+
24+
class AvroCodecTest extends AnyFlatSpec with Matchers {
25+
26+
val fooSchema: String =
27+
"""{"type":"record","name":"Foo","namespace":"derevo.vulcan","fields":[{"name":"i","type":"int"},{"name":"s","type":"string"},{"name":"bar","type":{"type":"record","name":"Bar","fields":[{"name":"time_dttm","type":{"type":"long","logicalType":"timestamp-millis"},"doc":"Timestamp"},{"name":"int_list","type":{"type":"array","items":"int"},"doc":"List of ints"}]}}]}"""
28+
29+
def assertSchema[A: Codec](schemaStr: String): Assertion = {
30+
val expectedSchema = new Schema.Parser().parse(schemaStr.mkString.trim)
31+
Codec[A].schema shouldBe Right(expectedSchema)
32+
}
33+
34+
"Writer derivation for ADT" should "work correctly" in {
35+
assertSchema[Foo](fooSchema)
36+
}
37+
}

project/Dependencies.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ object Dependencies {
4141
val macroParadise = "2.1.1"
4242

4343
val sangria = "3.2.0"
44+
45+
val vulcan = "1.10.1"
4446
}
4547

4648
lazy val magnolia = "com.propensive" %% "magnolia" % Version.magnolia
@@ -66,6 +68,8 @@ object Dependencies {
6668
lazy val estatico = "io.estatico" %% "newtype" % Version.estatico
6769
lazy val supertagged = "org.rudogma" %% "supertagged" % Version.supertagged
6870

71+
lazy val vulcanGeneric = "com.github.fd4s" %% "vulcan-generic" % Version.vulcan
72+
6973
lazy val macroParadise = "org.scalamacros" % "paradise" % Version.macroParadise cross CrossVersion.patch
7074
lazy val kindProjector = "org.typelevel" %% "kind-projector" % Version.kindProjector cross CrossVersion.patch
7175

0 commit comments

Comments
 (0)