1 个不稳定版本
0.1.0 | 2023年1月29日 |
---|
#1118 在 数据结构
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