rust_az_wrapper 0.1.0

Type-safe Rust wrapper for Azure CLI focused on Cosmos DB operations
Documentation
# ๐ŸŒ Rust Azure CLI Wrapper for Cosmos DB

> **A type-safe and ergonomic Rust wrapper for Azure CLI, with specific focus on Cosmos DB**

[![Rust](https://img.shields.io/badge/rust-1.70+-orange.svg)](https://www.rust-lang.org)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Azure CLI](https://img.shields.io/badge/Azure_CLI-Required-blue.svg)](https://docs.microsoft.com/en-us/cli/azure/)

## ๐ŸŽฏ About the Project

This project provides a **type-safe and ergonomic Rust interface** for Azure CLI operations related to **Cosmos DB**. Instead of dealing with command line commands and manual JSON parsing, you get:

- โœ… **Typed structs** for all Azure resources
- โœ… **Automatic serialization/deserialization** to/from JSON  
- โœ… **Robust error handling** with specific types
- โœ… **Asynchronous operations** with Tokio
- โœ… **Complete multi-subscription support**
- โœ… **Ergonomic API** that abstracts Azure CLI complexity

## โœจ Features

- ๐Ÿ” **Complete abstractions** for Azure CLI commands related to Cosmos DB
- ๐Ÿ“ฆ **Serializable models** for all resources (JSON in/out)
- ๐Ÿ›ก๏ธ **Robust error handling** with specific types
- โšก **Asynchronous operations** with Tokio
- ๐ŸŽฏ **Cosmos DB focused** - SQL API, MongoDB, throughput, keys
- ๐Ÿ”„ **Multi-subscription support** - work with specific subscriptions
- ๐Ÿ“‹ **Resource Groups** - complete management
- ๐Ÿงช **Extensively tested** with real Azure data

## ๐Ÿš€ Quick Start

### โš™๏ธ Prerequisites

- **Rust 1.70+** 
- **Azure CLI** installed and configured (`az --version`)
- **Valid Azure authentication** (`az login`)

```bash
# Check prerequisites
az --version
az account show  # Should show active subscription
```

### Basic Client

```rust
use rust_az_wrapper::{AzureClient, Result};

#[tokio::main]
async fn main() -> Result<()> {
    // Default client (uses current Azure CLI subscription)
    let client = AzureClient::new()?;
    
    // List available subscriptions
    let subscriptions = client.list_subscriptions().await?;
    
    // List resource groups
    let resource_groups = client.list_resource_groups(None).await?;
    
    // List Cosmos DB accounts
    let cosmos_accounts = client.list_cosmos_accounts(None).await?;
    
    Ok(())
}
```

### Working with Specific Subscriptions

```rust
use rust_az_wrapper::{AzureClient, Result};

#[tokio::main]
async fn main() -> Result<()> {
    // 1. Client configured for specific subscription
    let client = AzureClient::with_subscription("your-subscription-id".to_string())?;
    
    // 2. Mutable client to switch subscriptions
    let mut client = AzureClient::new()?;
    client.use_subscription("subscription-id".to_string());
    
    // All commands now use this subscription
    let rgs = client.list_resource_groups(None).await?;
    let cosmos = client.list_cosmos_accounts(None).await?;
    
    // Return to default subscription
    client.clear_subscription();
    
    // 3. Check configured subscription
    println!("Current subscription: {:?}", client.get_subscription());
    
    Ok(())
}
```

### Complete Example - Cosmos DB

```rust
use rust_az_wrapper::{AzureClient, Result};

#[tokio::main]
async fn main() -> Result<()> {
    let client = AzureClient::new()?;
    
    // Find a Cosmos account
    let accounts = client.list_cosmos_accounts(None).await?;
    let account = &accounts[0];
    
    // Get access keys
    let keys = client.list_cosmos_keys(&account.name, &account.resource_group).await?;
    println!("๐Ÿ”‘ Primary Key: {}...", &keys.primary_master_key[..20]);
    
    // List databases
    let databases = client.list_sql_databases(&account.name, &account.resource_group).await?;
    println!("๐Ÿ“š Databases: {}", databases.len());
    
    // For each database, list containers
    for db in &databases {
        let containers = client.list_sql_containers(
            &account.name, 
            &account.resource_group, 
            &db.name
        ).await?;
        println!("  ๐Ÿ“ฆ Database '{}': {} containers", db.name, containers.len());
    }
    
    // Convert to JSON
    let json = serde_json::to_string_pretty(&account)?;
    println!("๐Ÿ“„ Account as JSON:\n{}", json);
    
    Ok(())
}
```

## ๐Ÿ—๏ธ Project Architecture

```
rust_az_wrapper/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ lib.rs              # ๐Ÿ“š Main API and public exports
โ”‚   โ”œโ”€โ”€ client.rs           # ๐Ÿ”ง Unified Azure client 
โ”‚   โ”œโ”€โ”€ commands/           # ๐Ÿ“ Azure CLI specific commands
โ”‚   โ”‚   โ”œโ”€โ”€ account.rs      #   โ””โ”€ Subscriptions and Resource Groups
โ”‚   โ”‚   โ””โ”€โ”€ cosmos.rs       #   โ””โ”€ Cosmos DB specific
โ”‚   โ”œโ”€โ”€ models.rs           # ๐Ÿ“Š Typed models for Azure resources
โ”‚   โ”œโ”€โ”€ utils.rs            # ๐Ÿ› ๏ธ Utilities and command builder
โ”‚   โ””โ”€โ”€ error.rs            # โš ๏ธ Typed error system
โ”œโ”€โ”€ examples/               # ๐ŸŽฏ Practical examples
โ”‚   โ”œโ”€โ”€ basic_usage.rs      #   โ””โ”€ Basic wrapper usage
โ”‚   โ”œโ”€โ”€ json_output.rs      #   โ””โ”€ JSON conversion
โ”‚   โ””โ”€โ”€ subscription_usage.rs   โ””โ”€ Working with subscriptions
โ”œโ”€โ”€ tests/                  # ๐Ÿงช Integration tests
โ””โ”€โ”€ README.md, Cargo.toml   # ๐Ÿ“‹ Documentation and configuration
```

## ๐Ÿ”ง Implemented Features

### โœ… **Subscriptions & Resource Groups**
```rust
// List and manage subscriptions
let subs = client.list_subscriptions().await?;
let current = client.show_current_subscription().await?;

// Resource Groups with specific subscription
let rgs = client.list_resource_groups(Some("subscription-id")).await?;
let rg = client.show_resource_group("rg-name", Some("subscription-id")).await?;
```

### โœ… **Cosmos DB Accounts**
```rust
// Complete CRUD for accounts
let accounts = client.list_cosmos_accounts(Some("resource-group")).await?;
let account = client.show_cosmos_account("account-name", "rg").await?;
let new_account = client.create_cosmos_account(
    "name", "rg", "eastus", Some("GlobalDocumentDB"), /*...*/ None
).await?;
```

### โœ… **Keys and Authentication**
```rust
// Keys and connection strings
let keys = client.list_cosmos_keys("account", "rg").await?;
let readonly_keys = client.list_cosmos_read_only_keys("account", "rg").await?;
let conn_strings = client.list_cosmos_connection_strings("account", "rg").await?;
```

### โœ… **SQL API - Databases & Containers**
```rust
// SQL Databases
let databases = client.list_sql_databases("account", "rg").await?;
let new_db = client.create_sql_database("account", "rg", "db-name", Some(400), None).await?;

// SQL Containers
let containers = client.list_sql_containers("account", "rg", "db").await?;
let new_container = client.create_sql_container(
    "account", "rg", "db", "container", "/id", Some(400), None
).await?;
```

### โœ… **MongoDB API**
```rust
// MongoDB databases and collections
let mongo_dbs = client.list_mongodb_databases("account", "rg").await?;
let collections = client.list_mongodb_collections("account", "rg", "db").await?;
```

### โœ… **Throughput Management**
```rust
// Performance management
let db_throughput = client.get_database_throughput("account", "rg", "db").await?;
let updated = client.update_database_throughput("account", "rg", "db", Some(800), None).await?;
```

### Clone and Test

```bash
git clone https://github.com/your-user/rust_az_wrapper.git
cd rust_az_wrapper

# Run tests (requires configured Azure CLI)
cargo test

# Run examples
cargo run --example basic_usage
cargo run --example subscription_usage
```

## ๐Ÿงช **Test Status**

The project has **extensive test coverage** with real Azure data:

```bash
# Unit and integration tests
cargo test

# Functional examples  
cargo run --example basic_usage
cargo run --example subscription_usage
```

## ๐Ÿ”„ **Automatic JSON Conversion**

All types implement `Serialize` and `Deserialize`:

```rust
use rust_az_wrapper::{AzureClient, Result};

#[tokio::main] 
async fn main() -> Result<()> {
    let client = AzureClient::new()?;
    let accounts = client.list_cosmos_accounts(None).await?;
    
    // Rust structs โ†’ JSON
    let json = serde_json::to_string_pretty(&accounts)?;
    println!("{}", json);
    
    // JSON โ†’ Rust structs  
    let parsed: Vec<CosmosAccount> = serde_json::from_str(&json)?;
    
    // Work with typed data
    for account in parsed {
        println!("Account: {} in {}", account.name, account.location);
        println!("Endpoint: {}", account.document_endpoint);
    }
    
    Ok(())
}
```

## ๐ŸŽฏ **Use Cases**

### **DevOps & Automation**
```rust
// Automate Cosmos DB deployment
let account = client.create_cosmos_account(/* params */).await?;
let database = client.create_sql_database(/* params */).await?;
let container = client.create_sql_container(/* params */).await?;
```

### **Monitoring & Inventory**
```rust
// Discover resources across multiple subscriptions
for sub in subscriptions {
    let client = AzureClient::with_subscription(sub.id)?;
    let accounts = client.list_cosmos_accounts(None).await?;
    inventory.extend(accounts);
}
```

### **Migration & Backup**
```rust
// Get configurations for migration
let account = client.show_cosmos_account("source", "rg").await?;
let databases = client.list_sql_databases("source", "rg").await?;
let keys = client.list_cosmos_keys("source", "rg").await?;
```

## ๐Ÿค **Contributing**

1. Fork the project
2. Create a branch (`git checkout -b feature/new-feature`)
3. Commit changes (`git commit -am 'Add new feature'`)
4. Push to branch (`git push origin feature/new-feature`) 
5. Open a Pull Request