arcly-http 0.6.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. Facade crate — enable subsystems via features.
Documentation
//! **arcly-http** — NestJS ergonomics meets Rust safety & speed.
//!
//! This is the **facade crate**: it re-exports the always-compiled
//! [`arcly-http-core`](arcly_http_core) foundation and, behind Cargo features,
//! the optional subsystems. Nothing heavy compiles by default — enable only
//! what you use:
//!
//! | Feature | Brings in | Heavy deps |
//! |---|---|---|
//! | *(default)* | DI, routing, `RequestContext`, auth, resilience, observability, OpenAPI | — |
//! | `data` / `db-*` | multi-tenant data layer + drivers | sqlx / sea-orm / diesel |
//! | `compliance` | PII masking + field encryption | aes-gcm |
//! | `realtime` | WebSocket gateways + SSE | — |
//! | `messaging` | event consumer mesh | — |
//! | `full` | everything (what docs.rs builds) | all |
//!
//! Most applications only need `use arcly_http::prelude::*;`.

#![forbid(unsafe_code)]

pub mod app;
pub mod testing;

// ─── Always-on foundation (re-exported from arcly-http-core) ────────────────
pub use arcly_http_core::{
    auth, core, docs, http, observability, pipeline, resilience, transport, web,
};
// Path-compat + convenience module aliases (mirror the pre-split layout).
pub use arcly_http_core::auth::{guards, oauth};
pub use arcly_http_core::web::{cache, interceptors, security, validation};
pub use arcly_http_core::{cookie, openapi, plugins, session};

// ─── Optional subsystems (feature-gated) ────────────────────────────────────
#[cfg(feature = "compliance")]
pub use arcly_http_compliance::compliance;
#[cfg(feature = "data")]
pub use arcly_http_data::data;
#[cfg(feature = "messaging")]
pub use arcly_http_messaging::messaging;
#[cfg(feature = "messaging")]
pub use arcly_http_messaging::messaging::event;
#[cfg(feature = "realtime")]
pub use arcly_http_realtime::realtime;

// Re-exports needed by macro expansions (`::arcly_http::…`).
#[doc(hidden)]
pub use arcly_http_core::__axum;
pub use arcly_http_core::__schema_for;
pub use futures;
pub use inventory;
pub use schemars;
pub use serde_json;
pub use validator;

pub use app::{App, LaunchConfig};
pub use web::{Error, RequestContext};

/// Single stable surface for `arcly-http-macros` codegen.
///
/// Every symbol the proc-macros emit is re-exported here. Subsystem symbols
/// are feature-gated: using an attribute whose subsystem feature is disabled
/// (e.g. `#[EventConsumer]` without `messaging`) yields a clear unresolved-
/// import error pointing at the missing feature.
#[doc(hidden)]
pub mod __macro_support {
    pub use arcly_http_core::auth::guards::Guard;
    pub use arcly_http_core::auth::policy::check_policies;
    pub use arcly_http_core::core::engine::{
        FrozenDiContainer, HttpMethod, Module, ModuleDescriptor, ParamLoc, ParamSpec,
        ProviderDescriptor, Resolver, RouteDescriptor, RouteSpec,
    };
    pub use arcly_http_core::http::Json;
    pub use arcly_http_core::observability::audit::emit_route_audit;
    pub use arcly_http_core::resilience::timeout::run_with_timeout;
    pub use arcly_http_core::resilience::{BreakerOpen, CircuitBreaker};
    pub use arcly_http_core::web::context::RequestContext;
    pub use arcly_http_core::web::extract::{
        extract_body_validated, extract_header, extract_param, extract_query_validated, Inject,
    };
    pub use arcly_http_core::web::idempotency::run_idempotent;
    pub use arcly_http_core::web::interceptors::{Interceptor, NextHandler};
    pub use arcly_http_core::web::Error;

    #[cfg(feature = "compliance")]
    pub use arcly_http_compliance::compliance::crypto::EncryptRecord;
    #[cfg(feature = "compliance")]
    pub use arcly_http_compliance::compliance::masking::mask_response;
    #[cfg(feature = "data")]
    pub use arcly_http_data::data::tx::run_transactional;
    #[cfg(feature = "messaging")]
    pub use arcly_http_messaging::messaging::{EventContext, EventError, EventHandlerDescriptor};
    #[cfg(feature = "realtime")]
    pub use arcly_http_realtime::realtime::gateway::{
        GatewayDescriptor, GatewayRuntime, MessageHandler,
    };
    #[cfg(feature = "realtime")]
    pub use arcly_http_realtime::realtime::{ArclyGateway, WsClient};
}

