at_jet/lib.rs
1//! # AT-Jet
2//!
3//! High-performance HTTP + Protobuf API framework for mobile services.
4
5// Deny unwrap() and expect() in non-test code to prevent panics
6#![cfg_attr(not(test), deny(clippy::unwrap_used, clippy::expect_used))]
7//! AT-Jet provides a clean, ergonomic way to build HTTP APIs that use Protocol Buffers
8//! for serialization - ideal for mobile clients that need efficient bandwidth usage
9//! and strong schema evolution guarantees.
10//!
11//! ## Features
12//!
13//! - **HTTP/1.1 and HTTP/2 support** via axum
14//! - **Protobuf request/response handling** with automatic content negotiation
15//! - **Dual-format support** - Protobuf for production, JSON for debugging
16//! - **CDN-friendly** design for global mobile users
17//! - **Middleware support** for authentication, logging, compression
18//! - **Type-safe routing** with compile-time guarantees
19//!
20//! ## Quick Start
21//!
22//! ```rust,ignore
23//! use at_jet::prelude::*;
24//! use bytes::Bytes;
25//!
26//! #[tokio::main]
27//! async fn main() -> anyhow::Result<()> {
28//! let app = JetServer::new()
29//! .route("/api/user/:id", get(get_user))
30//! .route("/api/user", post(create_user));
31//!
32//! app.serve("0.0.0.0:8080").await?;
33//! Ok(())
34//! }
35//!
36//! // Dual-format: accepts both protobuf and JSON, responds based on Accept header
37//! async fn get_user(Path(id): Path<i32>) -> ProtobufResponse<User> {
38//! let user = User { id, name: "John".to_string() };
39//! ProtobufResponse::ok(user)
40//! }
41//!
42//! async fn create_user(ApiRequest { body, format }: ApiRequest<CreateUserRequest>) -> ApiResponse<User> {
43//! // body is decoded from either protobuf or JSON based on Content-Type
44//! // response format matches the Accept header
45//! ApiResponse::ok(format, user)
46//! }
47//! ```
48
49pub mod client;
50pub mod dual_format;
51pub mod error;
52pub mod extractors;
53#[cfg(feature = "metrics")]
54pub mod metrics;
55pub mod middleware;
56pub mod response;
57pub mod server;
58#[cfg(feature = "session")]
59pub mod session;
60pub mod startup;
61pub mod tracing_init;
62
63/// Re-exports for convenient usage
64pub mod prelude {
65 pub use crate::{client::JetClient,
66 dual_format::{AcceptFormat,
67 ApiRequest,
68 ApiResponse,
69 ApiResult,
70 DEBUG_FORMAT_HEADER,
71 ResponseFormat,
72 configure_debug_keys},
73 error::{JetError,
74 Result},
75 extractors::ProtobufRequest,
76 response::ProtobufResponse,
77 server::JetServer};
78
79 // Re-export common axum types
80 pub use axum::{Router,
81 extract::Path,
82 routing::{delete,
83 get,
84 patch,
85 post,
86 put}};
87
88 // Re-export prost for protobuf
89 pub use prost::Message;
90
91 // Re-export serde for JSON support
92 pub use serde::{Deserialize,
93 Serialize};
94
95 // Re-export async_trait
96 pub use async_trait::async_trait;
97
98 // Re-export CORS types for server configuration
99 pub use tower_http::cors::CorsLayer;
100
101 // Re-export tracing middleware
102 pub use crate::middleware::{SmartSpanMaker,
103 smart_trace_layer};
104
105 // Re-export request ID middleware
106 pub use crate::middleware::{RequestId,
107 RequestIdLayer,
108 X_REQUEST_ID};
109
110 // Re-export startup utilities
111 pub use crate::startup::{StartupBanner,
112 mask_secret,
113 mask_url_credentials};
114
115 // Re-export tracing initialization (always available)
116 pub use crate::tracing_init::{TracingConfig,
117 TracingGuard,
118 init_tracing};
119
120 // Re-export metrics types (when feature enabled)
121 #[cfg(feature = "metrics")]
122 pub use crate::metrics::{MetricsConfig,
123 MetricsGuard,
124 init_metrics,
125 metrics_router,
126 record_app_info};
127 #[cfg(feature = "metrics")]
128 pub use crate::middleware::HttpMetricsLayer;
129
130 // Re-export JWT types (when feature enabled)
131 #[cfg(feature = "jwt")]
132 pub use crate::middleware::{JwtAuthError,
133 JwtAuthLayer,
134 JwtConfig,
135 JwtValidator};
136
137 // Re-export session types (when feature enabled)
138 #[cfg(feature = "session")]
139 pub use crate::session::{Session,
140 SessionStore};
141}
142
143/// Content types used by AT-Jet
144pub mod content_types {
145 pub const APPLICATION_PROTOBUF: &str = "application/x-protobuf";
146 pub const APPLICATION_JSON: &str = "application/json";
147}