Skip to content
/ derevo Public
forked from tofu-tf/derevo

Multiple instance derivations inside single macro annotation

Notifications You must be signed in to change notification settings

road21/derevo

 
 

Repository files navigation

derevo

Multiple instance derivations inside a single macro annotation

CI Release
Build Status Maven Central

Installation

For Scala 2.12 and older:

addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)

For Scala 2.13:

scalacOptions += "-Ymacro-annotations"

Supported integrations

libraryDependencies += "org.manatki" %% "derevo-cats" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.catsInstances.{eq => eqv, show, order, monoid}

import cats.Monoid
import cats.instances.string._
import cats.instances.int._
import cats.syntax.show._
import cats.syntax.order._
import cats.syntax.semigroup._
import cats.syntax.monoid._

@derive(eqv, show, order, monoid)
case class Foo(bar: String, baz: Int)

assert(Foo("111", 222) === Foo("111", 222))
assert(show"${Foo("111", 222)}" === "Foo{bar=111,baz=222}")
assert((Foo("111", 222) compare Foo("222", 333)) == -1)
assert((Foo("1", 1) |+| Foo("2", 2)) == Foo("12", 3))
assert(Monoid[Foo].empty == Foo("", 0))
libraryDependencies += "org.manatki" %% "derevo-cats-tagless" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.tagless.{functor, flatMap, invariant, contravariant, functorK, invariantK, semigroupalK, applyK}

// TODO
libraryDependencies += "org.manatki" %% "derevo-tethys" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.tethysInstances.{tethysReader, tethysWriter}

import tethys._
import tethys.derivation.builder.{FieldStyle, WriterDerivationConfig}
import tethys.jackson._

@derive(
  tethysReader,
  tethysWriter(WriterDerivationConfig.withFieldStyle(FieldStyle.lowerSnakecase))
)
final case class Bar(stringName: String, integerAge: Int)

assert(Bar("Cotique", 27).asJson == """{"string_name":"Cotique","integer_age":27}""")
assert("""{"stringName":"Elya","integerAge":32}""".jsonAs[Bar] == Right(Bar("Elya", 32)))
libraryDependencies += "org.manatki" %% "derevo-circe" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.circeDerivation.{decoder, encoder}

import io.circe._
import io.circe.syntax._
import io.circe.parser._

@derive(decoder, encoder)
final case class Bar(stringName: String, integerAge: Int)

assert(Bar("KKK", 22).asJson.printWith(Printer.noSpaces) == """{"stringName":"KKK","integerAge":22}""")
assert(parse("""{"stringName":"WWW","integerAge":20}""").flatMap(_.as[Bar]) == Right(Bar("WWW", 20)))

Ciris + HOCON

libraryDependencies += "org.manatki" %% "derevo-ciris" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.cirisDerivation.cirisDecoder

import com.typesafe.config.ConfigFactory
import ciris.hocon._
import ciris.hocon.instances._

@derive(cirisDecoder)
case class DataConfig(name: String, addresses: List[String], mapping: Map[String, Int])

val source = hoconSource[DataConfig](
    ConfigFactory.parseString(
    """
      |data {
      |  name = AAA
      |  addresses = [home, work, pub]
      |  mapping.until = 1
      |  mapping.from  = 2
      |  mapping.to    = 3
      |}
      """.stripMargin
    ),
    "data"
)

// Load in F[_] context, cats.effect.IO just for example
import cats.effect.IO
import scala.concurrent.ExecutionContext.global

implicit val cs = IO.contextShift(global)

assert(source.load[IO].unsafeRunSync() == DataConfig("AAA", List("pub", "home", "work"), Map("until" -> 1, "from" -> 2, "to" -> 3)))
libraryDependencies += "org.manatki" %% "derevo-pureconfig" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.pureconfigDerivation.{pureconfigReader, pureconfigWriter}

import com.typesafe.config.ConfigFactory
import pureconfig._
import pureconfig.syntax._

@derive(pureconfigReader, pureconfigWriter)
case class DataConfig(name: String, addresses: List[String], mapping: Map[String, Int])

val raw = ConfigFactory
  .parseString(
    """
      |{
      |  name = AAA
      |  addresses = [home, work, pub]
      |  mapping.until = 1
      |  mapping.from  = 2
      |  mapping.to    = 3
      |}
        """.stripMargin
  )

val parsed = ConfigSource.fromConfig(raw).load[DataConfig]

assert(parsed == Right(DataConfig("AAA", List("home", "work", "pub"), Map("until" -> 1, "from" -> 2, "to" -> 3))))
assert(parsed.map(_.toConfig.atPath("data").getConfig("data")) == Right(raw))
libraryDependencies += "org.manatki" %% "derevo-tschema" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.tschemaInstances.{swagger, openapiParam, httpParam}

// TODO
libraryDependencies += "org.manatki" %% "derevo-rmongo" % "latest version in badge"
import org.manatki.derevo.derive
import org.manatki.derevo.reactivemongoDerivation.{bsonDocumentReader, bsonDocumentWriter}

// TODO

About

Multiple instance derivations inside single macro annotation

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Scala 100.0%