Some checks failed
Build and Deploy Thoughts / build-and-deploy-local (push) Failing after 3m4s
clean-axum
Axum scaffold with clean architecture.
You probably don't need Rust on Rails.
Refer to this post for rationale and background.
Features
- Axum framework
- SeaORM domain models
- Completely separated API routers and DB-related logic (named "persistence" layer)
- Completely separated input parameters, queries and output schemas
- OpenAPI documentation (Swagger UI and Scalar) powered by Utoipa
- Error handling with Anyhow
- Custom parameter validation with validator
- Optional Shuttle runtime
- Optional prefork workers for maximizing performance on Linux
Module hierarchy
API logic
api::routers: Axum endpointsapi::error: Models and traits for error handlingapi::extractorCustom Axum extractorsapi::extractor::json:Jsonfor bodies and responsesapi::extractor::valid:Validfor JSON body validation
api::validation: JSON validation model based onvalidatorapi::models: Non domain model API modelsapi::models::response: JSON error response
OpenAPI documentation
doc: Utoipa doc declaration
API-agonistic application logic
Main concept: Web framework is replaceable.
All modules here should not include any specific API web framework logic.
app::persistence: DB manipulation (CRUD) functionsapp::config: DB or API server configurationapp::state: APP state, e.g. DB connectionapp::error: APP errors used byapi::error. e.g. "User not found"
DB/API-agnostic domain models
Main concept: Database (Sqlite/MySQL/PostgreSQL) is replaceable.
Except models::domains and migration, all modules are ORM library agnostic.
models::domains: SeaORM domain modelsmodels::params: Serde input parameters for creating/updating domain models in DBmodels::schemas: Serde output schemas for combining different domain modelsmodels::queries: Serde queries for filtering domain modelsmigration: SeaORM migration files
Unit and integration tests
tests::api: API integration tests. Hierarchy is the same asapi::routerstests::app::persistence: DB/ORM-related unit tests. Hierarchy is the same asapp::persistence
Others
utils: Utility functionsmain: Tokio and Shuttle conditional entry point
Run
Start server
cp .env.example .env
# touch dev.db
# cargo install sea-orm-cli
# sea-orm-cli migrate up
cargo run
# or for production
cargo run --release
Call API
curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"username":"aaa"}'
curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"username":"abc"}'
curl http://localhost:3000/users\?username\=a
OpenAPI doc (Swagger UI/Scalar)
open http://localhost:3000/docs
open http://localhost:3000/scalar
Start Shuttle local server
# cargo install cargo-shuttle
cargo shuttle run
Make sure docker engine is running, otherwise:
brew install colima docker
colima start
sudo ln -sf $HOME/.colima/default/docker.sock /var/run/docker.sock
Shuttle deployment
cargo shuttle login
cargo shuttle deploy
Benchmark
# edit .env to use Postgres
cargo run --release
wrk --latency -t20 -c50 -d10s http://localhost:3000/users\?username\=