2 个不稳定版本

0.2.0 2024年6月15日
0.1.0 2024年6月4日

解析器实现 中排名第 1121

MIT 许可证

19KB
522

anyseq

anyseq 是一个 Rust 包,提供了一个名为 Lexer 的特质,用于将结构化文本分割成字符串标记。通过实现此特质,可以自动生成 serde 的 Deserializer。

功能

  • 提供了一个名为 Lexer 的特质,用于创建标记流。
  • 当实现此特质时,会自动生成 serde Deserializer。
  • 简化了 Deserializer 的实现,例如将逗号分隔的字符串分割成标记的 lexer。
  • Lexerwinnow 包兼容,使得在使用 winnow 时更容易实现。

使用

use anyseq::{Token, Lexer};
use anyseq::de::Deserializer;
use serde::Deserialize;

struct IterLexer;

impl<I, O> Lexer<I, Token<O>> for IterLexer 
where
I: Iterator<Item = O>
{
    type Error = Box<dyn std::error::Error>;
    fn item(input: &mut I) -> Result<Token<O>, Self::Error> {
        Ok(match input.next() {
                Some(t) => Token::Item(t),
                None => Token::SeqEnd,
        })
    }
}

#[derive(Debug, PartialEq, Deserialize)]
struct Test {
    a: i32,
    b: String,
}

let mut d = Deserializer::<IterLexer, _, _>::new(["42", "foo"].into_iter());
assert_eq!(
    Test {
        a: 42,
        b: "foo".to_string(),
    },
    Test::deserialize(&mut d).unwrap()
);

依赖

~1.2–1.8MB
~38K SLoC