#data #generator #template #description #format #service #language

ssd-data

一种服务和数据描述格式 + 基于rhai脚本和模板的代码生成器

23个版本 (10个破坏性版本)

0.20.1 2024年4月25日
0.19.0 2024年4月25日
0.18.2 2024年1月5日
0.17.1 2023年12月29日

#219数据结构

每月50次 下载
ssd 中使用

自定义许可

28KB
518

SSD - 简单服务和数据描述

关于 - SSD是什么?

首先,它应该是一种描述数据结构和服务的格式。此外,它还提供了处理上述格式的工具,从而简化了编写自定义代码生成器的过程。

历史 - 我为什么要做这个?

在我曾经工作的公司之一,我们用Delphi编程,我们需要序列化一些结构。要在Delphi中序列化内容,你需要手动构建对象,这非常容易出错,并且令人烦恼。所以我用D语言、SDLang和模板引擎编写了一个小的(闭源)代码生成器。

几个月后,很明显,模板引擎使得某些事情更难维护和推理。因此,我决定用C#重写整个程序。这次我使用了一个自定义解析器,以便允许更流畅的数据文件,并通过C# DLLs构建生成器。这样,如果你想的话,仍然可以使用模板引擎,将其嵌入到DLL中并使用它。

我被允许开源所有东西,除了我们内部使用的自定义代码生成插件。源代码可以在以下位置找到:https://github.com/hardliner66/codegenerator

我仍然不是很满意,因为使用代码生成器进行跨平台的方式仍然很复杂,需要mono。经过一段时间,我开始更多地使用Rust,并发现了WebAssembly,这促使我开始第三次尝试。这次的目标是允许插件用wasm编写,以便人们可以用他们熟悉的任何语言编写生成器。

最初我给这个项目命名为SSDCG,代表简单服务与数据描述格式和代码生成器。但这个名字有点难记,而且重点始终更多地放在统一的数据描述语言上,代码生成是这个语言的主要用途。

该项目已经超越了最初的目标,不仅支持WASM,还支持Rhai(脚本语言)和三种不同的模板引擎,它们都可以使用相同的数据模型。一旦你的模型编写完成,你可以选择最适合你需求的技术来从模型中生成你想要的内容。

数据格式也经历了很多变化,从旧版本发展到支持描述数据类型、枚举、导入、具有函数和事件的服务,以及所有这些上的自定义属性,以实现更多定制。它被设计得类似于简化的Rust,因为我个人非常喜欢它的语法,而且这是自然的选择,因为整个项目都是用Rust编写的。

注意:重大变更!

只要crate版本低于1.0.0,就应预期会有重大变更。

迄今为止的重大变更

版本 变更
0.8.0 我将语法从handles改为fn,字段从handlers改为functions
0.9.0 将crate重命名为ssd
0.10.0 将AST移动到单独的crate中,以便在WASM插件中使用
0.11.0 限制注释可以出现的地方。这简化了自动格式化。
0.12.0 将SsdcFile重命名为SsdFile,使其与项目名称匹配
0.13.0 文档注释现在是公开数据的一部分
0.14.0 移除liquid模板以简化代码并消除代码重复。无论如何,Tera已经很接近了。
0.15.0 将Ron放在功能门后面,因为我之前已经遇到了一些问题,并提供rsn(类似格式)作为替代。
0.16.0 将属性表示从indexmap更改为元组的向量。
0.17.0 SsdFile重命名为SsdModule。从默认功能中移除了wasmtera
0.18.0 typ字段重命名为type

