3 个稳定版本

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

#208模板引擎

37 每月下载量
用于 4 crates

MIT 许可证

26KB
724

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)并为其分配行为(@Behaviour)。

注意:外部类型用单引号标记。此外,您还可以定义一些字符串属性,这些属性可以在模板中使用 $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规则专化行为。

依赖关系

~4.5–6MB
~110K SLoC