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 License: MIT Azure CLI

๐ŸŽฏ 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)
# Check prerequisites
az --version
az account show  # Should show active subscription

Basic Client

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

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

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

// 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

// 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

// 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

// 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

// 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

// 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

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:

# 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:

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

// 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

// 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

// 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