feature: add more rules for config and observability. Bump version to 0.1.2.

This commit is contained in:
Tyr Chen
2025-05-31 15:54:39 -07:00
parent bad96e17e8
commit 3e915cf904
9 changed files with 1891 additions and 116 deletions

157
README.md
View File

@@ -6,12 +6,14 @@ A comprehensive collection of Rust development rules designed for use with Curso
## ✨ Features
- 🏗️ **Modern Architecture Patterns** - Domain-driven design, subsystem organization, and clean architecture
- 🏗️ **Modern Architecture Patterns** - Domain-driven design, service-oriented architecture, and clean architecture
- 🌐 **Web Development Standards** - Axum web framework, OpenAPI integration, authentication patterns
- 🗄️ **Database Best Practices** - SQLx patterns, migrations, connection pooling, and repository patterns
-**Async & Concurrency** - Tokio patterns, async/await best practices, and concurrent data structures
- ⚙️ **Configuration Management** - Multi-format config support, hot-reloading, validation, and environment overrides
- 📊 **Observability & Monitoring** - Metrics collection, distributed tracing, health checks, and performance monitoring
- 🛠️ **Utility Libraries** - JWT authentication, CLI development, HTTP clients, and more
- 📦 **Workspace Organization** - Multi-crate workspace structure with clear subsystem boundaries
- 📦 **Workspace Organization** - Multi-crate workspace structure with clear service boundaries
- 🔍 **Code Quality** - Comprehensive linting, error handling, testing, and documentation standards
## 🚀 Quick Start
@@ -47,6 +49,8 @@ rules:
- "@rust/database" # Database patterns with SQLx
- "@rust/cli" # CLI applications with clap
- "@rust/concurrency" # Async and concurrency patterns
- "@rust/configuration" # Configuration management patterns
- "@rust/observability" # Metrics, tracing, and health checks
- "@rust/utilities" # Utility libraries and CLI tools
- "@rust/workspace" # Multi-crate workspace organization
```
@@ -59,6 +63,14 @@ rules:
- "@rust/core/code-quality"
- "@rust/features/axum"
- "@rust/features/database"
- "@rust/features/observability" # For production monitoring
# .cursorrules - Service with dynamic configuration
rules:
- "@rust/core/code-quality"
- "@rust/features/configuration"
- "@rust/features/observability"
- "@rust/features/utilities"
```
## 📁 Project Structure
@@ -74,6 +86,8 @@ cursor-rust-rules/
│ │ ├── database.mdc # Database patterns
│ │ ├── cli.mdc # CLI application patterns
│ │ ├── concurrency.mdc # Async/concurrency patterns
│ │ ├── configuration.mdc # Configuration management patterns
│ │ ├── observability.mdc # Metrics, tracing, health checks
│ │ ├── utilities.mdc # Utility libraries
│ │ ├── http-client.mdc # HTTP client patterns
│ │ └── tools-and-config.mdc # Development tools
@@ -94,6 +108,8 @@ cursor-rust-rules/
- **Database** (`@rust/features/database`) - SQLx patterns, migrations, connection pooling
- **CLI Applications** (`@rust/features/cli`) - Clap 4.0+, subcommands, enum_dispatch, modern CLI patterns
- **Concurrency** (`@rust/features/concurrency`) - Tokio, async patterns, concurrent data structures
- **Configuration** (`@rust/features/configuration`) - Multi-format config, hot-reloading, validation patterns
- **Observability** (`@rust/features/observability`) - Metrics collection, distributed tracing, health checks
- **Utilities** (`@rust/features/utilities`) - JWT, CLI tools, builder patterns, validation
- **HTTP Client** (`@rust/features/http-client`) - Reqwest patterns, retry logic, authentication
- **Tools & Config** (`@rust/features/tools-and-config`) - Development tooling and configuration
@@ -115,17 +131,30 @@ axum = { version = "0.8", features = ["macros", "multipart", "ws"] }
utoipa = { version = "5.0", features = ["axum_extras", "chrono", "uuid"] }
sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "postgres"] }
tokio = { version = "1.45", features = ["macros", "rt-multi-thread"] }
# Configuration management
figment = { version = "0.10", features = ["yaml", "toml", "env"] }
arc-swap = "1.0"
validator = { version = "0.18", features = ["derive"] }
# Observability
prometheus = "0.13"
opentelemetry = "0.23"
tracing-opentelemetry = "0.23"
dashmap = "6.0"
```
Your project follows patterns like:
```rust
// AppState with hot-reloadable config
// AppState with hot-reloadable config and observability
#[derive(Clone)]
pub struct AppState {
pub config: Arc<ArcSwap<AppConfig>>,
pub db: PgPool,
pub http_client: reqwest::Client,
pub metrics: Arc<MetricsCollector>,
pub health_manager: Arc<HealthManager>,
}
// Route handlers with OpenAPI documentation
@@ -172,6 +201,85 @@ pub async fn setup_database(config: &DatabaseConfig) -> Result<PgPool, DatabaseE
}
```
### Configuration Management
For dynamic configuration with hot-reloading:
```rust
// Multi-format configuration with validation
#[derive(Debug, Clone, Deserialize, Validate)]
pub struct AppConfig {
#[validate(length(min = 1, max = 100))]
pub name: String,
#[validate(range(min = 1, max = 65535))]
pub port: u16,
#[validate(nested)]
pub database: DatabaseConfig,
#[serde(default)]
#[validate(nested)]
pub observability: ObservabilityConfig,
}
// Hot-reloadable configuration manager
pub struct ConfigManager<T> {
current: Arc<ArcSwap<T>>,
reload_tx: broadcast::Sender<Arc<T>>,
}
impl<T> ConfigManager<T>
where
T: for<'de> Deserialize<'de> + Validate + Clone + Send + Sync + 'static,
{
pub async fn start_watching(&self) -> Result<(), ConfigError> {
// File system watching with atomic configuration updates
// Supports YAML, TOML, JSON with environment variable overrides
}
}
```
### Observability & Monitoring
For production-ready metrics and health checks:
```rust
// Lock-free metrics collection
pub struct MetricsCollector {
counters: DashMap<String, Arc<AtomicCounter>>,
prometheus_registry: Registry,
}
// Request timing middleware
pub struct RequestTimer {
start_time: Instant,
metrics: Arc<MetricsCollector>,
operation: String,
}
// Health check framework
#[async_trait]
pub trait HealthCheck: Send + Sync {
async fn check(&self) -> HealthCheckResult;
fn name(&self) -> &str;
}
// Distributed tracing setup
pub fn setup_tracing(config: TracingConfig) -> Result<(), TracingError> {
let tracer = opentelemetry_jaeger::new_agent_pipeline()
.with_service_name(&config.service_name)
.install_simple()?;
tracing_subscriber::registry()
.with(tracing_opentelemetry::layer().with_tracer(tracer))
.with(tracing_subscriber::fmt::layer())
.init();
Ok(())
}
```
### CLI Application Development
For building powerful command-line tools:
@@ -220,22 +328,27 @@ impl CommandExecutor for DatabaseCommand {
### Multi-Crate Workspace
For complex applications, organize as subsystems:
For complex applications, organize as services:
```
my-ecommerce-platform/
my-service-platform/
├── shared/ # Cross-cutting infrastructure
│ ├── shared-types/ # Domain primitives
│ ├── shared-db/ # Database infrastructure
│ └── shared-events/ # Event definitions
├── subsystems/ # Business subsystems
│ ├── user-management/ # User & auth subsystem
│ ├── product-catalog/ # Product management
│ ├── order-management/ # Order processing
│ └── payment/ # Payment processing
└── services/ # Infrastructure services
├── api-gateway/ # Unified API
── admin-cli/ # Admin tools
│ ├── shared-config/ # Configuration management
│ └── shared-observability/ # Metrics & tracing
├── services/ # Business services
│ ├── core-services/ # Core business logic
│ ├── service-core/ # Domain logic
│ ├── service-api/ # HTTP endpoints
│ └── service-worker/ # Background processing
│ └── business-services/ # Business-specific services
├── business-core/ # Business logic
── business-api/ # API endpoints
│ └── business-processor/ # Workflow engine
└── platform/ # Platform services
├── gateway/ # API gateway
├── admin-panel/ # Administration
└── health-monitor/ # Health monitoring
```
## 🎮 Interactive Features
@@ -255,6 +368,15 @@ async fn my_function() -> Result<(), Error> {
// Using database patterns triggers SQLx suggestions
sqlx::query!("SELECT * FROM users")
// Cursor suggests: Add sqlx with postgres features
// Using configuration patterns triggers config dependencies
#[derive(Deserialize, Validate)]
struct Config { /* ... */ }
// Cursor suggests: Add figment, validator, arc-swap
// Using metrics patterns triggers observability dependencies
let counter = metrics.counter("requests_total");
// Cursor suggests: Add prometheus, dashmap, opentelemetry
```
### Smart Code Generation
@@ -271,8 +393,9 @@ Rules include templates for common patterns:
Rules are loaded based on project complexity:
1. **Simple Projects** - Core quality standards only
2. **Web APIs** - Core + Axum + Database rules
3. **Complex Systems** - All rules including workspace organization
2. **Web APIs** - Core + Axum + Database + Observability rules
3. **Service Applications** - Core + Configuration + Observability + Utilities
4. **Complex Systems** - All rules including workspace organization
## 🔧 Customization