dynamo_mapper 0.1.0

A simple library to map Rust structs to/from DynamoDB items
Documentation
use rusoto_dynamodb::{AttributeValue};
use std::collections::HashMap;

extern crate dynamo_mapper_macro;
pub use dynamo_mapper_macro::*;

pub type DynamoItem = HashMap<String, AttributeValue>;

pub trait DynamoMapper {
    fn to_dynamo(&self) -> DynamoItem;
    fn from_dynamo(item: &DynamoItem) -> Self;
}

pub trait DynamoAttribute {
    fn to_dynamo(&self) -> Option<AttributeValue>;
    fn from_dynamo(item: &DynamoItem, key: String) -> Option<Self> where Self: std::marker::Sized;
}

impl DynamoAttribute for String {
    fn to_dynamo(&self) -> Option<AttributeValue> {
        if self.to_string() != String::new() {
            Some(AttributeValue {
                s: Some(self.to_string()),
                ..Default::default()
            })
        } else {
            None
        }
    }

    fn from_dynamo(item: &DynamoItem, key: String) -> Option<String>{
        if let Some(attribute_value) = item.get(&key) {
            if let Some(string) = &attribute_value.s {
                return Some(string.to_string());
            }
        };

        return None;
    }
}

impl DynamoAttribute for u128 {
    fn to_dynamo(&self) -> Option<AttributeValue> {
        Some(AttributeValue {
            n: Some(self.to_string()),
            ..Default::default()
        })
    }

    fn from_dynamo(item: &DynamoItem, key: String) -> Option<u128>{
        if let Some(attribute_value) = item.get(&key) {
            if let Some(string_value) = &attribute_value.n {
                let int_value: u128 = string_value.parse().unwrap();
                return Some(int_value);
            };
        };

        return None;
    }
}

impl DynamoAttribute for bool {
    fn to_dynamo(&self) -> Option<AttributeValue> {
        Some(AttributeValue {
            bool: Some(*self),
            ..Default::default()
        })
    }

    fn from_dynamo(item: &DynamoItem, key: String) -> Option<bool>{
        if let Some(attribute_value) = item.get(&key) {
            return attribute_value.bool;
        };

        return None;
    }
}

#[cfg(feature = "uuid")]
mod dynamo_mapper_uuid {
    use uuid::Uuid;
    use crate::{DynamoAttribute, DynamoItem};
    use rusoto_dynamodb::{AttributeValue};

    impl DynamoAttribute for Uuid {
        fn to_dynamo(&self) -> Option<AttributeValue> {
            self.to_string().to_dynamo()
        }

        fn from_dynamo(item: &DynamoItem, key: String) -> Option<Uuid>{
            if let Some(string_value) = String::from_dynamo(item, key){
                if let Ok(uuid) = Uuid::parse_str(string_value.as_str()) {
                    return Some(uuid);
                }
            }

            return None;
        }
    }
}