/// `use arcly_http::prelude::*;` brings in everything a user needs.
pub mod prelude {
    pub use crate::app::{App, LaunchConfig};
    pub use crate::auth::cookie::{CookieConfig, CookieService, SameSite};
    pub use crate::auth::guards::{
        JwtAuthGuard, RoleGuard, SessionAuthGuard, JWT_AUTH, SESSION_AUTH,
    };
    pub use crate::auth::oauth::{OAuth2Provider, OAuth2Service, OAuth2UserInfo};
    pub use crate::auth::policy::{
        check_policies, Decision, EnvAttributes, PolicyEngine, PolicyInput, PolicySet, PolicySource,
    };
    pub use crate::auth::secrets::{spawn_secret_watcher, Rotating, SecretSource, SecretVersion};
    pub use crate::auth::session::{Session, SessionConfig, SessionManager, SessionStore};
    pub use crate::auth::{JwtConfig, JwtService};
    pub use crate::cache::{stats as cache_stats, CacheInterceptor, CacheStats};
    pub use crate::core::engine::FrozenDiContainer;
    pub use crate::core::plugins::{ArclyPlugin, ArclyPluginContext, PluginError, PluginStage};
    pub use crate::http::{
        byte_range, bytes_response, header, Body, Bytes, HeaderMap, HeaderName, HeaderValue,
        IntoResponse, Json, Method, RequestParts, Response, ResponseBuilder, StatusCode, Uri,
    };
    pub use crate::interceptors::{
        EnvelopeResponse, Interceptor, LatencyLog, NextHandler, TelemetryLog, TraceInterceptor,
    };
    pub use crate::observability::audit::{AuditOutcome, AuditPipeline, AuditRecord, AuditSink};
    pub use crate::observability::health::{HealthCheck, HealthRegistry, HealthStatus};
    pub use crate::observability::plugin::ArclyObservabilityPlugin;
    pub use crate::openapi::{ApiKeyIn, OpenApiInfo, SecurityScheme};
    pub use crate::pipeline::Provenance;
    pub use crate::resilience::{
        Bulkhead, DLockBackend, DistributedLock, DistributedRateLimit, FailurePolicy, LockGuard,
        RateDecision, RateLimit, RateLimitBackend,
    };
    pub use crate::security::{configure as configure_security, FrameOptions, SecurityConfig};
    pub use crate::validation::Validated;
    pub use crate::web::boundary::BoundaryFilter;
    pub use crate::web::cors::CorsConfig;
    pub use crate::web::dynamic::{DynamicRouteTable, DYNAMIC_PREFIX};
    pub use crate::web::error::{
        BadRequest, Conflict, FieldError, Forbidden, GatewayTimeout, HttpError, HttpException,
        Internal, NotFound, ProblemDetails, ServiceUnavailable, TooManyRequests, Unauthorized,
        Validation,
    };
    pub use crate::web::idempotency::{IdempotencyDecision, IdempotencyStore};
    pub use crate::web::multipart::{MultipartForm, Part};
    pub use crate::web::pagination::{Page, PageParams};
    pub use crate::web::responses::{Accepted, Created, NoContent};
    pub use crate::web::tenant::{
        TenantConfig, TenantGuard, TenantId, TenantRegistry, TenantStrategy, TENANT,
    };
    pub use crate::web::{Error, Inject, RequestContext};

    // ─── Optional subsystems ────────────────────────────────────────────────
    #[cfg(feature = "compliance")]
    pub use crate::compliance::{
        CryptoError, CryptoVault, DataKey, EncryptRecord, EncryptedField, KekSource, KeyId,
        MaskRule, MaskStrategy, Masker, MaskingPolicy,
    };
    #[cfg(feature = "data")]
    pub use crate::data::db::{ArclyDbPool, DbDriver, DbHealthCheck, OwnedDbConn};
    #[cfg(all(feature = "data", feature = "db-sqlx"))]
    pub use crate::data::migrate::{Migration, MigrationReport, MigrationRunner};
    #[cfg(feature = "data")]
    pub use crate::data::outbox::{
        with_transaction, OutboxEntry, OutboxPublisher, OutboxRelay, OutboxStore, OutboxTx,
        TransactionalDataSource,
    };
    #[cfg(feature = "data")]
    pub use crate::data::tx::{in_transaction, with_current_tx, ArclyTransaction};
    #[cfg(feature = "data")]
    pub use crate::data::{
        AccessIntent, DataError, DataErrorKind, DataSource, DataSourceRegistry, ReadAfterWritePin,
    };
    #[cfg(feature = "messaging")]
    pub use crate::messaging::{
        ConsumerRuntime, EventContext, EventHandlerDescriptor, InboundMessage, MessageTransport,
    };

    pub use arcly_http_macros::{
        circuit_breaker, AuditLog, CacheKey, CacheTTL, Controller, Delete, Deprecated,
        EncryptFields, EventConsumer, EventPattern, Get, Idempotent, Injectable, MaskFields,
        Module, Multipart, Patch, Post, Put, RequirePolicies, Timeout, Transactional,
        UseInterceptors, Version,
    };
    #[cfg(feature = "realtime")]
    pub use arcly_http_macros::{Gateway, Subscribe};
    pub use schemars::JsonSchema;
    pub use validator::Validate;
}