1 个不稳定版本
新版本 0.1.0 | 2024年8月24日 |
---|
#429 in Rust 模式
100 次每月下载
120KB
2.5K SLoC
Termite 数据模型生成器是一个用于生成数据模型样板代码的 crate。
该 crate 由两部分组成,第一部分是数据模型本身。这通常是从 yaml 或 json 文件导入到 DataModel 对象中。
它也可以直接在代码中定义,但这不是那么易于阅读或编写。
DataModel 对象由一组头部和尾部字符串以及数据类型组成。头部和尾部字符串是用于添加到生成的文件顶部和底部的字符串,如添加包含。数据类型是用户定义的类型列表及其数据,这些数据用于生成数据模型文件。
数据类型由一个基本类型(如 struct、variant 或 enum)和描述以及类型数据组成,该类型数据描述了该类型的所有特定信息。
基本类型包括:
Struct:具有多个公共字段的标准 struct(类似于 rust/c++ struct)
Array:同一类型的对象列表(类似于 rust/c++ vector)
Variant:可以是多种不同类型之一,在解析 variant 时,它将尝试从开始解析类型,直到成功为止(类似于 c++ variant)
Enum:可以是多种预定义枚举类型之一,每个枚举类型可以通过包装其他类型来存储额外数据(类似于 rust enum)
ConstrainedType:包装另一个类型并强制约束,只有当约束得到尊重时才允许解析。
Termite crate 的第二部分是生成代码。目前它只支持 C++,使用 cpp 模块。从这里可以生成头文件、(反)序列化和文档的功能。
示例
use termite_dmg as termite;
use indoc::formatdoc;
let yaml_model = formatdoc!("
data_types:
- name: PositiveDouble
data: !ConstrainedType
data_type: double
constraints:
- x > 0.0
- name: Point
description: A point in 2D space
data: !Struct
fields:
- name: x
data_type: double
default: !Default '0.0'
- name: y
data_type: double
default: !Default '0.0'
- name: id
data_type: int64_t
default: Optional
- name: Size
description: The size of a box
data: !Struct
fields:
- name: w
description: The width
data_type: PositiveDouble
default: Required
- name: h
description: The height
data_type: PositiveDouble
default: Required
- name: SizeVariant
description: Is either a Size or just a PositiveDouble if it is a square
data: !Variant
data_types:
- PositiveDouble
- Size
- name: SizeArray
data: !Array
data_type: SizeVariant
- name: Geometry
data: !Enum
types:
- name: Nothing
description: No geometry
- name: Sizes
description: A number of sizes
data_type: SizeArray
- name: Point
description: A point
data_type: Point
headers:
cpp: // My Header
footers:
cpp: // My Header
namespace:
- my_namespace
");
let model = termite::DataModel::import_yaml(&yaml_model).unwrap();
let cpp_model = termite::cpp::DataModel::new(model).unwrap();
let termite_hpp = termite::cpp::get_termite_dependency();
let termite_yaml_hpp = termite::cpp::get_yaml_interface();
let model_hpp = cpp_model.get_source("HEADER_GUARD", 2);
用于加载 Geometry::Nothing 的 YAML 文件
Nothing
//! 用于加载 Geometry::Sizes 的 YAML 文件
Sizes:
- 1.0
- w: 2.0
h: 4.0
//! 用于加载 Geometry::Point 的 YAML 文件
Point:
x: 2.0
依赖项
~2.2–3.5MB
~70K SLoC