#data-model #yaml #enums #header #variant #generate #constraints

termite-dmg

Termite 数据模型生成器是一个用于生成数据模型样板代码的 crate。

1 个不稳定版本

新版本 0.1.0 2024年8月24日

#429 in Rust 模式

Download history 100/week @ 2024-08-19

100 次每月下载

MIT/Apache

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