Comments (4)
I am not sure what is the actual use case here.
If it's only about serialization, then there is a plenty libraries that do exactly that e.g. Circe. Because functions are composable, you could use Circe generic/derivation to create Encoders/Decoders. If there is a mismatch between JSON and case class format then optics can solve that.
If it's not about serialization. but some generic structure I am still not sure what would be benefit of using chimney here. Configuration of a custom behavior could require so much code, that writing shapeless by hand could be faster (or maybe magnolia). The main driving force behind chimney is that both input and output format are known at compile time and the transformation cannot fail.
from chimney.
The use case is indeed serialization. What's different about Chimney vs Circe (AFAICT) is that to my eyes, Chimney looks like an object mapper whereas Circe looks like a serializer.
With Chimney you're describing how the fields between two types match each other (ex: .withFieldRenamed(_.addict, _.forAddict)
) using actual field references (which are refactoring safe) without having to explicitly construct the destination object and pass in the fields, and that's awesome. This also means that in theory you could use the same mappings bi-directionally, as some object mappers do.
Of course Chimney mappings currently appear to be defined per object instance (ex: command.into[CoffeeMade]
) rather than per type (ex: Chimney.mapperFor[Command, CoffeeMade]
, but I assume per type should be possible. This alone would be a nice enhancement to Chimney, where the same mappings could be used on multiple instances of some type.
You're right though that as far as mapping to map-like structures goes, you can't guarantee that the types will match for each field in the map, but that's a general deserialization problem.
from chimney.
Regarding mapping between types, you can always define implicit Transformer[A, B]
which you can tune as you want. Then such transformer is picked from implicit scope by the macro each time we require transformation from A
to B
(including nested types). I can't see urgent reason to provide extra syntax for it.
What you originally suggested was not exactly mapping (transforming) task, but (de)serialization from map-like structures which are known not to be strongly typed, thus you have to deal with error handling (missing fields, wrong types, etc.). This is not in scope of Chimney library.
Instead, for such use case I would suggest either to:
- define serialization type class and use type class derivation (shapeless, magnolia or own macro) to save you from writing mappings manually, but to generate it following some naming convention
- use any existing library that handles this task already pretty good (above mention circe, play-json, or many others)
from chimney.
A custom Transformer
doesn't save me from having to write a bunch of boilerplate for all my serializations, twice (one for each direction). I suspect that Circe and others can't be adapted to what I'm trying to achieve since they don't capture field references like Chimney does, but this idea not being within the scope of Chimney is fair enough. Thanks for the response.
from chimney.
Related Issues (20)
- Compilation of partial transformation fails when there are fields named both `is{Name}` and `{name}` HOT 2
- Silent invalid behavior of `withFieldConst` when field name starts with "set" HOT 6
- [PartialTransformer] Field Option[Field].None to Proto3.Fields.Default
- ClassCastException thrown on Scala 3 when transforming sealed traits to Protobuf GeneratedEnum HOT 12
- Automatic Coproduct Rename from/to Protobuf GeneratedEnum HOT 8
- Can't transform coproduct - Java Enum to Sealed trait HOT 24
- Cannot transform Scala class to Java class HOT 5
- Chimney stabilization into 1.0.0
- Exclude macro generated code from WartRemover checks HOT 16
- Fix Overrides for Subtypes matching
- Support seamless transformation of protobuf oneof types HOT 4
- Compiler bugs: known, relevant and unresolved/undocumented
- Support transformation to and from Java primitives
- Test more Scala CLI snippets for output (printed results)
- Support runtime-defined enums
- Rewrite Patchers as a special case of multiple case classes mapping
- Refactor internals to NOT rely on RuntimeDataStore
- Chimney >= 0.8.0 can't transform case class with annotated parameter HOT 7
- Total transformation for Cats' `NonEmptyX[A] -> NonEmptyX[B]` HOT 3
- Possible documentation improvements
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from chimney.