arcly-http 0.4.0

Enterprise-grade NestJS-inspired web framework on axum: zero-lock DI, declarative controllers, multi-tenant data routing, transactional outbox, ABAC, and a self-documenting OpenAPI surface
Documentation
[package]
name = "arcly-http"
version = "0.4.0"
edition = "2021"
rust-version = "1.85"
description = "Enterprise-grade NestJS-inspired web framework on axum: zero-lock DI, declarative controllers, multi-tenant data routing, transactional outbox, ABAC, and a self-documenting OpenAPI surface"
license = "MIT"
repository = "https://gitlab.com/arcly/arcly-http/arcly-http"
documentation = "https://docs.rs/arcly-http"
readme = "../README.md"
keywords = ["web", "framework", "nestjs", "axum", "enterprise"]
categories = ["web-programming", "web-programming::http-server"]

[package.metadata.docs.rs]
# Build docs with every driver enabled so the full data layer is visible,
# and let docs.rs annotate feature-gated items.
all-features = true
rustdoc-args = ["--cfg", "docsrs"]

[dependencies]
arcly-http-macros = { path = "../arcly-http-macros", version = "0.4.0" }
axum = { version = "0.8", features = ["matched-path", "ws"] }
tokio = { version = "1.38", features = ["rt-multi-thread", "macros", "net", "signal", "sync", "time"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
bytes = "1.6"
flate2 = "1.0"
multer = "3"
smallvec = "1.13"
smol_str = "0.2"
inventory = "0.3"
futures = "0.3"
http = "1.1"
serde_urlencoded = "0.7"
validator = { version = "0.18", features = ["derive"] }
schemars = "0.8"
dashmap = "6"
once_cell = "1"

# Structured logging
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }

# Prometheus metrics
metrics = "0.23"
metrics-exporter-prometheus = "0.15"

# OpenTelemetry (always-on)
opentelemetry = { version = "0.27", features = ["trace"] }
opentelemetry_sdk = { version = "0.27", features = ["rt-tokio"] }
opentelemetry-otlp = { version = "0.27", features = ["trace", "grpc-tonic"] }
opentelemetry-semantic-conventions = "0.27"

# JWT auth
jsonwebtoken = "9"

# Secrets rotation
arc-swap = "1"
secrecy  = "0.8"

# ── Database drivers (all optional — enable via db-* features) ──────────────
sqlx = { version = "0.8", optional = true, default-features = false, features = ["any", "runtime-tokio"] }
sea-orm = { version = "1", optional = true, default-features = false, features = ["runtime-tokio-rustls"] }
diesel = { version = "2", optional = true, default-features = false, features = ["r2d2"] }
r2d2 = { version = "0.8", optional = true }

# Cookie signing (HMAC-SHA256)
hmac   = "0.12"
sha2   = "0.10"
base64 = "0.22"

# Field-level envelope encryption (compliance::crypto)
aes-gcm = "0.10"

[features]
default = []

# Database drivers — composable; the facade (data::db) always compiles.
db-sqlx   = ["dep:sqlx"]
db-seaorm = ["dep:sea-orm"]
db-diesel = ["dep:diesel", "dep:r2d2"]

# Backend selectors
db-sqlx-postgres = ["db-sqlx", "sqlx/postgres"]
db-sqlx-mysql    = ["db-sqlx", "sqlx/mysql"]
db-sqlx-sqlite   = ["db-sqlx", "sqlx/sqlite"]
db-seaorm-postgres = ["db-seaorm", "sea-orm/sqlx-postgres"]
db-seaorm-sqlite   = ["db-seaorm", "sea-orm/sqlx-sqlite"]
db-diesel-postgres = ["db-diesel", "diesel/postgres"]
db-diesel-sqlite   = ["db-diesel", "diesel/sqlite", "diesel/returning_clauses_for_sqlite_3_35"]

[dev-dependencies]
reqwest = { version = "0.12", default-features = false, features = ["json"] }