#对象 #格式 #数据 #语言 #编程语言 #保存 #加载

已删除 rust_object_format

Rust 对象格式 API

0.1.0 2023年4月7日

#19 in #保存

ISC 许可证

97KB
2K SLoC

Rust 对象格式 (.rof)

Rust 对象格式允许将 Rust 对象序列化为与原始对象非常相似的文本格式。它还允许在不同编程语言之间轻松传输对象,因为对象可以在它们各自的语言中创建,序列化为字符串,发送到另一个语言,反序列化并再次使用。

TL;DR:一个可以将 Rust 对象序列化和反序列化为字符串的库,允许简单地将 Rust 对象在分离的编程语言之间保存和传输。

目录

设计目标
语言
Rust 库文档
JS 库文档

设计目标

  • 人类可读(易于编写,支持内联注释,且文件为文本格式)
  • 在 Rust 中序列化和反序列化时无需任何转换
  • 对于熟悉 Rust 的人来说易于理解
  • 受 JSON 启发,作为与另一种语言的数据结构紧密相似的语言
  • 丰富的内置数据类型,例如枚举、元组、选项、数组、哈希表等

用例

  • 保存和加载数据
  • 轻松在之间共享数据

语言

结构体

由一对大括号包围

{
    title: string = "Ferris the crab";
}

每个对象属性的定义如下,并且总是以分号结束。

  • 显式类型注解

属性名: 属性类型 = 属性值;

  • 隐式类型注解(仅允许在类型注解可选的类型上使用)

属性名 = 属性值;

简单属性类型

简单属性类型仅包括基本类型

布尔类型

  • 假值布尔 > false
  • 真值布尔 > true

类型注解可选,可以隐式指定

is_swimming: bool = false;

文本类型

  • 字符串 > "string"(严格需要双引号)
  • 字符 > 'c'(严格需要单引号)

类型注解可选,可以隐式指定

数字类型

所有整数类型值均以相同方式编写

  • u8(8位无符号整数)> year: u8 = 2023;
  • 8位有符号整数(i8) > distance: i8 = -32;
  • 16位无符号整数(u16) > year: u16 = 2023;
  • 16位有符号整数(i16) > distance: i16 = -32;
  • 32位无符号整数(u32) > year: u32 = 2023;
  • 32位有符号整数(i32) > distance: i32 = -32;
  • 64位无符号整数(u64) > year: u64 = 2023;
  • 64位有符号整数(i64) > distance: i64 = -32;
  • 128位无符号整数(u128) > year: u128 = 2023;
  • 128位有符号整数(i128) > distance: i128 = -32;
  • 平台相关无符号整数(usize) > year: usize = 2023;
  • 平台相关有符号整数(isize) > distance: isize = -32;

所有浮点类型值的表示方法相同

  • 32位浮点数(f32) > temperature: f32 = 5.3;
  • 64位浮点数(f64) > weight: f64 = 7; (与Rust不同,浮点数不能严格包含小数点,在Rust中这将被写作 7.7.0

类型注解是强制的,不能隐含指定

复杂属性类型

一个复杂/组合属性包括一个基本类型以及x个子类型,这些子类型可以是简单和复杂属性类型的组合

元组和数组

  • 元组 > position: tuple<f64, f64, f64> = (3, 5.4, 7);

如果元组参数类型是可选的,则类型注解是可选的

  • 数组 > pet_names: array<string> = ["Archie", "Charlie", "Luna", "Milo", "Rocky"];

如果数组对象类型是可选的,则类型注解是可选的

结构体和哈希表

  • 哈希表
passwords: hashmap<u16, string> = {
    739341: "abc123",
    210405: "football32",
    826135: "dragon97"
};

如果哈希表键和值对象类型是可选的,则类型注解是可选的

  • 结构体
passwords = {
    739341: string = "abc123",
    "210405": string = "football32",
    826135: enum<string> = None;
};

哈希表和结构体不能互换,因为它们之间存在一些关键区别

  • 结构体属性索引名称必须是字符串,而哈希表键可以是任何类型的值作为键。
  • 哈希表键必须都是同一类型,而结构体则需要显式注解每个属性的类型。

类型注解是强制性的;如果您希望数据作为哈希表加载,则必须将值注解为哈希表,否则它将作为结构体加载,反之亦然。

枚举

  • 枚举 > action: enum = IDLE;
  • 枚举 > action: enum = SLEEPING;

  • 枚举 > action: enum<f64> = JUMP(3.6);

  • 枚举 > action: enum<f64, f64> = RUN(50, 31.2);

  • 枚举 > action: enum<string> = EAT("Hamburger");

  • 在Rust中的相同枚举

enum action {
    IDLE,
    SLEEPING,
    JUMP(f64 /* jump power */),
    RUN(f64 /* x-velocity */, f64 /* y-velocity */),
    EAT(String /* food item */),
}

如果枚举参数类型是可选的,则类型注解是可选的

关键字 "option" 也可以用来替代 "enum",并且与 "enum" 关键字的工作方式完全相同;当使用选项枚举时,可以使用 "option" 关键字代替 "enum",使其更易于阅读。对于任何其他枚举类型,"option" 关键字都可以正常工作,但强烈建议不要使用。

格式化

{
    title: string = "Ferris the crab";
    age: usize = 25;
    favourite_color: enum = ORANGE;
    accessories: array<enum<usize>> = [
        SUNGLASSES(3),
        GOLDEN_SHOES(1)
    ];
}
  • 制表符是推荐的,但不是强制的,并且期望每个嵌套值从根对象开始有一个制表符级别

  • 推荐使用蛇形属性索引,但不是强制的

  • 换行符是推荐的,但不是强制的,并且期望在每个对象的第一个字符之后以及每个属性之后(在分号之后)进行换行

Rust库文档

JavaScript库文档

依赖关系

~265–710KB
~17K SLoC