#serialization #no-std

no-std valuable

对象安全的值检查,用于在特对象边界传递无类型的结构化数据

2 个不稳定版本

0.1.0 2022 年 1 月 3 日
0.0.0 2021 年 3 月 9 日

644调试 中排名 644

Download history 553246/week @ 2024-03-14 573653/week @ 2024-03-21 570456/week @ 2024-03-28 590032/week @ 2024-04-04 606608/week @ 2024-04-11 612423/week @ 2024-04-18 550282/week @ 2024-04-25 569383/week @ 2024-05-02 560130/week @ 2024-05-09 605081/week @ 2024-05-16 589135/week @ 2024-05-23 663166/week @ 2024-05-30 641800/week @ 2024-06-06 660875/week @ 2024-06-13 686740/week @ 2024-06-20 559848/week @ 2024-06-27

每月下载量 2,681,776
用于 8,460 个代码包 (直接使用 27 个)

MIT 许可证

130KB
1.5K SLoC

Valuable

Valuable 提供对象安全的值检查。用例包括将结构化数据传递到特对象和对象安全的序列化。

许可证

本项目采用 MIT 许可证

贡献

除非你明确表示,否则你提交给 Valuable 的任何有意贡献都将按照 MIT 许可证许可,不附加任何额外的条款或条件。


lib.rs:

Valuable 提供对象安全的值检查。用例包括将结构化数据传递到特对象和对象安全的序列化。

入门

首先,在你的类型上派生 [Valuable][macro@crate::Valuable]。

use valuable::Valuable;

#[derive(Valuable)]
struct HelloWorld {
    message: Message,
}

#[derive(Valuable)]
enum Message {
    HelloWorld,
    Custom(String),
}

然后,实现一个 [访问者][Visit] 来检查数据。

use valuable::{NamedValues, Value, Valuable, Visit};

struct Print;

impl Visit for Print {
    fn visit_value(&mut self, value: Value<'_>) {
        match value {
            Value::Structable(v) => {
                println!("struct {}", v.definition().name());
                v.visit(self);
            }
            Value::Enumerable(v) => {
                println!("enum {}::{}", v.definition().name(), v.variant().name());
                v.visit(self);
            }
            Value::Listable(v) => {
                println!("list");
                v.visit(self);
            }
            Value::Mappable(v) => {
                println!("map");
                v.visit(self);
            }
            _ => {
                println!("value {:?}", value);
            }
        }
    }

    fn visit_named_fields(&mut self, named_fields: &NamedValues<'_>) {
        for (field, value) in named_fields.iter() {
            println!("named field {}", field.name());
            value.visit(self);
        }
    }

    fn visit_unnamed_fields(&mut self, values: &[Value<'_>]) {
        for value in values {
            value.visit(self);
        }
    }

    fn visit_entry(&mut self, key: Value<'_>, value: Value<'_>) {
        println!("key / value");
        key.visit(self);
        value.visit(self);
    }
}

然后,使用访问者来访问值。

let hello_world = HelloWorld { message: Message::HelloWorld };
hello_world.visit(&mut Print);

依赖项

~220KB