1 个不稳定版本

0.1.0 2023年1月29日

#1118数据结构

MIT 协议

65KB
1.5K SLoC

rdc

RDC

RDC - Rust数据代码生成器

此crate用于从Rust的数据结构生成其他语言的代码。它可以用来生成DTO类,以简化与其他语言交互。

目前它只支持Java,但可以很容易地扩展以支持其他语言。

它依赖于serde crate来进行数据序列化和反序列化。

为了测试目的,它使用gradle来编译和运行生成的Java代码。

Java示例

简单结构体

use rdc::{rdc_java, RDC};
use rdc::targets::java::JavaClass;
use serde::{Serialize, Deserialize};

#[derive(RDC, Serialize, Deserialize)]
struct MyStruct {
    field1: String,
    field2: i32,
}

#[derive(RDC)]
struct MyStruct2 {
    field1: Vec<String>,
}

let classes: Vec<JavaClass> = rdc_java!(MyStruct, MyStruct2).unwrap();

具有依赖关系的结构体

您不需要指定数据结构中使用的所有类型。RDC将自动添加所有依赖项。

use rdc::{rdc_java, RDC};
use rdc::targets::java::JavaClass;

#[derive(RDC)]
struct Dependency {
   field1: String,
}

#[derive(RDC)]
struct MyStruct {
    field1: String,
    dependency: Dependency,
}

let classes: Vec<JavaClass> = rdc_java!(MyStruct).unwrap();
assert_eq!(classes.len(), 2);

枚举

use rdc::{rdc_java, RDC};

#[derive(RDC)]
enum MyEnum {
    Variant1,
    Variant2
}
rdc_java!(MyEnum).unwrap();

数据枚举

数据枚举是一种特殊的枚举类型,可以包含数据。

use rdc::{rdc_java, RDC};

#[derive(RDC)]
enum MyEnum {
    Variant1(i32),
    Variant2,
    Variant3 { field1: String }
}

rdc_java!(MyEnum).unwrap();

示例JSON表示

[
  {
    "Variant1": 1
  },
  "Variant2",
  {
    "Variant3": {
       "field1": "value"
    }
  }
]

泛型

RDC支持泛型。它是通过为每种泛型类型的组合生成Java类来实现的。每个使用的泛型类型都应该实现rdc::RDCType特质。请注意,此特质由#[derive(RDC)]自动实现。

use rdc::{rdc_java, RDC, RDCType};

#[derive(RDC)]
struct MyStruct<T> where T: RDCType {
    value: T,
}

let classes = rdc_java!(MyStruct<i32>, MyStruct<String>).unwrap();
assert_eq!(classes.len(), 2);

编写

RDC可以将生成的代码写入文件。

use rdc::{rdc_java, RDC};
use rdc::targets::java::{JavaClass, write_java};

#[derive(RDC)]
enum MyEnum {
    Variant1,
    Variant2
}
let classes: Vec<JavaClass> = rdc_java!(MyEnum).unwrap();

write_java(&classes, "com.example", "target/test-tmp/src/main/java").unwrap();

Serde兼容性

您可以使用#[serde(rename = "new_name")]重命名字段,并且这将在生成的代码中反映出来。

许可证:MIT

依赖关系

~0.6–1.1MB
~24K SLoC