戈蒂诺-赫斯
通过类型定义语言为类型生成验证/编码/解码代码的工具。查看语言的详细信息在这里.
安装
确保你有Haskell工具堆栈
。用于建筑整个项目,一旦您安装了它,它将管理拥有正确版本的编译器和所有使用的Haskell库。
一旦我们有了堆栈
安装后,我们可以在该项目目录中运行以下内容:
烟囱安装
堆栈现在将安装戈蒂诺-赫斯
作为二进制文件$HOME/.local/bin
目录。如果你做了确保您的$路径
你可以执行戈蒂诺-赫斯
任何地方。
如果我们想在示例/basic.gotyno
将TypeScript和F#合并为单独的输出目录以及监视文件更改并在发生更改时重新编译,我们可以此时执行以下操作:
$gotyno-hs--类型脚本ts-output--fsharp fsharp-output--观察示例/basic.gotyno监视目录:“<ABSOLUTE-PATH-TO-EXAMPLES-directory>”
支持的语言
计划支持
将来可能会支持
- 科特林
- 斯威夫特
- Scala 3(如果现在更好)
- 万能药
可以传递给编译器的选项
编译器的帮助文本说明了您可以执行的大部分操作。
$gotyno-hs-帮助gotyno-将类型定义编译为语言的编码器/解码器用法:gotyno-hs[--ts|--typescript=|-|PATH][--fs|--fsharp=|-| PATH][-w |--监视][-v |--详细]GOTYNOFILE将类型定义编译为语言的编码器/解码器可用选项:--ts,--typescript=|-|PATH设置TypeScript输出--fs,--fsharp=|-|PATH设置fsharp输出--py,--python=|-|PATH设置python输出-w、 --监视监视文件并自动重新编译-v、 --verbose有关编译的输出信息-h、 --help显示此帮助文本
=|-|路径
语言的输出目标可以设置为=
用于“与输入文件相同”-
用于标准输出或该语言的所有输出的路径。
TypeScript示例
基本哥特诺有一个定义了一些类型的示例基本.ts是自动生成的TypeScript输出这个文件。此目录包含其他示例,主要用于测试目的。
在幕后,它使用的是我为验证而编写的验证库未知的
值(在大多数情况下,针对给定的接口定义)。
F#示例
基本哥特诺有一个定义了一些类型的示例基本.fs是自动生成的F#输出文件。此目录包含其他示例,主要用于测试目的。
F#版本使用托特
用于JSON解码,以及用于我写的一些自定义解码助手。
导入名称(以及通过扩展声明的源名称)将自动转换为使用F#的首字母大写。但是,请注意,PascalCase不会自动转换为。如果导入名称是用snake_case编写的,则输出将是snake_case。大部分是camelCase对于Gotyno文件名将很好地工作,因为对于该特定文件,输出将是“CamelCase”例子。
语言
所有支持的类型名称都是大写的,并且当前也强制使用类型定义。
注释/类型
?类型名
表示可选类型。
*类型名称
表示指向该类型的指针。在对用户隐藏指针的语言中这在为其生成的类型中可能不可见。
[]类型名称
表示一系列类型名
长度在运行时已知,而[N] 类型名称
表示一系列类型名
已知且强制的长度为编译时间。有些语言可能有也可能没有后者的概念,只使用前者用于代码生成。
类型名称<其他类型名称>
表示泛型类型的应用程序,例如变量类型名
在其定义中填入其他类型名称
在这个特定的实例。
- 相反地,
结构/联合类型名称<T>{…}
是如何定义采用类型的类型参数。这个<T>
此处显示的部分用于获取和提供类型吨
对于相邻范围,因此它在语法中的位置。
- 类型
“SomeValue”
表示该值的文本字符串,可以非常有效地使用在TypeScript中。
- 无符号整数类型相同,但适用于整数。这是否有助于有。
结构体
结构招聘人员{name:字符串}结构人员{name:字符串年龄:U8效率:F32休假:布尔爱好:[]字符串last_fifteen_comments:[15]字符串招聘人员:?招聘人员}结构通用<T>{字段:T其他字段:?吨带片的其他字段:[]T}
枚举类型
枚举颜色{红色=“FF0000”绿色=“00FF00”蓝色=“0000FF”}
工会
已标记
联合InteractionEvent{单击:坐标按键:按键代码焦点:*元素}活接头选项{无一些:T}联合结果<E,T>{错误:E好的:T}
未标记
有时需要一个不带额外标签的联合,尽管通常必须这样通过各自有效载荷中的自定义标签,可以不太自动地识别:
结构SomeType{type:“SomeType”some_field:F32some_other_field:?字符串}结构SomeOtherType{type:“SomeOtherType”活动:布尔some_other_field:?字符串}无标记接头可能{基类型其他类型字符串}
例如,在TypeScript中,此无标记联合的正确类型保护和验证器将是生成,文本字符串字段仍然可以用于标识具有哪种类型。
设置标记键并将其嵌入有效负载结构
也可以通过将标记键设置为嵌入传递给联盟
关键字(我们还可以设置使用哪个关键字):
结构SomeType{some_field:F32some_other_field(其他字段):?字符串}结构SomeOtherType{活动:布尔some_other_field:?字符串}联合(tag=type_tag,嵌入式)可能{第一建造师:SomeType第二个构造函数:SomeOtherType}
这将有效地创建一个我们可以获得场地的结构类型标签
嵌入有效载荷中构筑物(基类型
&其他类型
)具有值“第一建造师”
和“二级建造师”
分别。
注意,为了嵌入类型键,我们需要有效载荷(如果存在)为结构类型,否则,我们没有可将类型标记字段合并到其中的字段。
这两项检查引用的有效负载类型是否存在,以及它们是否是结构编译期间完成。
声明
当需要Gotyno文件之外的类型时,我们可以使用声明来断言存在。它的功能很像生成代码中的导入,由用户提供所需文件中每种语言的所需功能:
声明为外部。选项<T>声明otherExternalModule。普通结构HasOption{字段:选项<T>field2:普通}
注意,上面的代码将为每个唯一的源模块生成一个导入(位于“.”的左侧),并且每个用法都会自动识别为对声明的引用。代码输出将依赖于此模块与生成的代码。