dynamo_table 0.8.0

A high-level DynamoDB table abstraction with get_item, query, update, filter, batch operations, pagination, and type-safe queries
Documentation
mod support;
use dynamo_table::methods::DynamoTableMethods as DynamobTableMethods;
use dynamo_table::table::{DynamoTable, SortKey};
use support::*;

#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
struct ValueObject {
    prim: String,
    second: String,
    ux: String,
    number2: usize,
}

impl DynamoTable for ValueObject {
    type PK = String;
    type SK = String;
    const TABLE: &'static str = "tests_generic_value_objects";
    const PARTITION_KEY: &'static str = "prim";
    const SORT_KEY: Option<&'static str> = Some("second");

    fn partition_key(&self) -> String {
        self.prim.to_string()
    }

    fn sort_key(&self) -> SortKey<String> {
        Some(self.second.clone())
    }
}

#[tokio::test]
async fn test_generic_table_methods_left_diff() {
    let objects = (0..40)
        .map(|i| {
            let primary_key = format!("batchergetter{i}");
            let sort_key = i.to_string();

            ValueObject {
                prim: primary_key,
                second: sort_key,
                ux: "bla".into(),
                number2: 0,
            }
        })
        .collect::<Vec<_>>();

    let composite_keys = objects[0..10]
        .iter()
        .map(|obj| obj.composite_key())
        .collect::<Vec<_>>();

    let diffrence = ValueObject::left_diff(objects.clone(), composite_keys.clone());
    assert_eq!(diffrence, objects[10..].to_vec());

    let diffrence = ValueObject::left_diff(objects.clone(), vec![]);
    assert_eq!(diffrence, objects.to_vec());

    let diffrence = ValueObject::left_diff(
        objects.clone(),
        objects
            .iter()
            .map(|obj| obj.composite_key())
            .collect::<Vec<_>>(),
    );
    assert_eq!(diffrence, vec![]);
}

#[tokio::test]
async fn test_generic_table_methods_right_diff() {
    let objects = (0..40)
        .map(|i| {
            let primary_key = format!("batchergetter{i}");
            let sort_key = i.to_string();

            ValueObject {
                prim: primary_key,
                second: sort_key,
                ux: "bla".into(),
                number2: 0,
            }
        })
        .collect::<Vec<_>>();

    let composite_keys = objects[0..10]
        .iter()
        .map(|obj| obj.composite_key())
        .collect::<Vec<_>>();

    let diffrence = ValueObject::right_diff(objects.clone(), composite_keys.clone());
    assert_eq!(diffrence, vec![]);

    let diffrence = ValueObject::right_diff(objects[10..20].to_vec(), composite_keys.clone());
    assert_eq!(diffrence, composite_keys.clone());

    let diffrence = ValueObject::right_diff(objects[5..20].to_vec(), composite_keys.clone());
    assert_eq!(diffrence, composite_keys[..5].to_vec());
}