Skip to content

Instantly share code, notes, and snippets.

@phdoerfler
Last active April 13, 2021 07:08
Show Gist options
  • Save phdoerfler/22623b64fbc11e556078641855cdea40 to your computer and use it in GitHub Desktop.
Save phdoerfler/22623b64fbc11e556078641855cdea40 to your computer and use it in GitHub Desktop.
VS Code Snippet to promote tuples to case classes in Circe

What does it look like

import io.circe._
case class Fnord(thing: Int, otherThing: Double)
object Fnord {
  implicit val codec: Codec[Fnord] = Codec.from(
    implicitly[Decoder[(Int, Double)]].map((Fnord.apply _).tupled),
    implicitly[Encoder[(Int, Double)]].contramap(r => Fnord.unapply(r).get)
  )
}

Instructions

Paste these lines into your scala.json:

"Case class tuple codec": {
  "prefix": "scircetuple",
  "body": [
    "import io.circe._",
    "case class ${1:MyCaseClass}(${2:_1}: ${3:Double}, ${4:_2}: ${5:String})",
    "object ${1} {",
    "  implicit val codec: Codec[${1}] = Codec.from(",
    "    implicitly[Decoder[(${3}, ${5})]].map((${1}.apply _).tupled),",
    "    implicitly[Encoder[(${3}, ${5})]].contramap(r => (r.${2}, r.${4}))",
    "  )",
    "}"
  ],
  "description": "Creates a case class and codec for dealing with tuples in circe, AKA arrays with mixed types"
},
"Case class tuple codec 2": {
  "prefix": "scircetuple",
  "body": [
    "import io.circe._",
    "case class ${1:MyCaseClass}(${2:_1}: ${3:Double}, ${4:_2}: ${5:String})",
    "object ${1} {",
    "  implicit val codec: Codec[${1}] = Codec.from(",
    "    implicitly[Decoder[(${3}, ${5})]].map((${1}.apply _).tupled),",
    "    implicitly[Encoder[(${3}, ${5})]].contramap(r => ${1}.unapply(r).get)",
    "  )",
    "}"
  ],
  "description": "Creates a case class and codec for dealing with tuples in circe, AKA arrays with mixed types"
}

How to get there?

Cmd+Shift+P -> "Preferences: Configure User Snippets" -> "scala"

See: docs

Thanks

HT to yurique from the circe gitter

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment