4 个版本 (2 个重大更新)

0.4.0 2020年6月11日
0.3.0 2019年9月6日
0.2.1 2018年10月27日
0.2.0 2018年10月27日

#24#primary-key


ledb 中使用

MIT 许可证

33KB
606

用于定义可存储文档的宏

License: MIT Travis-CI Build Status Appveyor Build status Crates.io Package Docs.rs API Documentation

这个 帮助定义可以由持久存储(如 LEDB)管理的文档。

LEDB 是一个实现简单但高效、轻量但强大的文档存储的尝试。

缩写 LEDB 可解释为轻量级嵌入式数据库、低端数据库、锂离子引擎数据库、LitE 数据库等。

使用示例

use serde::{Serialize, Deserialize};
use ledb::{Document};

#[derive(Serialize, Deserialize, Document)]
struct MyDoc {
    // define optional primary key field
    #[document(primary)]
    id: Option<Primary>,
    // define unique key field
    #[document(unique)]
    title: String,
    // define index fields
    #[document(index)]
    tag: Vec<String>,
    #[document(unique)]
    timestamp: u32,
    // define nested document
    #[document(nested)]
    meta: MetaData,
}

#[derive(Serialize, Deserialize, Document)]
#[document(nested)]
struct MetaData {
    // define index field
    #[document(index)]
    keywords: Vec<String>,
    // define other fields
    description: String,
}

这将自动生成如下的 Document 特性

impl Document for MyDoc {
    // declare primary key field name
    fn primary_field() -> Identifier {
        "id".into()
    }

    // declare other key fields for index
    fn key_fields() -> KeyFields {
        KeyFields::new()
            // add key fields of document
            .with_field(("title", String::key_type(), IndexKind::Unique))
            .with_field(("tag", String::key_type(), IndexKind::Index))
            .with_field(("timestamp", u32::key_type(), IndexKind::Unique))
            // add key fields from nested document
            .with_fields(MetaData::key_fields().with_parent("meta"))
    }
}

impl Document for MetaData {
    // declare key fields for index
    fn key_fields() -> KeyFields {
        KeyFields::new()
            // add key fields of document
            .with_field(("keywords", KeyType::String, IndexKind::Index))
    }
}

依赖

~1.5MB
~35K SLoC