Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/abrarnitk/rust_elm_types

Repository that converts Rust struct to Elm Types
https://github.com/abrarnitk/rust_elm_types

autodecoder autoencoder autogenerated elm rust rusttoelmtypes

Last synced: 22 days ago
JSON representation

Repository that converts Rust struct to Elm Types

Awesome Lists containing this project

README

        

# Rust to Elm Type Generator
### This repo contains simple rust struct to elm type generator.

## Examples
1. File Path may be set into env variable called (ELM_TYPES).
2. File path may be passed as elm options, this will override env path.

- ### Example 1
- #### struct with option path(path is mandatory option)
```rust
#[macro_use]
extern crate elm_rusty;

// Declare struct with Elm derive
// Here path is mandatory in elm opts or export in env variable as ELM_TYPES
#[derive(Elm)]
#[elm(opts(path = "/Users/abrarkhan/Documents/github/rust_elm_types"))]
struct Foo {
id: i32,
name: String,
}
```
After change into models, When ever run cargo build, check or test first time it will generated corresponding Elm code.

```elm
module Foo exposing (..)

type alias Foo =
{ id: Int
, name: String
}

```
- ### Example 2
- #### struct with option path and rename
```rust
#[macro_use]
extern crate elm_rusty;

mod temp {
pub struct User {}
}

#[derive(Elm)]
#[elm(opts(rename = "ElmUser", path = "/Users/abrarkhan/Documents/github/rust_elm_types"))]
struct User {
name: Option>,
id: Vec>>,
vector: Vec,
}
```

```elm
module ElmUser exposing (..)

type alias ElmUser =
{ vector: List Int
, name: Maybe(List Int)
, id: List(Dict String(List User))
}

```
## Note Point
Here, I did not handle recursively custom type derive Elm, so it won't create corresponding User.elm

- ### Example 3
- #### struct with option path, elm type rename and field rename option
```rust
#[macro_use]
extern crate elm_rusty;

mod temp {
pub struct User {}
}

#[derive(Elm)]
#[elm(opts(rename = "ElmUser", path = "/Users/abrarkhan/Documents/github/rust_elm_types"))]
struct User {
#[elm(rename = "foo")]
name: Option>,
id: Vec>>,
vector: Vec,
}
```

```elm

module ElmUser exposing (..)

type alias ElmUser =
{ id: List(Dict String(List User))
, foo: Maybe(List Int)
, vector: List Int
}

```

- ### Example 4
- #### struct(reference types) with option path, elm type rename and field rename option
```rust

#[macro_use]
extern crate elm_rusty;

mod temp {
pub struct User {}
}

#[derive(Elm)]
#[elm(opts(rename = "ElmUser", path = "/Users/abrarkhan/Documents/github/rust_elm_types"))]
struct User<'a> {
#[elm(rename = "foo")]
name: Option>,
id: &'a Vec>>,
vector: Vec,
}
```

```elm

module ElmUser exposing (..)

type alias ElmUser =
{ id: List(Dict String(List User))
, foo: Maybe(List Int)
, vector: List Int
}

```

- ### Example 5
- #### without elm options and export path as ELM_TYPES="/Users/abrarkhan/Documents/github/rust_elm_types"
```rust

#[macro_use]
extern crate elm_rusty;

mod temp {
pub struct User {}
}

#[derive(Elm)]
struct User<'a> {
#[elm(rename = "foo")]
name: Option>,
id: &'a Vec>>,
vector: Vec,
}
```

```elm

module User exposing (..)

type alias User =
{ id: List(Dict String(List User))
, foo: Maybe(List Int)
, vector: List Int
}

```

# RoadMap

* [x] Generate Elm types alias from Rust struct.
* [ ] Make recursively type checks.
* [ ] Auto Import of Elm modules, if it exists inside same dir.
* [ ] Generate Elm types from Rust types.
* [ ] Generate Elm encoders from Rust types.
* [ ] Generate Elm decoders from Rust types.