1#![warn(missing_docs)]
7
8pub mod api;
10pub mod app;
11pub mod auth;
12pub mod authorization;
13pub mod broadcast;
14pub mod cache;
15pub mod config;
16pub mod container;
17pub mod csrf;
18pub mod database;
19pub mod debug;
20pub mod error;
21pub mod hashing;
22pub mod http;
24#[cfg(feature = "inertia")]
25pub mod inertia;
26#[cfg(feature = "json-ui")]
27pub mod json_ui;
28pub mod lang;
29pub mod metrics;
30pub mod middleware;
31pub mod routing;
33pub mod schedule;
34pub mod seeder;
35pub mod server;
37pub mod session;
38pub(crate) mod static_files;
39pub mod tenant;
40pub mod testing;
41#[cfg(feature = "theme")]
42pub mod theme;
43pub mod validation;
44mod websocket;
45
46pub use api::api_key::{
47 generate_api_key, hash_api_key, verify_api_key_hash, ApiKeyInfo, ApiKeyMiddleware,
48 ApiKeyProvider, GeneratedApiKey,
49};
50pub use api::openapi::{
51 build_openapi_spec, openapi_docs_response, openapi_json_response, OpenApiConfig,
52};
53
54pub use app::Application;
55pub use auth::{
56 Auth, AuthMiddleware, AuthUser, Authenticatable, GuestMiddleware, OptionalUser, UserProvider,
57};
58pub use authorization::{AuthResponse, Authorizable, AuthorizationError, Authorize, Gate, Policy};
59pub use cache::{Cache, CacheConfig, CacheStore, InMemoryCache, RedisCache};
60pub use config::{
61 env, env_optional, env_required, AppConfig, Config, Environment, LangConfig, LangConfigBuilder,
62 ServerConfig,
63};
64pub use container::{App, Container};
65pub use csrf::{csrf_field, csrf_meta_tag, csrf_token, CsrfMiddleware};
66pub use database::{
67 AutoRouteBinding, Database, DatabaseConfig, DatabaseType, DbConnection, Model, ModelMut,
68 RouteBinding, DB,
69};
70pub use utoipa;
72pub use utoipa_redoc;
73
74pub use error::{AppError, FrameworkError, HttpError, ValidationErrors};
77#[cfg(feature = "json-ui")]
78pub use ferro_json_ui::{
79 resolve_actions, resolve_actions_strict, resolve_errors, resolve_errors_all, Action,
80 ActionCardProps, ActionCardVariant, ActionOutcome, AlertProps, AlertVariant, AvatarProps,
81 BadgeProps, BadgeVariant, BreadcrumbItem, BreadcrumbProps, ButtonProps, ButtonType,
82 ButtonVariant, CardProps, CheckboxProps, ChecklistItem, ChecklistProps, Column, ColumnFormat,
83 ConfirmDialog, DashboardLayout, DashboardLayoutConfig, DescriptionItem, DescriptionListProps,
84 DialogVariant, Element, ElementBuilder, FormProps, HeaderProps, HttpMethod, IconPosition,
85 ImageProps, InputProps, InputType, JsonUiConfig, Layout, LayoutContext, LayoutRegistry,
86 ModalProps, NavItem, NotificationDropdownProps, NotificationItem, NotifyVariant, Orientation,
87 PaginationProps, ProgressProps, SelectOption, SelectProps, SeparatorProps, SidebarGroup,
88 SidebarNavItem, SidebarProps, SidebarSection, Size, SkeletonProps, SortDirection, Spec,
89 SpecBuilder, SpecError, StatCardProps, SwitchProps, Tab, TableProps, TabsProps, TextElement,
90 TextProps, ToastProps, ToastVariant, Visibility as JsonUiVisibility, VisibilityCondition,
91 VisibilityOperator, MAX_NESTING_DEPTH, SCHEMA_VERSION,
92};
93#[cfg(feature = "stripe")]
94pub use ferro_stripe::{
95 account, checkout, refund, verify_webhook, CheckoutBuilder, CheckoutIntent,
96 Error as StripeError, LineItem, MemoryProcessedLog, Mode, ProcessStripeWebhook,
97 ProcessedEventLog, Stripe, StripeChargeDisputeCreated, StripeChargeRefunded,
98 StripeCheckoutCompleted, StripeCheckoutExpired, StripeConfig, StripeConnectAccountUpdated,
99 StripeConnectPaymentSucceeded, StripeEvent, StripeInvoicePaid, StripePaymentIntentFailed,
100 StripeSubscriptionDeleted, StripeSubscriptionUpdated, SyncDispatcher,
101};
102#[cfg(feature = "theme")]
103pub use ferro_theme::{IntentModeTemplates, IntentSlotTemplate, Theme, ThemeError, ThemeTemplates};
104pub use hashing::{hash, needs_rehash, verify, DEFAULT_COST as HASH_DEFAULT_COST};
105pub use http::{
106 bytes, json, request_host, text, validate_mime, validate_size, Cookie, CookieOptions,
107 FormRequest, FromParam, FromRequest, HttpResponse, InertiaRedirect, MultipartForm,
108 PaginationLinks, PaginationMeta, Redirect, Request, Resource, ResourceCollection, ResourceMap,
109 Response, ResponseExt, SameSite, UploadedFile,
110};
111#[cfg(feature = "inertia")]
112pub use inertia::{Inertia, InertiaConfig, InertiaResponse, InertiaShared, SavedInertiaContext};
113#[cfg(feature = "json-ui")]
114pub use json_ui::JsonUi;
115pub use lang::{lang_choice, lang_init, locale, set_locale, t, trans, LangMiddleware};
116pub use sea_orm::{
117 ActiveModelTrait, ColumnTrait, EntityTrait, IntoActiveModel, ModelTrait, PaginatorTrait,
118 QueryFilter, QueryOrder, QuerySelect,
119};
120pub use session::{
121 invalidate_all_for_user, session, session_mut, DatabaseSessionDriver, SessionConfig,
122 SessionData, SessionMiddleware, SessionStore,
123};
124#[cfg(feature = "stripe")]
125pub use tenant::RequiresPlan;
126pub use tenant::{
127 current_tenant, DbTenantLookup, FrameworkTenantScopeProvider, HeaderResolver, JwtClaimResolver,
128 PathResolver, SubdomainResolver, TenantContext, TenantFailureMode, TenantLookup,
129 TenantMiddleware, TenantResolver, TenantScope,
130};
131#[cfg(feature = "theme")]
132pub use theme::{
133 current_theme, DefaultResolver, HeaderThemeResolver, TenantThemeResolver, ThemeMiddleware,
134 ThemeResolver,
135};
136#[cfg(feature = "inertia")]
138#[allow(deprecated)]
139pub use inertia::InertiaContext;
140pub use metrics::{get_metrics, MetricsSnapshot, RouteMetrics, RouteMetricsView};
141pub use middleware::{
142 get_pre_route_middleware, register_global_middleware, register_pre_route_middleware,
143 rewrite_request_path, Cors, Limit, LimiterResponse, MetricsMiddleware, Middleware,
144 MiddlewareFuture, MiddlewareRegistry, Next, PreRouteMiddleware, PreRouteResult, RateLimiter,
145 SecurityHeaders, Throttle,
146};
147pub use routing::{
148 __box_handler,
150 __delete_impl,
151 __fallback_impl,
152 __get_impl,
153 __patch_impl,
154 __post_impl,
155 __put_impl,
156 get_registered_routes,
157 route,
158 validate_route_path,
159 FallbackDefBuilder,
160 GroupBuilder,
161 GroupDef,
162 GroupItem,
163 GroupRoute,
164 GroupRouter,
165 IntoGroupItem,
166 ResourceAction,
167 ResourceDef,
168 ResourceRoute,
169 RouteBuilder,
170 RouteDefBuilder,
171 RouteInfo,
172 Router,
173};
174pub use schedule::{CronExpression, DayOfWeek, Schedule, Task, TaskBuilder, TaskEntry, TaskResult};
175pub use seeder::{DatabaseSeeder, Seeder, SeederRegistry};
176pub use server::Server;
177
178pub use ferro_events::{
180 dispatch as dispatch_event, dispatch_sync, Error as EventError, Event, EventDispatcher,
181 Listener, ShouldQueue,
182};
183
184pub use ferro_queue::{
186 dispatch as queue_dispatch, dispatch_later, dispatch_to, register_tenant_capture_hook,
187 Error as QueueError, Job, JobPayload, PendingDispatch, Queue, QueueConfig, QueueConnection,
188 Queueable, TenantScopeProvider, Worker, WorkerConfig,
189};
190
191pub use ferro_notifications::{
193 Channel as NotificationChannel, ChannelResult, DatabaseMessage, DatabaseNotificationStore,
194 Error as NotificationError, InAppConfig, InAppMessage, InAppSeverity, MailAttachment,
195 MailConfig, MailDriver, MailMessage, Notifiable, Notification, NotificationConfig,
196 NotificationDispatcher, PushMessage, ResendConfig, SlackAttachment, SlackField, SlackMessage,
197 SmsMessage, SmtpConfig, StoredNotification, WhatsAppMessage,
198};
199
200pub use ferro_broadcast::{
202 AuthData, Broadcast, BroadcastBuilder, BroadcastConfig, BroadcastMessage, Broadcaster,
203 ChannelAuthorizer, ChannelInfo, ChannelType, Client as BroadcastClient, ClientMessage,
204 Error as BroadcastError, PresenceMember, ServerMessage,
205};
206
207pub use broadcast::broadcasting_auth;
209
210pub use ferro_storage::{
212 Disk, DiskConfig, DiskDriver, Error as StorageError, FileMetadata, LocalDriver,
213 MemoryDriver as StorageMemoryDriver, PutOptions, Storage, StorageDriver, Visibility,
214};
215
216pub use ferro_cache::{
218 Cache as TaggableCache, CacheConfig as TaggableCacheConfig, CacheStore as TaggableCacheStore,
219 Error as TaggableCacheError, MemoryStore as TaggableCacheMemoryStore, TaggedCache,
220};
221
222pub use ferro_lang::{LangError, Translator};
224
225#[cfg(feature = "ai")]
227pub use ferro_ai::{
228 AnthropicProvider, ClassificationProvider, ClassificationResult, Classifier, ClassifierConfig,
229 ConfirmationExpired, ConfirmationStore, Error as AiError, InMemoryConfirmationStore,
230 PendingActionInfo,
231};
232
233#[cfg(feature = "whatsapp")]
235pub use ferro_whatsapp::{
236 verify_whatsapp_webhook, DeduplicationStore, DeliveryStatus, Error as WhatsAppError,
237 InMemoryDeduplicationStore, Message as WhatsAppRawMessage, ProcessWhatsAppWebhook,
238 SendResult as WhatsAppSendResult, SenderIdentity, WhatsApp, WhatsAppConfig,
239 WhatsAppStatusUpdate, WhatsAppTextReceived,
240};
241
242#[cfg(feature = "projections")]
244pub use ferro_projections::{
245 derive_intents, infer_meaning, ActionDef, Cardinality, DataType, Error as ProjectionsError,
246 FieldDef, FieldMeaning, GuardDef, InputDef, Intent, IntentHint, IntentScore, NavigationHint,
247 RelationshipDef, Renderer, ServiceDef, StateDef, StateMachine, Transition,
248 Warning as ProjectionsWarning,
249};
250#[cfg(feature = "projections")]
252pub use ferro_json_ui::{JsonUiRenderer, RenderMode, VisualContext};
253
254pub use async_trait::async_trait;
256
257#[doc(hidden)]
259pub use inventory;
260
261#[doc(hidden)]
263pub use serde_json;
264
265pub use serde;
267
268pub use validator;
270pub use validator::Validate;
271
272pub use validation::{
274 accepted,
276 alpha,
277 alpha_dash,
278 alpha_num,
279 array,
280 between,
281 boolean,
282 confirmed,
283 date,
284 different,
285 email,
286 in_array,
287 integer,
288 max,
289 min,
290 not_in,
291 nullable,
292 numeric,
293 regex,
294 register_validation_translator,
296 required,
297 required_if,
298 same,
299 string,
300 url,
301 validate,
302 Rule,
303 TranslatorFn,
304 Validatable,
305 ValidationError,
306 Validator,
307};
308
309pub use ferro_macros::domain_error;
311pub use ferro_macros::ferro_test;
312pub use ferro_macros::handler;
313pub use ferro_macros::inertia_response;
314pub use ferro_macros::injectable;
315pub use ferro_macros::redirect;
316pub use ferro_macros::request;
317pub use ferro_macros::service;
318pub use ferro_macros::ApiResource;
319pub use ferro_macros::FerroModel;
320pub use ferro_macros::FormRequest as FormRequestDerive;
321pub use ferro_macros::InertiaProps;
322pub use ferro_macros::ValidateRules;
323
324pub use ferro_macros::describe;
326pub use ferro_macros::test;
327
328pub use testing::{
330 Factory, FactoryBuilder, Fake, Sequence, TestClient, TestContainer, TestContainerGuard,
331 TestDatabase, TestRequestBuilder, TestResponse,
332};
333
334#[macro_export]
346macro_rules! json_response {
347 ($($json:tt)+) => {
348 Ok($crate::HttpResponse::json($crate::serde_json::json!($($json)+)))
349 };
350}
351
352#[macro_export]
364macro_rules! text_response {
365 ($text:expr) => {
366 Ok($crate::HttpResponse::text($text))
367 };
368}
369
370#[macro_export]
388macro_rules! global_middleware {
389 ($middleware:expr) => {
390 $crate::register_global_middleware($middleware)
391 };
392}
393
394#[macro_export]
408macro_rules! pre_route_middleware {
409 ($middleware:expr) => {
410 $crate::register_pre_route_middleware($middleware)
411 };
412}
413
414#[macro_export]
437macro_rules! expect {
438 ($value:expr) => {
439 $crate::testing::Expect::new($value, concat!(file!(), ":", line!()))
440 };
441}