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 日 |
#1060 在 Rust 模式
每月下载量 57
41KB
722 代码行
type_description
此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::Deserialize
和serde::Serialize
类型兼容 - 为实现
AsTypeDescription
的类型生成机器可读的描述
非目标
- 通过
TypeDescription
构造值(应首选serde::Deserialize
) - 任何形式的反射
许可证
MPL-2.0
依赖项
~1–14MB
~124K SLoC