axum_extra

Module either

Source
Expand description

Either* types for combining extractors or responses into a single type.

§As an extractor

use axum_extra::either::Either3;
use axum::{
    body::Bytes,
    Router,
    async_trait,
    routing::get,
    extract::FromRequestParts,
};

// extractors for checking permissions
struct AdminPermissions {}

#[async_trait]
impl<S> FromRequestParts<S> for AdminPermissions
where
    S: Send + Sync,
{
    // check for admin permissions...
}

struct User {}

#[async_trait]
impl<S> FromRequestParts<S> for User
where
    S: Send + Sync,
{
    // check for a logged in user...
}

async fn handler(
    body: Either3<AdminPermissions, User, ()>,
) {
    match body {
        Either3::E1(admin) => { /* ... */ }
        Either3::E2(user) => { /* ... */ }
        Either3::E3(guest) => { /* ... */ }
    }
}

Note that if all the inner extractors reject the request, the rejection from the last extractor will be returned. For the example above that would be BytesRejection.

§As a response

use axum_extra::either::Either3;
use axum::{Json, http::StatusCode, response::IntoResponse};
use serde_json::{Value, json};

async fn handler() -> Either3<Json<Value>, &'static str, StatusCode> {
    if something() {
        Either3::E1(Json(json!({ "data": "..." })))
    } else if something_else() {
        Either3::E2("foobar")
    } else {
        Either3::E3(StatusCode::NOT_FOUND)
    }
}

fn something() -> bool {
    // ...
}

fn something_else() -> bool {
    // ...
}

The general recommendation is to use IntoResponse::into_response to return different response types, but if you need to preserve the exact type then Either* works as well.

Enums§

  • Combines two extractors or responses into a single type.
  • Combines three extractors or responses into a single type.
  • Combines four extractors or responses into a single type.
  • Combines five extractors or responses into a single type.
  • Combines six extractors or responses into a single type.
  • Combines seven extractors or responses into a single type.
  • Combines eight extractors or responses into a single type.