1 个不稳定版本

0.1.0 2019 年 9 月 10 日

#40 in #auto-generate

MIT 许可证

17KB
403

Rust 到 Elm 类型生成器

此仓库包含从简单的 Rust 结构体到 Elm 类型的生成器。

示例

  1. 文件路径可以设置在名为 (ELM_TYPES) 的环境变量中。
  2. 文件路径可以作为 Elm 选项传递,这将覆盖环境变量路径。
  • 示例 1

  • 具有可选路径的结构体(路径是必填选项)

#[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,
}

在转换为模型后,每次运行 cargo build,check 或 test 首次运行时将生成相应的 Elm 代码。

module Foo exposing (..)

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

  • 示例 2

  • 具有可选路径和重命名的结构体

 #[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<Vec<i32>>,
    id: Vec<std::collections::HashMap<String, Vec<temp::User>>>,
    vector: Vec<i32>,
}
module ElmUser exposing (..)

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

注意点

在这里,我没有处理递归自定义类型生成 Elm,因此它不会创建对应的 User.elm

  • 示例 3

  • 具有可选路径、Elm 类型重命名和字段重命名选项的结构体

#[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<Vec<i32>>,
    id: Vec<std::collections::HashMap<String, Vec<temp::User>>>,
    vector: Vec<i32>,
}

module ElmUser exposing (..)

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

  • 示例 4

  • 具有可选路径、Elm 类型重命名和字段重命名选项的引用类型结构体


#[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<Vec<i32>>,
    id: &'a Vec<std::collections::HashMap<String, Vec<temp::User>>>,
    vector: Vec<i32>,
}

module ElmUser exposing (..)

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

  • 示例 5

  • 没有 Elm 选项,将导出路径作为 ELM_TYPES="/Users/abrarkhan/Documents/github/rust_elm_types"


#[macro_use]
extern crate elm_rusty;

mod temp {
    pub struct User {}
}

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

module User exposing (..)

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

路线图

  • 从 Rust 结构体生成 Elm 类型别名。
  • 递归类型检查。
  • 自动导入 Elm 模块(如果它位于同一目录中)。
  • 从 Rust 类型生成 Elm 类型。
  • 从 Rust 类型生成 Elm 编码器。
  • 从 Rust 类型生成 Elm 解码器。

依赖项

~2.5MB
~54K SLoC