5 个版本 (破坏性更新)

0.5.0 2023 年 5 月 16 日
0.4.0 2023 年 4 月 18 日
0.3.0 2023 年 4 月 13 日
0.2.0 2022 年 9 月 17 日
0.1.0 2022 年 7 月 29 日

#1060Rust 模式

Download history 19/week @ 2024-03-12 6/week @ 2024-03-19 1/week @ 2024-03-26 14/week @ 2024-04-02 45/week @ 2024-04-16

每月下载量 57

MPL-2.0 许可证

41KB
722 代码行

type_description

Bors enabled docs.rs crates.io

此crate为类型提供机器可读的描述。

有关一般概述,请参阅指南

想法是通过以用户能理解的方式解释类型,使用户能够发现类型,而无需了解实现细节(例如,u16 是一个 16 位整数)

示例

可以使用此crate解释配置类型,并将解释(在GUI、Web界面、某些特殊的配置编辑器中)展示给用户。

use type_description::AsTypeDescription;
use type_description::TypeDescription;
use type_description::TypeKind;
use type_description::Sign;

/// A configuration
#[derive(TypeDescription)]
struct Config {
    /// The bind address
    addr: std::net::SocketAddr,

    /// The Port
    port: u16,
}

let desc = Config::as_type_description();

assert_eq!(desc.name(), "Config");
assert_eq!(desc.doc(), Some("A configuration"));
assert!(std::matches!(desc.kind(), TypeKind::Struct(_)));

match desc.kind() {
    TypeKind::Struct(v) => {
        let first_field = &v[0];
        assert_eq!(first_field.name(), "addr");
        assert_eq!(first_field.doc(), Some("The bind address"));
        assert_eq!(first_field.kind().name(), "String");
        assert_eq!(first_field.kind().doc(), Some("A socket address"));
        assert_eq!(*first_field.kind().kind(), type_description::TypeKind::String);

        let second_field = &v[1];
        assert_eq!(second_field.name(), "port");
        assert_eq!(second_field.doc(), Some("The Port"));
        assert_eq!(second_field.kind().name(), "Integer");
        assert_eq!(second_field.kind().doc(), Some("An unsigned integer with 16 bits"));
        assert_eq!(*second_field.kind().kind(), type_description::TypeKind::Integer { size: 16, sign: Sign::Unsigned });
    }
    _ => unreachable!()
}

额外类型

此crate包含各种第三方crate的 AsTypeDescription 实现的代码。最新列表可在docs.rs上找到。

目标

  • 遵循 serde 模型,并与所有 serde::Deserializeserde::Serialize 类型兼容
  • 为实现 AsTypeDescription 的类型生成机器可读的描述

非目标

  • 通过 TypeDescription 构造值(应首选 serde::Deserialize
  • 任何形式的反射

许可证

MPL-2.0

依赖项

~1–14MB
~124K SLoC