https://github.com/tkroman/micromarshal
Autoderivation of Akka HTTP marshallers/unmarshallers with uPickle
https://github.com/tkroman/micromarshal
akka-http json scalameta upickle
Last synced: 5 months ago
JSON representation
Autoderivation of Akka HTTP marshallers/unmarshallers with uPickle
- Host: GitHub
- URL: https://github.com/tkroman/micromarshal
- Owner: tkroman
- License: mit
- Created: 2017-03-05T01:31:15.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2017-03-08T13:23:32.000Z (over 9 years ago)
- Last Synced: 2025-10-25T05:51:41.264Z (8 months ago)
- Topics: akka-http, json, scalameta, upickle
- Language: Scala
- Homepage:
- Size: 42 KB
- Stars: 3
- Watchers: 0
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# micromarshal
[](https://gitter.im/micromarshal/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Autoderivation of Akka-HTTP marshallers/unmarshallers with [uPickle](http://www.lihaoyi.com/upickle-pprint/upickle) in < 200 LOC.
## Usage
### Dependency
Very much beta. Cross-build for scala 2.11/2.12.
`"com.tkroman" %% "micromarshal" % "0.0.8"`
In order to expand macro annotations client projects should also have these options enabled:
```scala
lazy val expandMacroAnnotations: Seq[Def.Setting[_]] = Seq(
addCompilerPlugin(
("org.scalameta" % "paradise" % "3.0.0-M7").cross(CrossVersion.full)
),
libraryDependencies +=
"org.scalameta" %% "scalameta" % "1.6.0" % Provided,
scalacOptions += "-Xplugin-require:macroparadise",
// macroparadise plugin doesn't work in repl yet.
scalacOptions in (Compile, console) := Seq(),
// macroparadise doesn't work with scaladoc yet.
sources in (Compile, doc) := Nil
)
```
### Code
[Full example in tests](src/test/scala/com/tkroman/micromarshal/MarshallingSuite.scala)
In short: just slap `@com.tkroman.micromarshal.deriveAkkaMarshalling` on your case class
or sealed trait to get an automatic upickle-powered JSON encoding/decoding support + Akka HTTP (un)marshallers.
```scala
import com.tkroman.micromarshal.deriveAkkaMarshalling
@deriveAkkaMarshalling
case class Foo(str: String)
```
so later in your Akka-HTTP router you can do this:
```scala
get {
path("foo") {
complete(Foo("content"))
}
}
```
## Hygiene
Micromarshal does not rely on generation of fresh names and does not employ typechecking of any kind
to ensure that companion objects of classes already contain implicit `ReadWriter` definitions.
Instead, there is a simple convention:
if the companion object contains a definition of type `upickle.default.ReadWriter[A]`
(or `custom.pickler.ReadWriter[A]`),
no `ReadWriter` implicit is generated. This might come in handy when a need arises to
[manually define and instance for a sealed hierarchy](http://www.lihaoyi.com/upickle-pprint/upickle/#ManualSealedTraitPicklers).
## Custom (un)picklers
Consistently with uPickle, `deriveAkkaMarshalling` accepts a custom pickler. For example:
```scala
package a.b.c
object CustomPickler extends upickle.AttributeTagged {
// custom pickling here
}
@deriveAkkaMarshalling("a.b.c.OptionPickler")
case class Foo(x: Int)
```
## TODO
* Abstraction over JSON library (would like to support circe)