Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/boxed/elm-cog
Code generation for Elm, using Ned Batchelder's Cog
https://github.com/boxed/elm-cog
Last synced: 2 months ago
JSON representation
Code generation for Elm, using Ned Batchelder's Cog
- Host: GitHub
- URL: https://github.com/boxed/elm-cog
- Owner: boxed
- License: mit
- Created: 2017-07-14T19:01:03.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2020-10-26T10:27:27.000Z (about 4 years ago)
- Last Synced: 2024-10-03T12:40:00.706Z (3 months ago)
- Language: Python
- Size: 24.4 KB
- Stars: 32
- Watchers: 5
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# elm-cog
Code generation for Elm, using Ned Batchelder's Cog. This is useful for two main scenarios:
- keeping data from your python server side code in sync with the Elm side
- enhancing Elm in certain areas where you might otherwise end up with error prone copy paste messFeatures:
- Lists
- Example: (`list_of('a, b, c')` or `list_of('a', 'b', 'c')`)
- Union types
- Example: (`union('A, B, C')`)
- Enums (A union type + a list that are always in sync)
- Example: (`enum('A, B, C')`)
- Type alias
- Example: (`type_alias('FooBar', type_info=dict(a=int, b=float, c=str))`
- Record
- Example: (`record('foo', dict(a=1, b=1.5, c="bar"))`)
- Enhanced enums: an enum with an associated Dict for extra data
- Example: (`enhanced_enum('FooBar', dict(A=dict(some_data1=1, some_data2=1.5, display_name="3"), B=dict(some_data1=2, some_data2=2.5, display_name="4"),)`)
- Record alias with generated encoders and decoders (like `enhanced_enum` but you call `type_alias_with_json`)## Usage
1. Install my fork of Cog:
```shell
hg clone https://bitbucket.org/boxed/cog
cd cog
python3 setup.py install
```(I have sent a pull request for the feature I need, hopefully you can at some point use standard Cog)
2. From the elm-cog repo, copy https://raw.githubusercontent.com/boxed/elm-cog/master/elm.py and https://raw.githubusercontent.com/boxed/elm-cog/master/elm-cog to your source tree.
3. Run `elm-cog` to do the actual code generation.
I know it's a bit clunky right now, but this tool is still in a prototype stage. Let me know if you find it useful!
## Full example of code generation
You write this in your elm code:
```elm
-- [[[cog type_alias_with_json('Foobar2', type_info=dict(a=int, b=str, c='CustomType')) ]]]
-- [[[end]]]
```then run `elm-cog` and it will update your file in place to replace the above with:
```elm
-- [[[cog type_alias_with_json('Foobar2', type_info=dict(a=int, b=str, c='CustomType')) ]]]type alias Foobar2 =
{ a : Int
, b : String
, c : CustomType
}foobar2Decoder : Json.Decode.Decoder Foobar2
foobar2Decoder =
Json.Decode.Pipeline.decode Foobar2
|> Json.Decode.Pipeline.required "a" Json.Decode.int
|> Json.Decode.Pipeline.required "b" Json.Decode.string
|> Json.Decode.Pipeline.required "c" customTypeDecoderfoobar2Encoder : Foobar2 -> Json.Encode.Value
foobar2Encoder record =
Json.Encode.object
[ ( "a", Json.Encode.int record.a )
, ( "b", Json.Encode.string record.b )
, ( "c", customTypeEncoder record.c )
]-- [[[end]]]
```
The output will be formatted according to `elm-format` already, so no need to run it after.