#![doc(html_root_url = "https://docs.rs/sdforge/0.2.0")]
#![warn(missing_docs)]
pub use sdforge_macros::{service_api, service_module, test_macro};
#[cfg(any(
feature = "http",
feature = "mcp",
feature = "websocket",
feature = "grpc"
))]
pub use inventory;
#[cfg(feature = "streaming")]
pub use tokio_stream;
#[cfg(feature = "http")]
pub mod axum {
pub use axum::body::Body;
pub use axum::response::IntoResponse;
pub mod routing {
pub use axum::routing::{get, post, MethodRouter};
}
pub mod extract {
pub use axum::extract::{Form, Json, Path, Query};
pub use axum_extra::TypedHeader;
}
pub mod http {
pub use axum::http::Request;
pub mod header {
pub use axum::http::header::CONTENT_TYPE;
}
pub mod status {
pub use axum::http::StatusCode;
}
}
pub mod handler {
pub use axum::handler::Handler;
}
pub use axum::serve;
}
pub mod prelude {
#[cfg(feature = "http")]
pub use crate::core::validation::validators::{validate_email, validate_length};
pub use crate::core::{ApiError, ApiMetadata, ServiceError, ServiceResponse};
#[cfg(feature = "http")]
pub use crate::http::{HttpRoute, RouteRegistration};
#[cfg(feature = "mcp")]
pub use crate::mcp::McpToolInstance;
#[cfg(feature = "http")]
pub use crate::axum::IntoResponse;
pub use sdforge_macros::{service_api, service_module, test_macro};
}
pub mod core;
#[cfg(feature = "http")]
pub mod http;
#[cfg(feature = "mcp")]
pub mod mcp;
#[cfg(feature = "mcp")]
pub mod mcp_sdk_types {
pub mod tools {
pub use ::mcp_sdk::tools::Tool;
}
pub mod types {
pub use ::mcp_sdk::types::CallToolResponse;
pub use ::mcp_sdk::types::ToolResponseContent;
}
}
#[cfg(feature = "mcp")]
pub use mcp_sdk_types as mcp_sdk;
#[cfg(feature = "mcp")]
pub use mcp_sdk_types::tools::Tool;
#[cfg(feature = "mcp")]
pub use mcp_sdk_types::types::CallToolResponse;
#[cfg(feature = "mcp")]
pub use mcp_sdk_types::types::ToolResponseContent;
#[cfg(feature = "streaming")]
pub mod streaming;
#[cfg(feature = "streaming")]
pub use streaming::{create_stream_channel, stream_to_sse, StreamEvent, StreamResponse};
#[cfg(feature = "security")]
pub mod security;
#[cfg(feature = "security")]
pub use security::{
auth_middleware, rate_limit_middleware, ApiKeyAuth, AuditLog, AuditLogger, AuditResult,
AuthContext, AuthError, AuthExtractor, AuthMetadata, AuthResult, BearerAuth, RateLimitConfig,
RateLimitError, RateLimiter,
};
#[cfg(feature = "http")]
pub mod config;
#[cfg(feature = "http")]
pub use config::{
ApiConfig, AppConfig, AuthConfig, ConfigError, ConfigLoader, CorsConfig, DatabaseConfig,
EnvHelper, LoggingConfig, RateLimitConfigFile, RateLimitEndpointConfig, ServerConfig,
TlsConfig, TracingConfig,
};
#[cfg(feature = "hot-reload")]
pub use config::hot_reload::ConfigWatcher;
#[cfg(feature = "cache")]
pub mod cache;
#[cfg(feature = "cache")]
pub use cache::{CacheConfig, CacheMiddleware, CacheService};
#[cfg(feature = "websocket")]
pub mod websocket;
#[cfg(feature = "websocket")]
pub use websocket::{
build, websocket_upgrade, BoxFuture, ConnectionManager, WebSocketConnection, WebSocketHandler,
WebSocketMessage, WebSocketRoute,
};
#[cfg(feature = "grpc")]
pub mod grpc;
#[cfg(feature = "grpc")]
pub use grpc::{
build_server, build_server_with_config, GrpcRoute, GrpcServerConfig, SdForgeGrpcService,
};
#[cfg(feature = "grpc")]
pub use grpc::sdforge_v1::{
sd_forge_service_server::SdForgeServiceServer, CallRequest, CallResponse, InfoRequest,
InfoResponse,
};
#[cfg(feature = "http")]
pub use http::version_routing::{build_version_router, VersionRouterConfig, VersionedRoute};
#[cfg(feature = "logging")]
pub use config::{init_logging, init_logging_default};
#[cfg(any(
feature = "http",
feature = "mcp",
feature = "websocket",
feature = "grpc"
))]
pub fn init_all_plugins() -> PluginCounts {
#[cfg(feature = "grpc")]
use crate::grpc::GrpcRoute;
use crate::http::RouteRegistration;
#[cfg(feature = "mcp")]
use crate::mcp::McpToolRegistration;
#[cfg(feature = "websocket")]
use crate::websocket::WebSocketRoute;
use once_cell::sync::Lazy;
use std::sync::Mutex;
static ROUTES: Lazy<Mutex<Vec<&'static RouteRegistration>>> =
Lazy::new(|| Mutex::new(inventory::iter::<RouteRegistration>().collect()));
#[cfg(feature = "mcp")]
static MCP_TOOLS: Lazy<Mutex<Vec<&'static McpToolRegistration>>> =
Lazy::new(|| Mutex::new(inventory::iter::<McpToolRegistration>().collect()));
#[cfg(feature = "websocket")]
static WS_ROUTES: Lazy<Mutex<Vec<&'static WebSocketRoute>>> =
Lazy::new(|| Mutex::new(inventory::iter::<WebSocketRoute>().collect()));
#[cfg(feature = "grpc")]
static GRPC_ROUTES: Lazy<Mutex<Vec<&'static GrpcRoute>>> =
Lazy::new(|| Mutex::new(inventory::iter::<GrpcRoute>().collect()));
let routes = ROUTES.lock().unwrap();
#[cfg(feature = "mcp")]
let mcp_tools = MCP_TOOLS.lock().unwrap();
#[cfg(feature = "websocket")]
let ws_routes = WS_ROUTES.lock().unwrap();
#[cfg(feature = "grpc")]
let grpc_routes = GRPC_ROUTES.lock().unwrap();
PluginCounts {
routes: routes.len(),
#[cfg(feature = "mcp")]
mcp_tools: mcp_tools.len(),
#[cfg(feature = "websocket")]
ws_routes: ws_routes.len(),
#[cfg(feature = "grpc")]
grpc_routes: grpc_routes.len(),
}
}
#[cfg(any(
feature = "http",
feature = "mcp",
feature = "websocket",
feature = "grpc"
))]
pub struct PluginCounts {
pub routes: usize,
#[cfg(feature = "mcp")]
pub mcp_tools: usize,
#[cfg(feature = "websocket")]
pub ws_routes: usize,
#[cfg(feature = "grpc")]
pub grpc_routes: usize,
}
#[cfg(feature = "mcp")]
pub fn get_mcp_tools() -> Vec<crate::mcp::McpToolInstance> {
crate::mcp::get_mcp_tools()
}
#[cfg(feature = "websocket")]
pub fn get_websocket_routes() -> Vec<&'static crate::websocket::WebSocketRoute> {
inventory::iter::<crate::websocket::WebSocketRoute>().collect()
}