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
每月下载量 299
100KB
2.5K SLoC
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