16 个版本 (7 个重大更改)
使用旧的 Rust 2015
0.8.0 | 2019 年 1 月 2 日 |
---|---|
0.7.0 | 2018 年 12 月 30 日 |
0.6.0 | 2018 年 12 月 26 日 |
0.4.0 | 2018 年 8 月 11 日 |
0.3.2 | 2018 年 7 月 25 日 |
#2631 在 数据库接口
在 avocado 中使用
28KB
513 行
Magnet,一个 JSON 模式生成器
这两个相关的 crate,magnet_derive
和 magnet_schema
,可以帮助您定义(在大多数情况下,可以自动推导)适用于您的领域模型类型的 MongoDB 风格的 JSON 模式。目前,该库的主要用例是在使用 Avocado 或 MongoDB Rust 驱动程序 时简化可序列化类型的验证。
定义的 BsonSchema
特性定义了一个函数,bson_schema
,它应该/将返回一个有效的 JSON 模式描述实现类型的结构的 Bson Document
。示例
#[macro_use]
extern crate serde_derive;
extern crate serde;
#[macro_use]
extern crate bson;
#[macro_use]
extern crate magnet_derive;
extern crate magnet_schema;
extern crate mongodb;
use std::collections::HashSet;
use magnet_schema::BsonSchema;
use mongodb::{ Client, ThreadedClient, CommandType };
use mongodb::db::{ ThreadedDatabase };
#[derive(BsonSchema)]
struct Person {
name: String,
nicknames: HashSet<String>,
age: usize,
contact: Option<Contact>,
}
#[derive(BsonSchema, Serialize, Deserialize)]
#[serde(tag = "type", content = "value")]
enum Contact {
Email(String),
Phone(u64),
}
fn main() {
let schema = Person::bson_schema();
let spec = doc! {
"create": "Person",
"validator": { "$jsonSchema": schema },
};
let client = Client::connect("localhost", 27017).expect("can't connect to mongod");
let db = client.db("Example");
db.command(spec, CommandType::CreateCollection, None).expect("network error");
// etc.
}
有关里程碑和自定义 #[attributes]
,请参阅 文档。
发行说明
v0.8.0
- 为
VecDeque
、BinaryHeap
、LinkedList
、Range
、RangeInclusive
和PhantomData
实现BsonSchema
- 在适当的位置为映射键和集合元素添加
Eq + Hash
和Ord
边界
v0.7.0
- 将依赖项
uuid
升级到 0.7.1,并包含v4
和serde
功能 - 将依赖项
url
升级到1.7.2
v0.6.0
- 为大小在 128 到 65536 之间且为 2N 的 2N、大小在 96 到 1536 之间且为 1.5 * 2N 的数组实现
impl BsonSchema
- 使用
syn::Generics::split_for_impl
重新编写泛型处理 - 在
magnet_schema
中也使用范围 lint
v0.5.0
- 正确处理具有默认泛型参数的泛型类型,不要在生成的
impl
(这会导致编译器错误)中包含默认值 - 为 Clippy 使用作用域 lint
- 更新一些依赖项
v0.4.0
- 将
bson
更新到0.13.0
并要求其u2i
功能。此版本修复了单位结构序列化为1元素数组的错误。该u2i
功能允许在适当的范围内将无符号整数序列化为有符号整数。
v0.3.3
- 修复了生成的 BSON 架构不允许
Option<enum>
为null
/None
的错误 - 从文档中删除一个错误的项目
- 修复了几个 Clippy lint
- 更新依赖项
v0.3.2
impl BsonSchemafor Document
impl BsonSchemafor ObjectId
- 文档改进
- 更新依赖项
v0.3.1
- 放宽了
HashMap
/BTreeMap
键的Display
约束,使用ToString
代替 - 更新
proc_macro2
依赖项,以便我们可以使用TokenStream::default()
v0.3.0
- 删除了
#[magnet)]
属性 UnorderedDoc::eq()
、assert_doc_eq!
和assert_doc_ne!
现在不再克隆它们的参数- 更新
syn
和quote
依赖项 - 改进文档
v0.2.1
- 更新
bson
依赖项
v0.2.0
- 支持泛型类型
v0.1.4
- 已添加单元测试和测试套件。
- 错误修复:
Option::bson_schema()
未处理bsonType
字段,因此不允许Option<integer>
为null
。这已被纠正。 - 错误修复:现在每个生成的架构现在都使用
Bson::I64
来表示数组长度/集合计数 - 增强:现在
impl BsonSchema for { HashMap, BTreeMap }
对键的 trait bound 要求不那么严格。现在是Display
而不是AsRef<str>
。
v0.1.3
- 为结构体字段(包括新类型和元组)添加对
#[magnet(min_incl = "...", min_excl = "...", max_incl = "...", max_excl = "...")]
属性的支撑
v0.1.2
- 支持
enum
,遵循Serde的标记约定(未标记/外部/内部/相邻),除了其他(内部)enum
周围的新类型变体 - 重构,代码质量提升
v0.1.1
- 支持新类型结构体和元组结构体
- 尊重
#[serde(rename_all = "...")]和
#[serde(rename = "...")]
属性 - 添加Serde兼容的case转换
- 代码格式化/组织以及文档改进
v0.1.0
- 首次发布,仅支持具有命名字段的常规结构体
依赖项
~4–5.5MB
~97K SLoC