Skip to main content

rustapi_rs/
lib.rs

1//! # RustAPI
2//!
3//! Public facade crate for RustAPI.
4
5extern crate self as rustapi_rs;
6
7// Re-export all procedural macros from rustapi-macros.
8pub use rustapi_macros::*;
9
10/// Macro/runtime internals. Not part of the public compatibility contract.
11#[doc(hidden)]
12pub mod __private {
13    pub use async_trait;
14    pub use rustapi_core as core;
15    pub use rustapi_core::__private::{linkme, AUTO_ROUTES, AUTO_SCHEMAS};
16    pub use rustapi_openapi as openapi;
17    pub use rustapi_validate as validate;
18    pub use serde_json;
19}
20
21/// Stable core surface exposed by the facade.
22pub mod core {
23    pub use rustapi_core::collect_auto_routes;
24    pub use rustapi_core::validation::Validatable;
25    pub use rustapi_core::EventBus;
26    pub use rustapi_core::{
27        delete, delete_route, get, get_route, patch, patch_route, post, post_route, put, put_route,
28        route, serve_dir, sse_from_iter, sse_response, ApiError, AsyncValidatedJson, Body,
29        BodyLimitLayer, BodyStream, BodyVariant, ClientIp, Created, CursorPaginate,
30        CursorPaginated, Environment, Extension, FieldError, FromRequest, FromRequestParts,
31        Handler, HandlerService, HeaderValue, Headers, HealthCheck, HealthCheckBuilder,
32        HealthCheckResult, HealthEndpointConfig, HealthStatus, Html, IntoResponse, Json, KeepAlive,
33        MethodRouter, Multipart, MultipartConfig, MultipartField, NoContent, Paginate, Paginated,
34        Path, ProductionDefaultsConfig, Query, Redirect, Request, RequestId, RequestIdLayer,
35        Response, ResponseBody, Result, Route, RouteHandler, RouteMatch, Router, RustApi,
36        RustApiConfig, Sse, SseEvent, State, StaticFile, StaticFileConfig, StatusCode, StreamBody,
37        StreamingMultipart, StreamingMultipartField, TracingLayer, Typed, TypedPath, UploadedFile,
38        ValidatedJson, WithStatus,
39    };
40
41    pub use rustapi_core::get_environment;
42
43    #[cfg(any(feature = "core-cookies", feature = "cookies"))]
44    pub use rustapi_core::Cookies;
45
46    #[cfg(any(feature = "core-compression", feature = "compression"))]
47    pub use rustapi_core::CompressionLayer;
48
49    #[cfg(any(feature = "core-compression", feature = "compression"))]
50    pub use rustapi_core::middleware::{CompressionAlgorithm, CompressionConfig};
51
52    #[cfg(any(feature = "core-http3", feature = "protocol-http3", feature = "http3"))]
53    pub use rustapi_core::{Http3Config, Http3Server};
54}
55
56// Backward-compatible root re-exports.
57pub use core::*;
58
59/// Optional protocol integrations grouped under a stable namespace.
60pub mod protocol {
61    #[cfg(any(feature = "protocol-toon", feature = "toon"))]
62    pub mod toon {
63        pub use rustapi_toon::*;
64    }
65
66    #[cfg(any(feature = "protocol-ws", feature = "ws"))]
67    pub mod ws {
68        pub use rustapi_ws::*;
69    }
70
71    #[cfg(any(feature = "protocol-view", feature = "view"))]
72    pub mod view {
73        pub use rustapi_view::*;
74    }
75
76    #[cfg(any(feature = "protocol-grpc", feature = "grpc"))]
77    pub mod grpc {
78        pub use rustapi_grpc::*;
79    }
80
81    #[cfg(any(feature = "core-http3", feature = "protocol-http3", feature = "http3"))]
82    pub mod http3 {
83        pub use rustapi_core::{Http3Config, Http3Server};
84    }
85}
86
87/// Optional extras grouped under a stable namespace.
88pub mod extras {
89    #[cfg(any(feature = "extras-jwt", feature = "jwt"))]
90    pub mod jwt {
91        pub use rustapi_extras::jwt;
92        pub use rustapi_extras::{
93            create_token, AuthUser, JwtError, JwtLayer, JwtValidation, ValidatedClaims,
94        };
95    }
96
97    #[cfg(any(feature = "extras-cors", feature = "cors"))]
98    pub mod cors {
99        pub use rustapi_extras::cors;
100        pub use rustapi_extras::{AllowedOrigins, CorsLayer};
101    }
102
103    #[cfg(any(feature = "extras-rate-limit", feature = "rate-limit"))]
104    pub mod rate_limit {
105        pub use rustapi_extras::rate_limit;
106        pub use rustapi_extras::{RateLimitLayer, RateLimitStrategy};
107    }
108
109    #[cfg(any(feature = "extras-config", feature = "config"))]
110    pub mod config {
111        pub use rustapi_extras::config;
112        pub use rustapi_extras::{
113            env_or, env_parse, load_dotenv, load_dotenv_from, require_env, Config, ConfigError,
114            Environment,
115        };
116    }
117
118    #[cfg(any(feature = "extras-sqlx", feature = "sqlx"))]
119    pub mod sqlx {
120        pub use rustapi_extras::{convert_sqlx_error, SqlxErrorExt};
121    }
122
123    #[cfg(any(feature = "extras-insight", feature = "insight"))]
124    pub mod insight {
125        pub use rustapi_extras::insight;
126    }
127
128    #[cfg(any(feature = "extras-timeout", feature = "timeout"))]
129    pub mod timeout {
130        pub use rustapi_extras::timeout;
131    }
132
133    #[cfg(any(feature = "extras-guard", feature = "guard"))]
134    pub mod guard {
135        pub use rustapi_extras::guard;
136    }
137
138    #[cfg(any(feature = "extras-logging", feature = "logging"))]
139    pub mod logging {
140        pub use rustapi_extras::logging;
141    }
142
143    #[cfg(any(feature = "extras-circuit-breaker", feature = "circuit-breaker"))]
144    pub mod circuit_breaker {
145        pub use rustapi_extras::circuit_breaker;
146    }
147
148    #[cfg(any(feature = "extras-retry", feature = "retry"))]
149    pub mod retry {
150        pub use rustapi_extras::retry;
151    }
152
153    #[cfg(any(feature = "extras-security-headers", feature = "security-headers"))]
154    pub mod security_headers {
155        pub use rustapi_extras::security_headers;
156    }
157
158    #[cfg(any(feature = "extras-api-key", feature = "api-key"))]
159    pub mod api_key {
160        pub use rustapi_extras::api_key;
161    }
162
163    #[cfg(any(feature = "extras-cache", feature = "cache"))]
164    pub mod cache {
165        pub use rustapi_extras::cache;
166    }
167
168    #[cfg(any(feature = "extras-dedup", feature = "dedup"))]
169    pub mod dedup {
170        pub use rustapi_extras::dedup;
171    }
172
173    #[cfg(any(feature = "extras-sanitization", feature = "sanitization"))]
174    pub mod sanitization {
175        pub use rustapi_extras::sanitization;
176    }
177
178    #[cfg(any(feature = "extras-otel", feature = "otel"))]
179    pub mod otel {
180        pub use rustapi_extras::otel;
181    }
182
183    #[cfg(any(feature = "extras-structured-logging", feature = "structured-logging"))]
184    pub mod structured_logging {
185        pub use rustapi_extras::structured_logging;
186    }
187
188    #[cfg(any(feature = "extras-replay", feature = "replay"))]
189    pub mod replay {
190        pub use rustapi_core::replay::{
191            RecordedRequest, RecordedResponse, ReplayConfig, ReplayEntry, ReplayId, ReplayMeta,
192            ReplayQuery, ReplayStore, ReplayStoreError, ReplayStoreResult,
193        };
194        pub use rustapi_extras::replay;
195        pub use rustapi_extras::replay::{
196            FsReplayStore, FsReplayStoreConfig, InMemoryReplayStore, ReplayAdminAuth, ReplayClient,
197            ReplayClientError, ReplayLayer, RetentionJob,
198        };
199    }
200
201    #[cfg(any(feature = "extras-oauth2-client", feature = "oauth2-client"))]
202    pub mod oauth2 {
203        pub use rustapi_extras::oauth2;
204        pub use rustapi_extras::{
205            AuthorizationRequest, CsrfState, OAuth2Client, OAuth2Config, PkceVerifier, Provider,
206            TokenError, TokenResponse,
207        };
208    }
209
210    #[cfg(any(feature = "extras-session", feature = "session"))]
211    pub mod session {
212        pub use rustapi_extras::session;
213        pub use rustapi_extras::{
214            MemorySessionStore, Session, SessionConfig, SessionError, SessionLayer, SessionRecord,
215            SessionStore,
216        };
217
218        #[cfg(any(feature = "extras-session-redis", feature = "session-redis"))]
219        pub use rustapi_extras::RedisSessionStore;
220    }
221
222    #[cfg(any(feature = "extras-jobs", feature = "jobs"))]
223    pub mod jobs {
224        pub use rustapi_jobs::{
225            EnqueueOptions, InMemoryBackend, Job, JobBackend, JobContext, JobError, JobQueue,
226            JobRequest,
227        };
228    }
229}
230
231/// Dashboard module: embedded isometric system dashboard.
232#[cfg(feature = "core-dashboard")]
233pub mod dashboard {
234    pub use rustapi_core::dashboard::{
235        DashboardConfig, DashboardHealthEndpointSnapshot, DashboardHealthSummary,
236        DashboardLiveCountersSnapshot, DashboardMetrics, DashboardReplayIndexSnapshot,
237        DashboardSnapshot, DashboardStageSnapshot, ExecutionPath, RequestStage, RouteGraphSnapshot,
238        RouteGroupSnapshot, RouteInventoryItem, RouteMetricsSnapshot,
239    };
240}
241
242// Root-level re-exports for dashboard types (convenience)
243#[cfg(feature = "core-dashboard")]
244pub use rustapi_core::dashboard::{DashboardConfig, DashboardMetrics, DashboardSnapshot};
245#[cfg(any(feature = "protocol-ws", feature = "ws"))]
246#[deprecated(note = "Use rustapi_rs::protocol::ws instead")]
247pub mod ws {
248    pub use crate::protocol::ws::*;
249}
250
251#[cfg(any(feature = "protocol-view", feature = "view"))]
252#[deprecated(note = "Use rustapi_rs::protocol::view instead")]
253pub mod view {
254    pub use crate::protocol::view::*;
255}
256
257#[cfg(any(feature = "protocol-grpc", feature = "grpc"))]
258#[deprecated(note = "Use rustapi_rs::protocol::grpc instead")]
259pub mod grpc {
260    pub use crate::protocol::grpc::*;
261}
262
263// Legacy root extras re-exports for compatibility.
264#[cfg(any(feature = "extras-jwt", feature = "jwt"))]
265pub use rustapi_extras::jwt;
266#[cfg(any(feature = "extras-jwt", feature = "jwt"))]
267pub use rustapi_extras::{
268    create_token, AuthUser, JwtError, JwtLayer, JwtValidation, ValidatedClaims,
269};
270
271#[cfg(any(feature = "extras-cors", feature = "cors"))]
272pub use rustapi_extras::cors;
273#[cfg(any(feature = "extras-cors", feature = "cors"))]
274pub use rustapi_extras::{AllowedOrigins, CorsLayer};
275
276#[cfg(any(feature = "extras-rate-limit", feature = "rate-limit"))]
277pub use rustapi_extras::rate_limit;
278#[cfg(any(feature = "extras-rate-limit", feature = "rate-limit"))]
279pub use rustapi_extras::{RateLimitLayer, RateLimitStrategy};
280
281#[cfg(any(feature = "extras-config", feature = "config"))]
282pub use rustapi_extras::config;
283#[cfg(any(feature = "extras-config", feature = "config"))]
284pub use rustapi_extras::{
285    env_or, env_parse, load_dotenv, load_dotenv_from, require_env, Config, ConfigError,
286    Environment as ExtrasEnvironment,
287};
288
289#[cfg(any(feature = "extras-sqlx", feature = "sqlx"))]
290pub use rustapi_extras::{convert_sqlx_error, SqlxErrorExt};
291
292#[cfg(any(feature = "extras-api-key", feature = "api-key"))]
293pub use rustapi_extras::api_key;
294#[cfg(any(feature = "extras-cache", feature = "cache"))]
295pub use rustapi_extras::cache;
296#[cfg(any(feature = "extras-circuit-breaker", feature = "circuit-breaker"))]
297pub use rustapi_extras::circuit_breaker;
298#[cfg(any(feature = "extras-dedup", feature = "dedup"))]
299pub use rustapi_extras::dedup;
300#[cfg(any(feature = "extras-guard", feature = "guard"))]
301pub use rustapi_extras::guard;
302#[cfg(any(feature = "extras-logging", feature = "logging"))]
303pub use rustapi_extras::logging;
304#[cfg(any(feature = "extras-otel", feature = "otel"))]
305pub use rustapi_extras::otel;
306#[cfg(any(feature = "extras-replay", feature = "replay"))]
307pub use rustapi_extras::replay;
308#[cfg(any(feature = "extras-retry", feature = "retry"))]
309pub use rustapi_extras::retry;
310#[cfg(any(feature = "extras-sanitization", feature = "sanitization"))]
311pub use rustapi_extras::sanitization;
312#[cfg(any(feature = "extras-security-headers", feature = "security-headers"))]
313pub use rustapi_extras::security_headers;
314#[cfg(any(feature = "extras-structured-logging", feature = "structured-logging"))]
315pub use rustapi_extras::structured_logging;
316#[cfg(any(feature = "extras-timeout", feature = "timeout"))]
317pub use rustapi_extras::timeout;
318
319#[cfg(any(feature = "extras-oauth2-client", feature = "oauth2-client"))]
320pub use rustapi_extras::oauth2;
321#[cfg(any(feature = "extras-oauth2-client", feature = "oauth2-client"))]
322pub use rustapi_extras::{
323    AuthorizationRequest, CsrfState, OAuth2Client, OAuth2Config, PkceVerifier, Provider,
324    TokenError, TokenResponse,
325};
326
327#[cfg(any(feature = "extras-session", feature = "session"))]
328pub use rustapi_extras::session;
329#[cfg(any(feature = "extras-session", feature = "session"))]
330pub use rustapi_extras::{
331    MemorySessionStore, Session, SessionConfig, SessionError, SessionLayer, SessionRecord,
332    SessionStore,
333};
334
335#[cfg(any(feature = "extras-session-redis", feature = "session-redis"))]
336pub use rustapi_extras::RedisSessionStore;
337
338#[cfg(any(feature = "extras-jobs", feature = "jobs"))]
339pub use rustapi_jobs::{
340    EnqueueOptions, InMemoryBackend, Job, JobBackend, JobContext, JobError, JobQueue, JobRequest,
341};
342
343/// Prelude module: `use rustapi_rs::prelude::*`.
344pub mod prelude {
345    pub use crate::core::EventBus;
346    pub use crate::core::Validatable;
347    pub use crate::core::{
348        delete, delete_route, get, get_route, patch, patch_route, post, post_route, put, put_route,
349        route, serve_dir, sse_from_iter, sse_response, ApiError, AsyncValidatedJson, Body,
350        BodyLimitLayer, ClientIp, Created, CursorPaginate, CursorPaginated, Extension, HeaderValue,
351        Headers, HealthCheck, HealthCheckBuilder, HealthCheckResult, HealthEndpointConfig,
352        HealthStatus, Html, IntoResponse, Json, KeepAlive, Multipart, MultipartConfig,
353        MultipartField, NoContent, Paginate, Paginated, Path, ProductionDefaultsConfig, Query,
354        Redirect, Request, RequestId, RequestIdLayer, Response, Result, Route, Router, RustApi,
355        RustApiConfig, Sse, SseEvent, State, StaticFile, StaticFileConfig, StatusCode, StreamBody,
356        StreamingMultipart, StreamingMultipartField, TracingLayer, Typed, TypedPath, UploadedFile,
357        ValidatedJson, WithStatus,
358    };
359
360    #[cfg(any(feature = "core-compression", feature = "compression"))]
361    pub use crate::core::{CompressionAlgorithm, CompressionConfig, CompressionLayer};
362
363    #[cfg(any(feature = "core-cookies", feature = "cookies"))]
364    pub use crate::core::Cookies;
365
366    #[cfg(feature = "core-dashboard")]
367    pub use crate::{DashboardConfig, DashboardMetrics, DashboardSnapshot};
368
369    pub use rustapi_macros::ApiError;
370    pub use rustapi_macros::Schema;
371    pub use rustapi_macros::TypedPath;
372
373    pub use rustapi_validate::v2::AsyncValidate;
374    pub use rustapi_validate::v2::Validate as V2Validate;
375
376    #[cfg(any(feature = "core-legacy-validator", feature = "legacy-validator"))]
377    pub use validator::Validate;
378
379    pub use serde::{Deserialize, Serialize};
380    pub use tracing::{debug, error, info, trace, warn};
381
382    #[cfg(any(feature = "extras-jwt", feature = "jwt"))]
383    pub use crate::{create_token, AuthUser, JwtError, JwtLayer, JwtValidation, ValidatedClaims};
384
385    #[cfg(any(feature = "extras-cors", feature = "cors"))]
386    pub use crate::{AllowedOrigins, CorsLayer};
387
388    #[cfg(any(feature = "extras-rate-limit", feature = "rate-limit"))]
389    pub use crate::{RateLimitLayer, RateLimitStrategy};
390
391    #[cfg(any(feature = "extras-config", feature = "config"))]
392    pub use crate::{
393        env_or, env_parse, load_dotenv, load_dotenv_from, require_env, Config, ConfigError,
394        ExtrasEnvironment,
395    };
396
397    #[cfg(any(feature = "extras-sqlx", feature = "sqlx"))]
398    pub use crate::{convert_sqlx_error, SqlxErrorExt};
399
400    #[cfg(any(feature = "extras-oauth2-client", feature = "oauth2-client"))]
401    pub use crate::{
402        AuthorizationRequest, CsrfState, OAuth2Client, OAuth2Config, PkceVerifier, Provider,
403        TokenError, TokenResponse,
404    };
405
406    #[cfg(any(feature = "extras-session", feature = "session"))]
407    pub use crate::{
408        MemorySessionStore, Session, SessionConfig, SessionError, SessionLayer, SessionRecord,
409        SessionStore,
410    };
411
412    #[cfg(any(feature = "extras-session-redis", feature = "session-redis"))]
413    pub use crate::RedisSessionStore;
414
415    #[cfg(any(feature = "extras-jobs", feature = "jobs"))]
416    pub use crate::{
417        EnqueueOptions, InMemoryBackend, Job, JobBackend, JobContext, JobError, JobQueue,
418        JobRequest,
419    };
420
421    #[cfg(any(feature = "protocol-toon", feature = "toon"))]
422    pub use crate::protocol::toon::{AcceptHeader, LlmResponse, Negotiate, OutputFormat, Toon};
423
424    #[cfg(any(feature = "protocol-ws", feature = "ws"))]
425    pub use crate::protocol::ws::{Broadcast, Message, WebSocket, WebSocketStream};
426
427    #[cfg(any(feature = "protocol-view", feature = "view"))]
428    pub use crate::protocol::view::{ContextBuilder, Templates, TemplatesConfig, View};
429
430    #[cfg(any(feature = "protocol-grpc", feature = "grpc"))]
431    pub use crate::protocol::grpc::{
432        run_concurrently, run_rustapi_and_grpc, run_rustapi_and_grpc_with_shutdown,
433    };
434}
435
436#[cfg(test)]
437mod tests {
438    use super::prelude::*;
439
440    #[test]
441    fn prelude_imports_work() {
442        let _: fn() -> Result<()> = || Ok(());
443    }
444}