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, event, feature_flag, get, job, jobs, listener, listeners,
main, oauth2_callback, one_off_tasks, patch, paths, post, public, put, routes, scheduled,
secured, service, static_get, static_routes, step_up, task, tasks, throttle,
};
#[cfg(feature = "mail")]
pub use autumn_macros::{mail_previews, mailer, mailer_preview};
#[cfg(feature = "maud")]
pub use crate::a11y::{Button, ButtonType, Img, Link, MenuItem, TextField};
pub use crate::assets::asset_url;
#[cfg(feature = "maud")]
pub use crate::assets::javascript_include_tag;
#[cfg(feature = "maud")]
pub use crate::cache::{cache_fragment, cache_fragment_global};
#[cfg(feature = "maud")]
pub use maud::{Markup, PreEscaped, html};
pub use crate::canary::CanaryRoute;
#[cfg(feature = "db")]
pub use crate::db::Db;
#[cfg(feature = "db")]
pub use crate::db::{IsolationLevel, TxOptions};
pub use crate::events::Events;
pub use crate::extract::CurrentPath;
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(all(feature = "flash", feature = "maud"))]
pub use crate::flash::{FlashMessagesConfig, flash_messages, flash_messages_with};
#[cfg(feature = "htmx")]
pub use crate::htmx::HxResponseExt;
#[cfg(feature = "htmx")]
pub use crate::htmx::{
HTMX_CSRF_JS_PATH, HTMX_JS_PATH, HTMX_SSE_JS_PATH, HxRequest, IDIOMORPH_JS_PATH,
};
#[cfg(all(feature = "htmx", feature = "maud"))]
pub use crate::htmx::{HtmxFragments, OobSwap};
#[cfg(all(feature = "htmx", feature = "maud"))]
pub use crate::live::LiveFragment;
#[cfg(feature = "db")]
pub use crate::lock::{Lock, LockError, LockGuard};
#[cfg(feature = "mail")]
pub use crate::mail::{
Mail, MailAttachment, MailConfig, MailDeliveryQueue, MailDeliveryQueueHandle, MailError,
MailPreview, MailPreviewError, MailPreviewRegistry, MailTransport, Mailer, SmtpConfig, TlsMode,
Transport,
};
#[cfg(feature = "maud")]
pub use crate::negotiate::{Format, Negotiate, Negotiated};
#[cfg(all(feature = "presence", feature = "maud"))]
pub use crate::presence_badge;
#[cfg(all(
feature = "presence",
feature = "ws",
feature = "maud",
feature = "htmx"
))]
pub use crate::presence_stream;
#[cfg(feature = "db")]
pub use crate::sharding::{ShardKey, ShardKeyOverride, ShardedDb, ShardedReadDb, Shards};
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::Method;
pub use http::StatusCode;
pub use crate::etag::CacheControl;
pub use crate::etag::ETag;
pub use crate::etag::EtagLayer;
pub use crate::etag::FreshWhen;
pub use crate::etag::IntoETag;
pub use crate::etag::cache_for;
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::tenant_cell::{TenantCell, TenantCellHandle, TenantCellRegistry};
pub use crate::pagination::{CursorPage, CursorRequest, ListQuery, Page, PageRequest, SortDir};
#[cfg(feature = "maud")]
pub use crate::ui::pagination::{PagerOptions, cursor_pagination_nav, pagination_nav};
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, AlertConfig, AlertVariant, AutocompleteConfig, AvatarConfig, AvatarSize,
BadgeConfig, BadgeVariant, CardConfig, Column, ConfirmActionConfig, Crumb, Cta, CtaStyle,
DEFAULT_TOAST_REGION_ID, DataTableConfig, FeedConfig, FeedMode, HeadingLevel, HeroConfig,
ModalConfig, NavBarConfig, NavBarLayout, NavItem, NavLinkMatch, NavMenu, SearchMethod,
active_search, active_search_empty_state, active_search_input, active_search_results, alert,
alert_with, autocomplete_empty_state, autocomplete_input, autocomplete_option, avatar, badge,
badge_with, breadcrumb, card, confirm_action, data_table, error_summary, feed_page, hero,
infinite_feed, modal, modal_close_button, modal_trigger, nav_bar, nav_link, nav_link_matched,
property_list, stat_card, status_tag, tabs, toast, toast_in, toast_region,
};
#[cfg(feature = "maud")]
pub use crate::stories::story;
#[cfg(feature = "maud")]
pub use crate::stories::{Story, StoryGallery, StoryRegistry, StoryRenderError};
#[cfg(feature = "maud")]
pub use crate::links::{
ButtonToOptions, LinkToOptions, button_to, button_to_with, link_to, link_to_with,
};
#[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(feature = "maud")]
pub use crate::format::CurrencyOptions;
#[cfg(feature = "maud")]
pub use crate::format::format_datetime;
#[cfg(feature = "maud")]
pub use crate::format::number_to_currency;
#[cfg(feature = "maud")]
pub use crate::format::number_with_delimiter;
#[cfg(feature = "maud")]
pub use crate::format::pluralize;
#[cfg(feature = "maud")]
pub use crate::format::pluralize_with;
#[cfg(feature = "maud")]
pub use crate::format::time_ago_in_words;
#[cfg(feature = "maud")]
pub use crate::format::{truncate, truncate_with};
#[cfg(feature = "maud")]
pub use crate::format::{truncate_words, truncate_words_with};
pub use rust_decimal::Decimal;
pub use crate::time_zone::TimeZone;
pub use crate::time_zone::UserTimeZone;
#[cfg(feature = "maud")]
pub use crate::time_zone::local_date;
#[cfg(feature = "maud")]
pub use crate::time_zone::local_datetime;
pub use crate::time_zone::parse_local_datetime;
#[cfg(feature = "maud")]
pub use crate::time_zone::time_ago;
pub use crate::time_zone::to_local_input_value;
#[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,
shards: None,
profile: None,
role: crate::config::ProcessRole::Combined,
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),
app_id: AppState::next_app_id(),
};
#[cfg(not(feature = "db"))]
let _state = AppState {
extensions: std::sync::Arc::new(std::sync::RwLock::new(
std::collections::HashMap::new(),
)),
profile: None,
role: crate::config::ProcessRole::Combined,
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),
app_id: AppState::next_app_id(),
};
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"));
}
#[cfg(feature = "maud")]
#[test]
fn format_helpers_work_through_prelude() {
let price: Decimal = "9.5".parse().unwrap();
assert_eq!(number_to_currency(price).into_string(), "$9.50");
assert_eq!(pluralize(1, "comment").into_string(), "1 comment");
}
}