Scala JSON-Codecs Backend Documentation
This document provides a description of the JSON codecs backend.
The Json Codecs Backend for Scala contains functions to generate Codecs from types in the IR.
Circe is used as the base JSON library.
graph TD;
Backend-->Core;
Backend-->Features
The Scala backend is split into two aspects: \
- Core - the core Scala codes representing the user business logic
- Feature - the Codecs for each type defined in the input model
1. Elm Type to Scala Type Mapping
This section describes the mapping of Elm types to Scala Codec. It's important to note that all codecs generated from the Elm types are Scala values defined in the Scala AST. The Codec files generated contains value declarations as lamda functions. Below is an outline of how each type is mapped
Variable
Variable types in Elm are mapped to Scala Variables
Reference
Reference types in Elm are mapped to Scala Ref which uses the Elm path and name to create a Scala Ref value
Tuple
Not completed yet
Record
An Elm record type maps to Circe object which consists of a list of fields which are applied to the Circe.json.obj function.
ExtensibleRecord
Similar to a record
Function
Functions are currently not mapped.
Unit
Functions are currently not mapped.
Custom Type Definition
Codecs for custom types are composed using helper functions.
2. Scala Json Codecs Backend Functions
The following functions are defined in the Scala Json Codecs backend
MapModuleDefinitionToCodecs
This function takes a modules definition and generates the encoders and decoders for the types defined in that module
generateEncodeReference
Generates and encoder reference for the input type using the FQName
generateDecodeReference
Generates and decoder reference for the input type using the FQName
mapTypeDefinitionToEncoder
Type definition could be any of the following:
Type Alias Definition - maps to an encoder for record type
Custom Type Definition - uses helper functions to build encoder for custom
types \
mapTypeDefinitionToDecoder
Type definition could be any of the following:
Type Alias Definition - maps to an encoder for record type
Custom Type Definition - uses helper functions to build encoder for custom
types \
mapCustomTypeDefinitionToEncoder
Builds encoder for custom type using pattern matching
mapCustomTypeDefinitionToDecoder
Builds a decoder for custom type using pattern mathing on the type constructors.
composeEncoders
Builds an encoder for one member of a union type
composeDecoders
Builds a decoder for on member of a union type using for comprehension.
3. Conditionally Generate Codecs
Codecs can be generated conditionally by adding the --s flag to the morphir-elm gen command.