3 个稳定版本

1.1.1 2020年9月26日
1.1.0 2020年4月9日
1.0.0 2020年4月4日

#330模板引擎

MIT 许可证

32KB
832

Chrobry

数据驱动模板引擎

理念

在生活的某个时刻,你可能想要有一种简单的方式轻松定义数据类型并为他们分配一些行为,但随后你发现需要编写大量的样板代码,你的兴奋感立刻下降。

不必担心!Chrobry 可以帮助你通过数据类型定义和行为模板来简化这项工作。

用法

你可以使用 Chrobry,要么是 CLI 应用程序

chrobry -e input.chrobry -o output.h

要么作为一个可以嵌入到项目构建过程中的 Rust crate(库/包)。

安装

  • 安装或更新 CLI 应用程序
    cargo install chrobry-cli --force
    
  • 将 Chrobry 添加到你的 Rust 项目依赖项中
    [dependencies]
    chrobry-core = "1"
    

模板文件语法

我们将使用 C++ 代码生成作为示例

在你的生成文件顶部注入一些代码。

inject
```
#pragma once
#include <string>
#include <sstream>
```

定义外部类型(非我们定义的类型)并为它们分配一些行为。

注意:extern 中定义的实现必须在 Chrobry 文件中某处定义 - 对于未定义本地类型的操作,不能为外部类型分配,外部和本地类型之间必须有一致性。

extern 'int' 'float' {
  impl Display
  ```
  std::string Display(%{ $TYPENAME }% self) { return std::to_string(self); }
  ```

  impl Clone
  ```
  %{ $TYPENAME }% Clone(%{ $TYPENAME }% self) { return self; }
  ```
}

extern 'std::string' {
  impl Display
  ```
  std::string Display(const std::string& self) { return self; }
  ```

  impl Clone
  ```
  std::string Clone(const std::string& self) { return self; }
  ```
}

定义数据类型(struct / enum)并为它们分配行为(@Behavior)。

注意:外部类型用单引号标记。此外,你的行为可以定义一些字符串属性,这些属性可以在模板中使用 $propertyName 来使用。

@Describe
@Display { name = 'foo' hidden }
@Clone
struct Foo {
  a: 'int'
  b: 'std::string'
  c: Status
  d: 'float'
}

@Describe { inherit = 'uint8' }
@Display
@Clone
enum Status {
  Ok
  Error
}

定义行为模板。这些模板可以分别为结构和枚举分别专门化。

注意:你可以在模板代码中注入处理脚本,只需将你的脚本放在 %{} 标记之间即可。你可以使用那里的变量,例如 TYPENAME,这是正在处理类型的名称。你也可以使用任何由结构或枚举分配的行为属性定义的变量,或者任何在 for 中定义的变量。

impl struct Describe
```
struct %{ $TYPENAME }%
{
  %{
    for $name $type in fields
    ```
    %{ $type }% %{ $name }%;
    ```
  }%
};
```

impl enum Describe
```
enum class %{ $TYPENAME }% : %{ $inherit }%
{
  %{
    for $name in fields
    ```
    %{ $name }%,
    ```
  }%
};
```

待办事项

  • 使用 for 迭代过滤并使用 where 规则专门化行为。

依赖关系

约 5-6.5MB
~117K SLoC