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 日 |
#128 在 #mongo-db
用于 2 crate
36KB
774 行
Magnet,一个 JSON 架构生成器
这两个相关 crate,magnet_derive
和 magnet_schema
帮助您定义(并在大多数情况下自动推导)适用于您的领域模型类型的 MongoDB 风格的 JSON 架构。目前,该库的主要用例是在使用 Avocado 或 MongoDB Rust 驱动程序时轻松验证可序列化类型。
定义的 BsonSchema
trait 定义了一个函数,bson_schema
,它应该/将返回一个 Bson Document
,该文档是一个有效的 JSON 架构,描述了实现类型的结构。示例
#[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 和大小在 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(rename = "...")]
属性 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 }
对键的特质量约更宽松。现在它是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 兼容的案例转换
- 代码格式化/组织以及文档改进
v0.1.0
- 初始发布,仅支持具有命名字段的常规结构体
依赖项
~2MB
~47K SLoC