readb 0.4.1

A simple, efficient, and modular embedded read-first key-value database in Rust.
Documentation
#[cfg(all(feature = "remote-cloning", feature = "write"))]
mod tests {
    use readb::{clone_from, Database, DatabaseSettings, DefaultDatabase, IndexType};
    use std::fs;
    use std::path::PathBuf;
    use tokio::sync::OnceCell;
    use warp::Filter;

    const RANDOM_STRINGS_WITH_KEYS: [(&str, &str); 6] = [
        ("hi", "hello"),
        ("there", "there"),
        ("how", "are"),
        ("you", "doing"),
        ("today", "today"),
        ("?", "?"),
    ];

    static SERVER_STARTED: OnceCell<()> = OnceCell::const_new();

    fn create_database(location: &PathBuf) {
        let mut db = DefaultDatabase::new(DatabaseSettings {
            path: Some(location.to_path_buf()),
            cache_size: None,
            index_type: IndexType::HashMap,
            ..Default::default()
        });

        for (_, (key, val)) in RANDOM_STRINGS_WITH_KEYS.iter().enumerate() {
            db.put(key, val.as_bytes()).unwrap();
        }

        db.persist().unwrap();
    }

    async fn start_mock_server(dir: PathBuf) {
        let d = dir.as_os_str().to_str().unwrap().to_string();
        SERVER_STARTED
            .get_or_init(|| async move {
                let content = warp::path("content")
                    .and(warp::path::param::<String>())
                    .map(move |filetype: String| {
                        println!("Reading file: {}", filetype);
                        let file_path = format!("{}/.rdb.{}", d.as_str(), filetype);
                        let content = std::fs::read_to_string(file_path).unwrap();
                        warp::http::Response::builder()
                            .header("content-type", "text/plain")
                            .body(content)
                    })
                    .with(warp::log("mock_server"));

                let _ = tokio::spawn(warp::serve(content).run(([127, 0, 0, 1], 3030)));
            })
            .await;
    }

    #[tokio::test]
    async fn test_simple_read_after_creation() {
        let dir = tempfile::tempdir().unwrap();
        let mock_dir = dir.path().join("./mock");
        fs::create_dir(&mock_dir).unwrap();

        println!("Creating mock database");
        create_database(&mock_dir);

        println!("Starting mock server");
        start_mock_server(mock_dir).await;

        println!("Mock server started");

        let database_dir = dir.path().join("./database");
        fs::create_dir(&database_dir).unwrap();

        println!(
            "Cloning from http://localhost:3030/content to {}",
            database_dir.as_os_str().to_str().unwrap()
        );
        clone_from(
            "http://localhost:3030/content",
            &database_dir.as_os_str().to_str().unwrap(),
            None,
        )
        .await
        .unwrap();

        let mut db = DefaultDatabase::new(DatabaseSettings {
            path: Some(database_dir.to_path_buf()),
            cache_size: None,
            index_type: IndexType::HashMap,
            ..Default::default()
        });

        for (key, value) in RANDOM_STRINGS_WITH_KEYS.iter() {
            assert_eq!(db.get(key).unwrap().unwrap(), value.as_bytes());
        }
    }
}