Expand description
§ModKit - Declarative Module System
A unified crate for building modular applications with declarative module definitions.
§Features
- Declarative: Use
#[module(...)]attribute to declare modules - Auto-discovery: Modules are automatically discovered via inventory
- Type-safe: Compile-time validation of capabilities
- Phase-based lifecycle: executed by
HostRuntime(seeruntime/host_runtime.rsdocs)
§Golden Path: Stateless Handlers
For optimal performance and readability, prefer stateless handlers that receive
Extension<T> and other extractors rather than closures that capture environment.
§Recommended Pattern
ⓘ
use axum::{Extension, Json};
use modkit::api::{OperationBuilder, Problem};
use std::sync::Arc;
async fn list_users(
Extension(svc): Extension<Arc<UserService>>,
) -> Result<Json<Vec<UserDto>>, Problem> {
let users = svc.list_users().await.map_err(Problem::from)?;
Ok(Json(users))
}
pub fn router(service: Arc<UserService>) -> axum::Router {
let op = OperationBuilder::get("/users-info/v1/users")
.summary("List users")
.handler(list_users)
.json_response(200, "List of users")
.standard_errors(®istry);
axum::Router::new()
.route("/users-info/v1/users", axum::routing::get(list_users))
.layer(Extension(service))
.layer(op.to_layer())
}§Benefits
- Performance: No closure captures or cloning on each request
- Readability: Clear function signatures show exactly what data is needed
- Testability: Easy to unit test handlers with mock state
- Type Safety: Compile-time verification of dependencies
- Flexibility: Individual service injection without coupling
§Basic Module Example
ⓘ
use modkit::{module, Module, DbModule, RestfulModule, StatefulModule};
#[derive(Default)]
#[module(name = "user", deps = ["database"], capabilities = [db, rest, stateful])]
pub struct UserModule;
// Implement the declared capabilities...Re-exports§
pub use crate::contracts::GrpcServiceCapability;pub use crate::contracts::RegisterGrpcServiceFn;pub use config::ConfigError;pub use config::ConfigProvider;pub use config::module_config_or_default;pub use config::module_config_required;pub use context::ModuleContextBuilder;pub use context::ModuleCtx;pub use client_hub::ClientHub;pub use registry::ModuleRegistry;pub use api::IntoProblem;pub use api::OpenApiInfo;pub use api::OpenApiRegistry;pub use api::OpenApiRegistryImpl;pub use api::OperationBuilder;pub use api::error_mapping_middleware;pub use api::problem::bad_request;pub use api::problem::conflict;pub use api::problem::internal_error;pub use api::problem::not_found;pub use http::sse::SseBroadcaster;pub use result::ApiResult;pub use domain::DomainErrorMarker;pub use domain::DomainModel;pub use directory::LocalDirectoryClient;pub use backends::BackendKind;pub use backends::InstanceHandle;pub use backends::LocalProcessBackend;pub use backends::ModuleRuntimeBackend;pub use backends::OopBackend;pub use backends::OopModuleConfig;pub use backends::OopSpawnConfig;pub use lifecycle::Lifecycle;pub use lifecycle::Runnable;pub use lifecycle::Status;pub use lifecycle::StopReason;pub use lifecycle::WithLifecycle;pub use plugins::GtsPluginSelector;pub use runtime::DbOptions;pub use runtime::Endpoint;pub use runtime::ModuleInstance;pub use runtime::ModuleManager;pub use runtime::OopModuleSpawnConfig;pub use runtime::OopSpawnOptions;pub use runtime::RunOptions;pub use runtime::ShutdownOptions;pub use runtime::run;pub use inventory;pub use crate::contracts::*;
Modules§
- api
- Type-safe API operation builder with compile-time guarantees
- backends
- Backend abstraction for out-of-process module management
- client_
hub - Minimalistic, type-safe
ClientHub. - config
- Configuration module for typed module configuration access.
- context
- contracts
- directory
- Directory API - contract for service discovery and instance resolution
- domain
- Domain Layer Marker Traits
- errors
- Re-export error catalog types from modkit-errors
- gts
- http
- HTTP utilities for modkit
- lifecycle
- plugins
- registry
- result
- Ergonomic result types for API handlers
- runtime
- telemetry
- Telemetry utilities for OpenTelemetry integration
Structs§
- Page
- Page
Info - Problem
- RFC 9457 Problem Details for HTTP APIs.
- Register
Instance Info - Information for registering a new module instance
- Secured
- A wrapper that binds a
SecurityContextto a client reference. - Service
Endpoint - Represents an endpoint where a service can be reached
- Service
Instance Info - Information about a service instance
- Validation
Error - Collection of validation errors for 422 responses.
Traits§
- Directory
Client - Directory API trait for service discovery and instance management
- With
Security Context - Extension trait that adds the
security_ctxmethod to any type.
Type Aliases§
- Result
Result<T, Error>
Attribute Macros§
- async_
trait - lifecycle
- module
- Main #[module] attribute macro