use std::env;
use std::collections::HashMap;
use std::sync::{Mutex, Arc};
use rusoto_core::Region;
use rusoto_dynamodb::{
AttributeValue, DynamoDb, DynamoDbClient,
DeleteItemInput,
GetItemInput,
ScanInput,
PutItemInput,
};
lazy_static! {
static ref ddb_conn: Arc<Mutex<DynamoDbClient>> = {
if let Ok(endpoint) = env::var("DYNAMODB_ENPOINT") {
Arc::new(Mutex::new(DynamoDbClient::simple(
Region::Custom {
name: env::var("AWS_DEFAULT_REGION").unwrap_or(format!("us-east-1")),
endpoint: endpoint.to_string(),
},
)))
} else {
Arc::new(Mutex::new(DynamoDbClient::simple(Region::default())))
}
};
}
type TableName = &'static str;
pub type Scan = rusoto_dynamodb::ScanOutput;
pub type ScanErr = rusoto_dynamodb::ScanError;
pub type Get = rusoto_dynamodb::GetItemOutput;
pub type GetErr = rusoto_dynamodb::GetItemError;
pub type Add = rusoto_dynamodb::PutItemOutput;
pub type AddErr = rusoto_dynamodb::PutItemError;
pub type Del = rusoto_dynamodb::DeleteItemOutput;
pub type DelErr = rusoto_dynamodb::DeleteItemError;
pub type AttributeMap = HashMap<String, AttributeValue>;
pub type RustamoDbScanOutput = Vec<AttributeMap>;
pub type RustamoDbGetOutput = AttributeMap;
pub type RustamoDbError = String;
pub struct GetItem { pub key: AttributeMap }
pub struct AddItem { pub item: AttributeMap }
pub struct DelItem { pub key: AttributeMap }
pub fn scan(table_name: TableName) -> Result<RustamoDbScanOutput, RustamoDbError> {
let scan_input: ScanInput = ScanInput {
table_name: table_name.to_string(),
..Default::default()
};
match ddb_conn.lock().unwrap().scan(&scan_input).sync() {
Ok(scan_output) => {
match scan_output.items {
Some(items) => Ok(items),
None => Err(format!("no items in db")),
}
},
Err(_) => Err(format!("no db found")),
}
}
pub fn get_item(table_name: TableName, attrs: GetItem) -> Result<RustamoDbGetOutput, RustamoDbError> {
let get_item_input: GetItemInput = GetItemInput {
table_name: table_name.to_string(),
key: attrs.key,
..Default::default()
};
match ddb_conn.lock().unwrap().get_item(&get_item_input).sync() {
Ok(get_output) => {
match get_output.item {
Some(item) => Ok(item),
None => Err(format!("item not found in dynamo_db")),
}
},
Err(_) => Err(format!("unknown error")),
}
}
pub fn add_item(table_name: &str, attrs: AddItem) -> Result<Add, AddErr> {
let add_item_input: PutItemInput = PutItemInput {
table_name: table_name.to_string(),
item: attrs.item,
..Default::default()
};
ddb_conn.lock().unwrap().put_item(&add_item_input).sync()
}
pub fn del_item(table_name: &str, attrs: DelItem) -> Result<Del, DelErr> {
let del_item_input: DeleteItemInput = DeleteItemInput {
table_name: table_name.to_string(),
key: attrs.key,
..Default::default()
};
ddb_conn.lock().unwrap().delete_item(&del_item_input).sync()
}