功能

  • 自定义描述语言(基本功能已完成,但还有一些东西仍然缺失)
    • 导入
    • 数据类型
    • 枚举
    • 服务
    • 自定义属性
      • 这些可以用来实现语言中缺失的自定义功能
      • 一些功能将在以后添加,而另一些将始终依赖于属性,因为它们不够通用
    • 列表
      • 固定大小(property: 5 of u8
      • 动态大小(property: list of u8
    • 泛型
  • 自动格式化
  • 脚本语言
    • Rhai
    • 通过PyO3的Python
  • 模板引擎
  • Wasm(通过extism
  • 用于与其他工具(JSON、Yaml、TOML)一起使用的数据导出
  • 使用原始数据(JSON、Yaml、TOML、Rsn)而不是预定义的ssd格式
    • 这允许使用相同的工具,即使在与其他地方的数据一起工作时也是如此
  • 基本健全性检查

Cargo功能

  • defaultwasmterahandlebars
  • tera启用对tera模板的支持
  • handlebars启用对handlebars模板的支持
  • wasm 启用对 wasm 插件的支持
  • ron 启用对 ron 的支持
  • all 启用一切

数据规范

它主要是“所见即所得”,如此处所示

目前唯一的限制是,自动格式化始终将注释放在元素之后的右边。这意味着以下内容将格式化为:

data Test {
    a: i32, /// test
    b: i32,
}

测试它

data Test {
    a: i32,
    /// test
    b: i32,
}

测试它

要测试它,请安装命令、克隆存储库并使用以下命令:

ssd generate rhai example-generators/cpp-like.rhai data/test.svc

示例

您可以查看文件

安装

可以通过 cargo 安装

cargo install --locked ssd

或从 发布页面 下载预构建包。

使用方法

通用

 ssd help
Simple Service Description

Usage: ssd [COMMAND]

Commands:
  debug     Print debug representation of the parsed file
  pretty    Pretty print the parsed file
  generate  Generate source code
  help      Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

生成

 ssd generate help
Generate source code

Usage: ssd generate <COMMAND>

Commands:
  rhai        Use a rhai based generator
  handlebars  Use a handlebars based template. https://handlebars.node.org.cn/
  tera        Use a tera based template. https://tera.netlify.app/
  wasm        Use a wasm based generator
  data        Output as serialized data for external use
  help        Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

Rhai

 ssd generate rhai --help
Use a rhai based generator

Usage: ssd generate rhai [OPTIONS] <SCRIPT> <FILE>

Arguments:
  <SCRIPT>
          The script to use to generate the file

  <FILE>
          which file to use

Options:
  -d, --debug
          Enables debug mode (print and debug function in the script)

      --no-map
          do not use type mappings

      --typemap <TYPEMAP>
          A file containing type mappings.

          If a file with the same name as the script file, but with the extension tym, it will be used automatically.
          e.g.: If there is a file `/generator/script.rhai` and a corresponding `/generator/script.tym`, it will get
          used automatically.

  -r, --raw
          use raw data file as input instead of the ssd data format

  -o, --out <OUT>
          The file which should get written with the output from the generator

  -h, --help
          Print help (see a summary with '-h')

Handlebars

别名:ssd generate hbs

 ssd generate handlebars --help
Use a handlebars based template. https://handlebars.node.org.cn/

Usage: ssd generate handlebars [OPTIONS] <TEMPLATE> <FILE>

Arguments:
  <TEMPLATE>
          The template to use to generate the file

  <FILE>
          which file to use

Options:
      --no-map
          do not use type mappings

      --typemap <TYPEMAP>
          A file containing type mappings.

          If a file with the same name as the script file, but with the extension tym, it will be used automatically.
          e.g.: If there is a file `/generator/script.rhai` and a corresponding `/generator/script.tym`, it will get
          used automatically.

  -r, --raw
          use raw data file as input instead of the scd data format

  -o, --out <OUT>
          The file which should get written with the output from the generator

  -h, --help
          Print help (see a summary with '-h')

Tera

 ssd generate tera --help
Use a tera based template. https://tera.netlify.app/

Usage: ssd generate tera [OPTIONS] <TEMPLATE_DIR> <TEMPLATE_NAME> <FILE>

Arguments:
  <TEMPLATE_DIR>
          Glob path for where to search for templates

  <TEMPLATE_NAME>
          The template to use to generate the file

  <FILE>
          which file to use

Options:
      --no-map
          do not use type mappings

      --typemap <TYPEMAP>
          A file containing type mappings.

          If a file with the same name as the script file, but with the extension tym, it will be used automatically.
          e.g.: If there is a file `/generator/script.rhai` and a corresponding `/generator/script.tym`, it will get
          used automatically.

  -r, --raw
          use raw data file as input instead of the scd data format

  -o, --out <OUT>
          The file which should get written with the output from the generator

  -h, --help
          Print help (see a summary with '-h')

Wasm

 ssd generate wasm --help
Use a wasm based generator

Usage: ssd generate wasm [OPTIONS] <WASM> <FILE>

Arguments:
  <WASM>
          The wasm plugin to use to generate the file

  <FILE>
          which file to use

Options:
      --no-map
          do not use type mappings

      --typemap <TYPEMAP>
          A file containing type mappings.

          If a file with the same name as the script file, but with the extension tym, it will be used automatically.
          e.g.: If there is a file `/generator/script.rhai` and a corresponding `/generator/script.tym`, it will get
          used automatically.

  -r, --raw
          use raw data file as input instead of the scd data format

  -o, --out <OUT>
          The file which should get written with the output from the generator

  -h, --help
          Print help (see a summary with '-h')

Python / PyO3

通过 pip 安装

pip3 install py_ssd

使用方法

>>> import py_ssd
>>> model = py_ssd.parse_file(".", "./data/test.svc")
[src/parser.rs:509] key = "Rect"

# the namespace is generated from the file path (second parameter),
# with the base path removed (first parameter)
>>> model['namespace']
{'components': ['data', 'test']}

>>> model['data_types'].keys()
dict_keys(['Rect'])

>>> model['data_types']['Rect']['properties']['x']
{'typ': {'components': ['i32']}, 'attributes': [{'name': {'components': ['test']}, 'parameters': []}], 'comments': []}

依赖项

~0.6–9MB
~81K SLoC