sleipnirdb 0.0.1

SleipnirDB – Bridging Worlds at Lightning Speed.
Documentation
use std::{borrow::Borrow, collections::HashSet, hash, ops::DerefMut, sync::{Arc, Mutex}};

use serde::{de::DeserializeOwned, Serialize};

use crate::{database::ExDatabase, error, table::contains::ContainsExTable};

use super::ExTable;

pub trait QueryExTable<T>
where T: Eq + hash::Hash + Serialize + DeserializeOwned {
    fn query_item<Q: PartialEq, V: Fn(&T) -> &Q>(
        &self,
        value: V,
        query: Q,
    ) -> Result<&T, error::DatabaseError>;
}

impl <T: Eq + hash::Hash + Serialize + DeserializeOwned>QueryExTable<T> for ExTable<T> {
    fn query_item<Q: PartialEq, V: Fn(&T) -> &Q>(
        &self,
        value: V,
        query: Q,
    ) -> Result<&T, error::DatabaseError> {
        for item in self.items.iter() {
            if value(item) == &query {
                return Ok(item);
            }
        }
    
        Err(error::DatabaseError::ItemNotFound)
    }
}

#[test]
fn query_item() {
    const TEST_DB: &str = "test/query_item_table_test/";
    const TEST: &str = "test";

    let mut table: ExTable<String> = ExTable {
        database: ExDatabase {
            path: TEST_DB.into(),
            table_labels: Arc::new(Mutex::new(vec![])),
        }.into(),
        label: "query_item_table".into(),
        items: HashSet::new(),
    };

    table.items.insert(TEST.into());

    assert_eq!(
        table.query_item(|i| i, TEST.into()).unwrap(),
        &TEST.to_string()
    )
}