#mongo-db #json #derive #macro-derive #macro #api-bindings

magnet derive

Magnet,一个 JSON/BSON 架构生成器

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

MIT 许可证

36KB
774

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 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

  • VecDequeBinaryHeapLinkedListRangeRangeInclusivePhantomData 实现 BsonSchema
  • 在适当的地方对映射键和集合元素添加了 Eq + HashOrd 约束

v0.7.0

  • uuid 依赖项升级到 0.7.1,并包含 v4serde 功能
  • 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! 现在不再克隆它们的参数
  • 更新 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 } 对键的特质量约更宽松。现在它是 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