dynamode 0.1.1

A professional, extensible ODM for AWS DynamoDB in Rust
Documentation
# Dynamode

A professional, ergonomic, and extensible Rust Object-Document Mapper (ODM) for DynamoDB  
Supports **DynamoDB Local** out-of-the-box for fast local development and testing.

---

## 🚀 Features

- Async Rust API for DynamoDB (powered by [aws-sdk-dynamodb]https://crates.io/crates/aws-sdk-dynamodb)
- Define models as Rust structs with familiar traits
- Works with DynamoDB Local for easy testing/development
- Table auto-creation helpers
- CRUD operations: insert, fetch, update, delete
- Query by partition key, full-table scan, and more!
- Ready for expansion: batch ops, GSIs, conditional writes, etc.

---

## 📦 Installation

Add to your `Cargo.toml`:

```toml
[dependencies]
dynamode = { version = "*" }
serde = { version = "*", features = ["derive"] }
tokio = { version = "*", features = ["full"] }
aws-sdk-dynamodb = "*"
aws-config = "*"
async-trait = "*"
```

## 🛠️ Running DynamoDB Local
With Docker (recommended):
```
docker run -d -p 8000:8000 amazon/dynamodb-local
```
Set dummy AWS credentials (required by the SDK):
```
export AWS_ACCESS_KEY_ID=dummy
export AWS_SECRET_ACCESS_KEY=dummy
```
🚗 Quick Example
```
use serde::{Serialize, Deserialize};
use dynamode::agent::DynamodeAgent;
use dynamode::model::DynamoModel;

#[derive(Debug, Serialize, Deserialize)]
struct Car {
    pk: String,
    sk: String,
    brand: String,
    model: String,
    horsepower: i32,
}

#[async_trait::async_trait]
impl DynamoModel for Car {
    fn table_name() -> &'static str { "Cars" }
    fn partition_sort_key(&self) -> (String, String) {
        (self.pk.clone(), self.sk.clone())
    }
}

#[tokio::main]
async fn main() {
    let agent = DynamodeAgent::connect_local().await;

    let car = Car {
        pk: "tesla".into(),
        sk: "model-y".into(),
        brand: "Tesla".into(),
        model: "Model Y".into(),
        horsepower: 420,
    };

    agent.put(&car).await.expect("insert failed");
    let fetched = agent.get::<Car>(("tesla".into(), "model-y".into())).await.expect("get failed");
    println!("Fetched: {:?}", fetched);
}
```
## 📋 Test Example
All features work with cargo test using DynamoDB Local!
Test cases are in main.rs as async functions.

## 🏗️ Table Creation
The first run will auto-create your table if it does not exist (see main.rs example).
You can also create tables manually via the AWS CLI:

```
aws dynamodb create-table \
    --table-name Cars \
    --attribute-definitions AttributeName=pk,AttributeType=S AttributeName=sk,AttributeType=S \
    --key-schema AttributeName=pk,KeyType=HASH AttributeName=sk,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST \
    --endpoint-url http://localhost:8000 \
    --region us-west-2
```
## ⚡ Tips
Always run DynamoDB Local (docker run -p 8000:8000 amazon/dynamodb-local) before developing or running tests.

Set AWS credentials in your shell session, even for local.

You can extend the agent for batch ops, transactional writes, secondary indexes, and more.

## 🧑‍💻 Contributing
PRs, issues, and feature requests are welcome!
Feel free to fork and build your own supercharged DynamoDB ORM.

## 📝 License
MIT

## 📣 Credits
Built by Rust and DynamoDB fans, with inspiration from the AWS SDK team and open source community.