#generation #enums #gull

gull

类型生成

19 个版本 (稳定版)

6.0.2 2023年6月23日
6.0.1 2022年6月6日
6.0.0 2022年4月5日
5.0.0 2022年2月18日
0.0.0 2020年9月19日

Rust 模式 中排名 809

Download history 142/week @ 2024-03-10 127/week @ 2024-03-17 53/week @ 2024-03-24 98/week @ 2024-03-31 73/week @ 2024-04-07 44/week @ 2024-04-14 108/week @ 2024-04-21 158/week @ 2024-04-28 84/week @ 2024-05-05 81/week @ 2024-05-12 204/week @ 2024-05-19 45/week @ 2024-05-26 111/week @ 2024-06-02 55/week @ 2024-06-09 30/week @ 2024-06-16 94/week @ 2024-06-23

每月下载量 299

MIT 许可协议 MIT

100KB
2.5K SLoC

Crates.io Docs.rs Rust CI

gull_header

Gull 是一个工具,它将抽象静态类型定义转换为多种语言的静态类型定义。目前支持的语言:Rust,Hack (PHP),Flow (不稳定)

核心假设是将此类型序列化为任何语言的 JSON 会生成一个 JSON 字符串,该字符串可以被安全地解析为另一种语言中的相同类型。

目标是生成用户友好的类型,可以直接用于应用程序逻辑。它还将每个类型或结构字段的相关文档复制到每个目标。

注意:这不是一个 RPC 框架,也不支持任何类型的消息传递。它只生成类型,完全依赖于语言的 JSON 序列化实现,对字符串如何在环境中传递保持中立。生成的 JSON 字符串可以通过文件系统上的临时文件、数据库的中间存储、STDIO、http 上的 JSON 字符串或其他 RPC 协议(例如 Thrift)或任何其他方法传递。

示例

use gull::prelude::*;
use k9::snapshot;

let mut declarations = Declarations::new();

declarations.add(TypeDeclaration {
name: "Frame",
docs: "Frame represents a tuple of an Timestamp (RFC3339) and an ID",
config: vec![TypeDeclarationConfig::RustAttribute("#[derive(Copy, Clone)]")],
generic_params: vec![],
value: DeclarationValue::TTuple(TTuple {
items: vec![
TupleItem::TPrimitive(TPrimitive::String),
TupleItem::TPrimitive(TPrimitive::Ti64),
],
}),
});

snapshot!(
declarations.codegen_rust().unwrap().trim(),
"
#[derive(Copy, Clone)]
/// Frame represents a tuple of an Timestamp (RFC3339) and an ID
pub type Frame = (String, i64);
"
);

snapshot!(
declarations.codegen_hack().unwrap().trim(),
"
<?hh

// Frame represents a tuple of an Timestamp (RFC3339) and an ID
type Frame = (string, int);
"
);

snapshot!(
declarations.codegen_flow().unwrap().trim(),
"
// Frame represents a tuple of an Timestamp (RFC3339) and an ID
export type Frame = [string, number];
"
);

更多示例请参阅 gull/e2e/basic_codegen_test.rs

这些类型在序列化和反序列化为 JSON 时可以安全地跨边界传递。

// In rust
use generated_types::Frame;
let thing: Frame = ("2020-01-01:00:00:00Z", 1);
let json = serde_json::to_string(&thing).unwrap();
write_to_file("/tmp/my_thing.json", &json);

// in JS
import type {Frame} from './generated_types.js';
const getFrame = (file_path: string): Frame => {
return JSON.parse(read_file(file_path));
}
const json: Frame = getFrame("/tmp/my_thing.json");

依赖项

~2–13MB
~120K SLoC