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 中使用

MIT 许可证

28KB
513

Magnet,一个 JSON 模式生成器

Magnet on crates.io Magnet on docs.rs Magnet Download Magnet License Lines of Code Twitter

这两个相关的 crate,magnet_derivemagnet_schema,可以帮助您定义(在大多数情况下,可以自动推导)适用于您的领域模型类型的 MongoDB 风格的 JSON 模式。目前,该库的主要用例是在使用 AvocadoMongoDB 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

  • VecDequeBinaryHeapLinkedListRangeRangeInclusivePhantomData 实现 BsonSchema
  • 在适当的位置为映射键和集合元素添加 Eq + HashOrd 边界

v0.7.0

  • 将依赖项 uuid 升级到 0.7.1,并包含 v4serde 功能
  • 将依赖项 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! 现在不再克隆它们的参数
  • 更新 synquote 依赖项
  • 改进文档

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