pub use crate::Redirect;
pub use crate::paths::PathExt;
#[cfg(feature = "ws")]
pub use autumn_macros::ws;
pub use autumn_macros::{
api_doc, authorize, cached, delete, feature_flag, get, job, jobs, main, oauth2_callback,
one_off_tasks, patch, paths, post, put, routes, scheduled, secured, service, static_get,
static_routes, step_up, task, tasks,
};
#[cfg(feature = "mail")]
pub use autumn_macros::{mail_previews, mailer, mailer_preview};
pub use crate::assets::asset_url;
#[cfg(feature = "maud")]
pub use maud::{Markup, PreEscaped, html};
pub use crate::canary::CanaryRoute;
#[cfg(feature = "db")]
pub use crate::db::Db;
pub use crate::extract::Form;
pub use crate::extract::Json;
#[cfg(feature = "multipart")]
pub use crate::extract::Multipart;
pub use crate::extract::Path;
pub use crate::extract::Query;
#[cfg(feature = "flash")]
pub use crate::flash::{Flash, FlashLevel, FlashMessage};
#[cfg(feature = "htmx")]
pub use crate::htmx::HxResponseExt;
#[cfg(feature = "htmx")]
pub use crate::htmx::{HTMX_CSRF_JS_PATH, HTMX_JS_PATH, HxRequest};
#[cfg(feature = "mail")]
pub use crate::mail::{
Mail, MailConfig, MailDeliveryQueue, MailDeliveryQueueHandle, MailError, MailPreview,
MailPreviewError, MailPreviewRegistry, MailTransport, Mailer, SmtpConfig, TlsMode, Transport,
};
pub use crate::sse::{Event, Sse};
pub use crate::task::TaskArgs;
#[cfg(feature = "ws")]
pub use crate::{
Broadcast, BroadcastError, ChannelMessage, ChannelStats, Channels, ChannelsBackend,
LocalChannelsBackend,
};
#[cfg(feature = "presence")]
pub use crate::{Presence, PresenceEntry, PresenceEvent, PresenceHandle};
pub use axum::extract::State;
pub use axum::response::IntoResponse;
pub use http::StatusCode;
pub use crate::etag::ETag;
pub use crate::etag::EtagLayer;
pub use crate::etag::FreshWhen;
pub use crate::etag::IntoETag;
pub use crate::etag::fresh_when;
pub use crate::etag::hash_etag;
pub use crate::audit::{AuditEvent, AuditStatus};
pub use crate::error::{AutumnError, AutumnResult};
pub use crate::pagination::{CursorPage, CursorRequest, Page, PageRequest};
pub use crate::validation::{Valid, ValidateExt, Validated};
pub use validator::Validate;
pub use crate::form::{Changeset, ChangesetForm, IntoChangeset};
#[cfg(feature = "maud")]
pub use crate::widgets::{
ActiveSearchConfig, AutocompleteConfig, SearchMethod, active_search, active_search_empty_state,
active_search_input, active_search_results, autocomplete_empty_state, autocomplete_input,
autocomplete_option,
};
#[cfg(feature = "db")]
pub use crate::hooks::{
DraftField, FieldDiff, MutationContext, MutationHooks, MutationOp, Patch, UpdateDraft,
};
pub use crate::auth::ApiToken;
pub use crate::auth::Auth;
pub use crate::auth::RequireApiToken;
pub use crate::log::context::with_log_field;
pub use crate::session::Session;
pub use crate::tenancy::{Tenant, with_tenant};
pub use crate::authorization::{Policy, PolicyContext, Scope, ScopeQuery, Scoped};
pub use crate::security::CspNonce;
pub use crate::security::CsrfFormField;
pub use crate::security::CsrfToken;
pub use crate::security::CsrfTokenHeader;
#[cfg(feature = "maud")]
pub use crate::security::bot_protection_widget;
pub use crate::webhook::{
SignedWebhook, WebhookEndpointConfig, WebhookProvider, WebhookReplayBackend,
WebhookReplayConfig,
};
#[cfg(feature = "http-client")]
pub use crate::http_client::Client;
pub use crate::circuit_breaker::{
CircuitBreaker, CircuitBreakerError, CircuitBreakerPolicy, CircuitState,
};
pub use crate::seo::SeoMeta;
pub use crate::seo::SitemapChangefreq;
pub use crate::seo::SitemapEntry;
pub use crate::seo::SitemapSource;
pub use crate::state::AppState;
pub use crate::time::Clock;
pub use crate::feature_flags::FeatureFlagService;
pub use crate::feature_flags::Flags;
pub use crate::feature_flags::InMemoryFlagStore;
#[cfg(feature = "i18n")]
pub use crate::i18n::Locale;
#[cfg(feature = "i18n")]
pub use crate::i18n::t;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn prelude_types_are_accessible() {
#[cfg(feature = "db")]
let _state = AppState {
extensions: std::sync::Arc::new(std::sync::RwLock::new(
std::collections::HashMap::new(),
)),
pool: None,
replica_pool: None,
profile: None,
started_at: std::time::Instant::now(),
health_detailed: false,
probes: crate::probe::ProbeState::ready_for_test(),
metrics: crate::middleware::MetricsCollector::new(),
log_levels: crate::actuator::LogLevels::new("info"),
task_registry: crate::actuator::TaskRegistry::new(),
job_registry: crate::actuator::JobRegistry::new(),
config_props: crate::actuator::ConfigProperties::default(),
metrics_source_registry: crate::actuator::MetricsSourceRegistry::new(),
health_indicator_registry: crate::actuator::HealthIndicatorRegistry::new(),
#[cfg(feature = "ws")]
channels: crate::channels::Channels::new(32),
#[cfg(feature = "presence")]
presence: crate::presence::Presence::new(crate::channels::Channels::new(32)),
#[cfg(feature = "ws")]
shutdown: tokio_util::sync::CancellationToken::new(),
policy_registry: crate::authorization::PolicyRegistry::default(),
forbidden_response: crate::authorization::ForbiddenResponse::default(),
auth_session_key: "user_id".to_owned(),
shared_cache: None,
clock: std::sync::Arc::new(crate::time::SystemClock),
};
#[cfg(not(feature = "db"))]
let _state = AppState {
extensions: std::sync::Arc::new(std::sync::RwLock::new(
std::collections::HashMap::new(),
)),
profile: None,
started_at: std::time::Instant::now(),
health_detailed: false,
probes: crate::probe::ProbeState::ready_for_test(),
metrics: crate::middleware::MetricsCollector::new(),
log_levels: crate::actuator::LogLevels::new("info"),
task_registry: crate::actuator::TaskRegistry::new(),
job_registry: crate::actuator::JobRegistry::new(),
config_props: crate::actuator::ConfigProperties::default(),
metrics_source_registry: crate::actuator::MetricsSourceRegistry::new(),
health_indicator_registry: crate::actuator::HealthIndicatorRegistry::new(),
#[cfg(feature = "ws")]
channels: crate::channels::Channels::new(32),
#[cfg(feature = "presence")]
presence: crate::presence::Presence::new(crate::channels::Channels::new(32)),
#[cfg(feature = "ws")]
shutdown: tokio_util::sync::CancellationToken::new(),
policy_registry: crate::authorization::PolicyRegistry::default(),
forbidden_response: crate::authorization::ForbiddenResponse::default(),
auth_session_key: "user_id".to_owned(),
shared_cache: None,
clock: std::sync::Arc::new(crate::time::SystemClock),
};
let _err: AutumnResult<()> = Ok(());
}
#[test]
fn json_type_works_through_prelude() {
let json: Json<&str> = Json("ok");
assert_eq!(json.0, "ok");
}
#[test]
fn error_types_work_through_prelude() {
let err = AutumnError::bad_request_msg("test");
let result: AutumnResult<()> = Err(err);
assert!(result.is_err());
}
#[cfg(feature = "maud")]
#[test]
fn maud_types_work_through_prelude() {
let markup: Markup = html! { "hello" };
assert!(markup.into_string().contains("hello"));
}
}