domain-web

Use when building web services. Keywords: web server, HTTP, REST API, GraphQL, WebSocket, axum, actix, warp, rocket, tower, hyper, reqwest, middleware, router,…

INSTALLATION
npx skills add https://github.com/actionbook/rust-skills --skill domain-web
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

Web Domain

Layer 3: Domain Constraints

Domain Constraints → Design Implications

Domain RuleDesign ConstraintRust Implication
Stateless HTTPNo request-local globalsState in extractors
ConcurrencyHandle many connectionsAsync, Send + Sync
Latency SLAFast responseEfficient ownership
SecurityInput validationType-safe extractors
ObservabilityRequest tracingtracing + tower layers

Critical Constraints

Async by Default

RULE: Web handlers must not block

WHY: Block one task = block many requests

RUST: async/await, spawn_blocking for CPU work

State Management

RULE: Shared state must be thread-safe

WHY: Handlers run on any thread

RUST: Arc<T>, Arc<RwLock<T>> for mutable

Request Lifecycle

RULE: Resources live only for request duration

WHY: Memory management, no leaks

RUST: Extractors, proper ownership

Trace Down ↓

From constraints to design (Layer 2):

"Need shared application state"

    ↓ m07-concurrency: Use Arc for thread-safe sharing

    ↓ m02-resource: Arc<RwLock<T>> for mutable state

"Need request validation"

    ↓ m05-type-driven: Validated extractors

    ↓ m06-error-handling: IntoResponse for errors

"Need middleware stack"

    ↓ m12-lifecycle: Tower layers

    ↓ m04-zero-cost: Trait-based composition

Framework Comparison

FrameworkStyleBest For
axumFunctional, towerModern APIs
actix-webActor-basedHigh performance
warpFilter compositionComposable APIs
rocketMacro-drivenRapid development

Key Crates

PurposeCrate
HTTP serveraxum, actix-web
HTTP clientreqwest
JSONserde_json
Auth/JWTjsonwebtoken
Sessiontower-sessions
Databasesqlx, diesel
Middlewaretower

Design Patterns

PatternPurposeImplementation
ExtractorsRequest parsingState(db), Json(payload)
Error responseUnified errorsimpl IntoResponse
MiddlewareCross-cuttingTower layers
Shared stateApp configArc

Code Pattern: Axum Handler

async fn handler(

    State(db): State<Arc<DbPool>>,

    Json(payload): Json<CreateUser>,

) -> Result<Json<User>, AppError> {

    let user = db.create_user(&payload).await?;

    Ok(Json(user))

}

// Error handling

impl IntoResponse for AppError {

    fn into_response(self) -> Response {

        let (status, message) = match self {

            Self::NotFound => (StatusCode::NOT_FOUND, "Not found"),

            Self::Internal(_) => (StatusCode::INTERNAL_SERVER_ERROR, "Internal error"),

        };

        (status, Json(json!({"error": message}))).into_response()

    }

}

Common Mistakes

MistakeDomain ViolationFix
Blocking in handlerLatency spikespawn_blocking
Rc in stateNot Send + SyncUse Arc
No validationSecurity riskType-safe extractors
No error responseBad UXIntoResponse impl

Trace to Layer 1

ConstraintLayer 2 PatternLayer 1 Implementation
Async handlersAsync/awaittokio runtime
Thread-safe stateShared stateArc, Arc
Request lifecycleExtractorsOwnership via From
MiddlewareTower layersTrait-based composition

Related Skills

WhenSee
Async patternsm07-concurrency
State managementm02-resource
Error handlingm06-error-handling
Middleware designm12-lifecycle
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card