#序列化 #解析器 #serde #文本格式

无需std rsn

Rust风格的、可读的对象表示法

2个不稳定版本

0.1.0 2023年11月16日
0.0.0-reserve.02023年3月28日

#1009解析器实现

Download history 175/week @ 2024-04-22 24/week @ 2024-04-29 17/week @ 2024-05-06 23/week @ 2024-05-13 29/week @ 2024-05-20 22/week @ 2024-05-27 23/week @ 2024-06-03 19/week @ 2024-06-10 19/week @ 2024-06-17 20/week @ 2024-06-24 11/week @ 2024-07-08 17/week @ 2024-07-15 15/week @ 2024-07-22 221/week @ 2024-07-29 194/week @ 2024-08-05

449 每月下载次数
用于 3 crate

MIT/Apache

255KB
6.5K SLoC

Rsn - Rusty Notation

此crate处于非常早期的开发阶段。请将任何问题报告到我们的GitHub

rsn forbids unsafe code rsn is considered alpha crate version Live Build Status HTML Coverage Report for main Documentation for main

基于UTF-8的文本格式,看起来与有效的Rust代码非常相似。此格式严格遵循Rust的词法规则

no_std 支持

此crate支持支持 alloc crate 的 no_std 目标。

数据类型

ExampleStruct {
  integers: [42, 0xFF, 0o77, 0b101],
  floats: [42., 3.14, 1e10],
  bools: [true, false],
  chars: ['a', '\''],
  string: "Hello, World!",
  raw_string: r#"I said, "Hello, World!""#,
  bytes: [b'a', b'\''],
  byte_string: b"Hello, World!",
  raw_byte_string: br#"I said, "Hello, World!""#,
  named_map: StructLike {
    field: 42,
  },
  named_tuple: TupleLike(42),
  r#raw_identifiers: true,
  array: [1, 2, 3],
  tuple: (1, 2, 3),
  map: {
    "a": 1,
    "b": 2,
  },
}
  • 整数 (42, 0xFF, 0o77, 0b101)

  • 浮点数 (42., 3.14)

  • 布尔值 (true, false)

  • 字符 ('a', '\'')

  • 字节 (b'a', b'\'')

  • 字符串 ("hello, world")

  • 原始字符串 (r#"They said, "Hello World!""#)

  • 字节字符串 (b"hello, world")

  • 命名

    • 标识符或原始标识符 (r#foo)
    • 映射或元组
  • 映射

    • 由逗号分隔的键值对列表 <>: <>
    • 尾随逗号是可选的
  • 元组(空元组 = 单位)

    • 由逗号分隔的 <Value> 列表
    • 尾随逗号是可选的
  • 数组

    • 由逗号分隔的 <Value> 列表
    • 尾随逗号是可选的
  • 注释 ///* */

  • 通过 #[] 语法进行潜在扩展

    • 半严格逗号分隔的列表
    • #[foo(...), bar = ...,]
    • 所有花括号/括号/括号必须正确配对吗?
  • rsn-fmt:为 rsn 的格式化项目。
  • rsn.vim:Vim/NeoVim 的插件。

为什么不选择 Ron?

Ron 是一个很好的格式。有一些设计决策导致了这种非常相似但又不完全相同的格式的发明。

  • ron 区分元组和列表,而 rsn 将所有序列视为相同。
  • ron 使用不同的语法来表示结构和映射。 rsn 使用相同的语法来表示这两个概念。
  • ronOption<T> 提供了特殊支持。 rsnOption<T> 视为任何其他枚举。
  • ron 的解析规则与 Rust 相近但不同,而 rsn 尝试匹配实现。
    • Unicode 空白符和标识符(在 ron-rs/ron#444 中添加)
    • Rust 允许浮点字面量中使用 _
    • Rust 允许在字符串字面量中转义原始行结束符。
    • Rust 支持字节字符串和字节字面量,而 Ron 选择使用 base64 编码的字符串来表示字节值。

Rust 语法和 Rsn 之间的差异

语法与有效 Rust 代码不同

  • 映射字面量。Rust 没有映射字面量的语法。
  • 枚举变体未使用类型名称使用 -- RedColor::Red
    • 如果存在 use Color::*,则这是技术上有效的 Rust 语法。
  • 无穷大和 NaN 浮点数表示为 +inf/-inf/+NaN/-NaN
    • 为了与 Rust 语法兼容,正在考虑支持 f64::INFINITY

字面量解析的规则应尽可能接近 Rust 的规则。

依赖项

~115–360KB