ledb-types 0.4.0

Basic types for storable documents
Documentation
use super::{Identifier, KeyFields};
use std::{
    borrow::Cow,
    hash::BuildHasher,
    collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque},
    rc::{Rc, Weak as RcWeak},
    sync::{Arc, Mutex, RwLock, Weak as ArcWeak},
};

/// Primary key (document identifier)
pub type Primary = u32;

/// Identified document representation
pub trait Document {
    /// Get the name of primary field
    fn primary_field() -> Identifier {
        "$".into()
    }

    /// Get other key fields (indexes)
    fn key_fields() -> KeyFields {
        KeyFields::new()
    }
}

impl<'a, T: Document> Document for &'a T {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for &'a mut T {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for &'a [T] {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for &'a mut [T] {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<T: Document> Document for [T] {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<T: Document> Document for Vec<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<T: Document> Document for VecDeque<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<T: Document, S: BuildHasher> Document for HashSet<T, S> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<K, T: Document, S: BuildHasher> Document for HashMap<K, T, S> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields().with_parent("*")
    }
}

impl<T: Document> Document for BTreeSet<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<K, T: Document> Document for BTreeMap<K, T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields().with_parent("*")
    }
}

impl<'a, T: Document> Document for Box<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for Rc<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for RcWeak<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for Arc<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for ArcWeak<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for Mutex<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document> Document for RwLock<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<'a, T: Document + Clone> Document for Cow<'a, T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

impl<T: Document> Document for Option<T> {
    fn primary_field() -> Identifier {
        T::primary_field()
    }

    fn key_fields() -> KeyFields {
        T::key_fields()
    }
}

#[cfg(feature = "json")]
impl Document for serde_json::Value {}

#[cfg(feature = "cbor")]
impl Document for serde_cbor::Value {}