versatile-data 0.76.0

A library for databases that has convenient datasets that group together commonly used fields and gives you the flexibility to create your own fields.
Documentation
#[cfg(test)]
#[test]
fn test5() {
    use std::sync::Arc;

    use versatile_data::*;

    let dir = "./vd-test5/";
    if std::path::Path::new(dir).exists() {
        std::fs::remove_dir_all(dir).unwrap();
    }

    if let Ok(mut data) = Data::new(dir) {
        data.update(&Operation::New {
            activity: Activity::Active,
            term_begin: Term::Default,
            term_end: Term::Default,
            fields: vec![KeyValue::new("num", "2".to_owned())],
        })
        .unwrap();
        data.update(&Operation::New {
            activity: Activity::Active,
            term_begin: Term::Default,
            term_end: Term::Default,
            fields: vec![KeyValue::new("num", "2".to_owned())],
        })
        .unwrap();
        data.update(&Operation::New {
            activity: Activity::Active,
            term_begin: Term::Default,
            term_end: Term::Default,
            fields: vec![KeyValue::new("num", "3".to_owned())],
        })
        .unwrap();
        data.update(&Operation::New {
            activity: Activity::Active,
            term_begin: Term::Default,
            term_end: Term::Default,
            fields: vec![KeyValue::new("num", "5".to_owned())],
        })
        .unwrap();
        data.update(&Operation::New {
            activity: Activity::Active,
            term_begin: Term::Default,
            term_end: Term::Default,
            fields: vec![KeyValue::new("num", "8".to_owned())],
        })
        .unwrap();

        println!("\nmatch");
        for r in data
            .search_default()
            .unwrap()
            .search_field("num", search::Field::Match(Arc::new(b"3".to_vec())))
            .result_with_sort(vec![Order::Asc(OrderKey::Serial)])
            .unwrap()
        {
            println!(
                "{} : {}",
                r,
                std::str::from_utf8(data.field_bytes(r, "num")).unwrap()
            );
        }

        println!("\nmin");
        for r in data
            .search_default()
            .unwrap()
            .search_field("num", search::Field::Min(Arc::new(b"3".to_vec())))
            .result_with_sort(vec![Order::Asc(OrderKey::Serial)])
            .unwrap()
        {
            println!(
                "{} : {}",
                r,
                std::str::from_utf8(data.field_bytes(r, "num")).unwrap()
            );
        }
        println!("\nmax");
        for r in data
            .search_default()
            .unwrap()
            .search_field("num", search::Field::Max(Arc::new(b"3".to_vec())))
            .result_with_sort(vec![Order::Asc(OrderKey::Serial)])
            .unwrap()
        {
            println!(
                "{} : {}",
                r,
                std::str::from_utf8(data.field_bytes(r, "num")).unwrap()
            );
        }

        println!("\nrange");
        for r in data
            .search_default()
            .unwrap()
            .search_field(
                "num",
                search::Field::Range(Arc::new(b"3".to_vec()), Arc::new(b"5".to_vec())),
            )
            .result_with_sort(vec![Order::Asc(OrderKey::Serial)])
            .unwrap()
        {
            println!(
                "{} : {}",
                r,
                std::str::from_utf8(data.field_bytes(r, "num")).unwrap()
            );
        }

        println!("\nrange bad");
        for r in data
            .search_default()
            .unwrap()
            .search_field(
                "num",
                search::Field::Range(Arc::new(b"5".to_vec()), Arc::new(b"3".to_vec())),
            )
            .result_with_sort(vec![Order::Asc(OrderKey::Serial)])
            .unwrap()
        {
            println!(
                "{} : {}",
                r,
                std::str::from_utf8(data.field_bytes(r, "num")).unwrap()
            );
        }
    }

    println!("OK");
}