rustlavel 0.9.1

A Laravel-inspired full-stack web framework for Rust
Documentation
//! Rustlavel — a Laravel-inspired web framework for Rust.
//!
//! ```ignore
//! use rustlavel::prelude::*;
//!
//! #[tokio::main]
//! async fn main() -> Result<()> {
//!     App::new()?.routes(routes::web).serve().await
//! }
//! ```
//!
//! Optional packages are enabled through feature flags; what is not enabled is
//! never compiled.

mod app;
mod console;
mod live_reload;
#[cfg(feature = "view")]
mod view;

pub use app::App;
pub use console::Console;

#[cfg(feature = "ai")]
pub use rustlavel_ai as ai;
#[cfg(feature = "auth")]
pub use rustlavel_auth as auth;
#[cfg(feature = "cache")]
pub use rustlavel_cache as cache;
#[cfg(feature = "client")]
pub use rustlavel_client as client;
#[cfg(feature = "db")]
pub use rustlavel_db as db;
#[cfg(feature = "db")]
pub use rustlavel_db::Connections;
#[cfg(feature = "debugbar")]
pub use rustlavel_debugbar as debugbar;
#[cfg(feature = "debugbar")]
pub use rustlavel_debugbar::DebugBar;
#[cfg(feature = "gateway")]
pub use rustlavel_gateway as gateway;
#[cfg(feature = "gateway")]
pub use rustlavel_gateway::{Gateway, Upstream};
#[cfg(feature = "discovery")]
pub use rustlavel_discovery as discovery;
#[cfg(feature = "payment")]
pub use rustlavel_payment as payment;
#[cfg(feature = "ledger")]
pub use rustlavel_ledger as ledger;
#[cfg(feature = "ledger")]
pub use rustlavel_ledger::Ledger;
#[cfg(feature = "billing")]
pub use rustlavel_billing as billing;
#[cfg(feature = "billing")]
pub use rustlavel_billing::Billing;
#[cfg(feature = "chart")]
pub use rustlavel_chart as chart;
#[cfg(feature = "chart")]
pub use rustlavel_chart::{Chart, Charts, Series};
#[cfg(feature = "discovery")]
pub use rustlavel_discovery::{Discovery, Instance, Peers, Registrar, Registry, RegistryServer};
#[cfg(feature = "i18n")]
pub use rustlavel_i18n as i18n;
#[cfg(feature = "vault")]
pub use rustlavel_vault as vault;
#[cfg(feature = "ldap")]
pub use rustlavel_ldap as ldap;
#[cfg(feature = "oauth")]
pub use rustlavel_oauth as oauth;
#[cfg(feature = "oauth-provider")]
pub use rustlavel_oauth_provider as oauth_provider;
#[cfg(feature = "mail")]
pub use rustlavel_mail as mail;
#[cfg(feature = "mail")]
pub use rustlavel_mail::Mail;
#[cfg(feature = "mcp")]
pub use rustlavel_mcp as mcp;
#[cfg(feature = "metrics")]
pub use rustlavel_metrics as metrics;
#[cfg(feature = "model-cache")]
pub use rustlavel_model_cache as model_cache;
#[cfg(feature = "metrics")]
pub use rustlavel_metrics::Metrics;
#[cfg(feature = "otel")]
pub use rustlavel_otel as otel;
#[cfg(feature = "otel")]
pub use rustlavel_otel::OpenTelemetry;
#[cfg(feature = "search")]
pub use rustlavel_search as search;
#[cfg(feature = "search")]
pub use rustlavel_search::LogShipping;
#[cfg(feature = "webauthn")]
pub use rustlavel_webauthn as webauthn;
#[cfg(feature = "openapi")]
pub use rustlavel_openapi as openapi;
#[cfg(feature = "audit")]
pub use rustlavel_audit as audit;

#[cfg(feature = "flags")]
pub use rustlavel_flags as flags;

#[cfg(feature = "rbac")]
pub use rustlavel_rbac as rbac;

#[cfg(feature = "queue")]
pub use rustlavel_queue as queue;
#[cfg(feature = "storage")]
pub use rustlavel_storage as storage;
#[cfg(feature = "telescope")]
pub use rustlavel_telescope as telescope;
#[cfg(feature = "telescope")]
pub use rustlavel_telescope::Telescope;
#[cfg(feature = "validation")]
pub use rustlavel_validation as validation;
#[cfg(feature = "view")]
pub use rustlavel_view as views;
#[cfg(feature = "ws")]
pub use rustlavel_ws as ws;
#[cfg(feature = "view")]
pub use view::{Views, engine_from_config, engine_with_routes};

/// The async runtime, re-exported so an application never has to add it.
///
/// Async Rust requires a runtime and the standard library provides none: an
/// `async fn` compiles to a state machine that nothing in `std` will drive.
/// That is a fact about the language rather than a choice made here — but a
/// person adding this framework should not then be told to add a second,
/// unrelated-looking crate before anything compiles.
pub use tokio;

/// Start the application without naming a runtime: `#[rustlavel::main]`.
///
/// `#[tokio::main]` still works for anyone who wants the runtime in their own
/// hands. This replaces nothing; it removes a required step.
pub use rustlavel_macros::{main, test};

pub use rustlavel_core::{Config, Context, Error, Event, Json, Result, config, env, events, json, log};
pub use rustlavel_http::{
    BoxFuture, Cookie, Files, Handler, Headers, Method, Middleware, NamedRoutes, Next, Plugin, SseEvent,
    Request, Resource,
    Response, Router, SameSite, Setup, Status, TestClient, TestResponse, cookie, error_page,
    middleware, request, response, router, server, status, testing, url,
};

/// Everything an application file usually needs.
pub mod prelude {
    pub use crate::App;
    pub use rustlavel_core::{Config, Context, Error, Json, Result};
    pub use rustlavel_http::{
        BodyLimit, BoxFuture, Compress, Cookie, Cors, ETag, Health, IntoResponse, JsonResource,
        Method, Middleware, Next, Request, RequestId, ResourceResponse, Response, Router, Status,
        Timeout, TrustProxies, VersionHeader, attributes,
    };
    pub use rustlavel_core::{debug, error, info, warn};

    #[cfg(feature = "ai")]
    pub use rustlavel_ai::Ai;
    #[cfg(feature = "auth")]
    pub use rustlavel_auth::prelude::*;
    #[cfg(feature = "cache")]
    pub use rustlavel_cache::prelude::*;
    #[cfg(feature = "client")]
    pub use rustlavel_client::{CircuitBreaker, Client};
    // The plugin types, so `main.rs` — which imports the prelude and nothing
    // else — can name the thing it is registering. They were reachable only as
    // `rustlavel::Telescope`, which is not where anybody looks after writing
    // `use rustlavel::prelude::*`.
    #[cfg(feature = "debugbar")]
    pub use crate::DebugBar;
    #[cfg(feature = "metrics")]
    pub use crate::Metrics;
    #[cfg(feature = "otel")]
    pub use crate::OpenTelemetry;
    #[cfg(feature = "search")]
    pub use crate::LogShipping;
    #[cfg(feature = "telescope")]
    pub use crate::Telescope;
    #[cfg(feature = "db")]
    pub use rustlavel_db::prelude::*;
    #[cfg(feature = "i18n")]
    pub use rustlavel_i18n::Translator;
    #[cfg(feature = "audit")]
    pub use rustlavel_audit::prelude::*;
    #[cfg(feature = "flags")]
    pub use rustlavel_flags::prelude::*;
    #[cfg(feature = "model-cache")]
    pub use rustlavel_model_cache::prelude::*;
    #[cfg(feature = "rbac")]
    pub use rustlavel_rbac::prelude::*;
    #[cfg(feature = "queue")]
    pub use rustlavel_queue::prelude::*;
    #[cfg(feature = "storage")]
    pub use rustlavel_storage::{Storage, Visibility};
    #[cfg(feature = "validation")]
    pub use rustlavel_validation::{Errors, Rule, Validated, validate};
    #[cfg(feature = "view")]
    pub use crate::Views;
    #[cfg(feature = "view")]
    pub use rustlavel_view::{Context as ViewContext, Engine};
    #[cfg(feature = "ws")]
    pub use rustlavel_ws::{Broadcaster, Message as WsMessage, WebSocket, websocket};
}

/// Helpers for writing application tests.
pub mod test_prelude {
    pub use crate::prelude::*;
    pub use rustlavel_http::{TestClient, TestResponse};
}