cruding_axum_api 0.2.2

axum Cruding api wrapper
Documentation
use super::state::{CrudableAxumState, CrudableAxumStateListExt, into_owned_vec};
use super::types::CrudableAxum;
use crate::extractors::{AxumListParams, VecOrSingle};
use axum::response::IntoResponse;
use axum::{Json, extract::State};

fn with_ctx<S: CrudableAxumState, R>(
    state: S,
    ax_ctx: S::AxumCtx,
    f: impl FnOnce(S, super::types::ReqCtx<S::AxumCtx, S::InnerCtx>, S::SourceHandle) -> R,
) -> R {
    let sh = state.new_source_handle();
    let ctx = (ax_ctx, state.inner_ctx());
    f(state, ctx, sh)
}

pub async fn create<S: CrudableAxumState>(
    State(state): State<S>,
    ax_ctx: S::AxumCtx,
    Json(VecOrSingle(items)): Json<VecOrSingle<S::CRUD>>,
) -> Result<impl IntoResponse, S::Error>
where
    <S as CrudableAxumState>::Error: Send,
    <S as CrudableAxumState>::AxumCtx: Send,
{
    with_ctx(state, ax_ctx, |s, mut ctx, mut sh| async move {
        let out = s.handler().create(items, &mut ctx, &mut sh).await?;
        Ok(Json(into_owned_vec(out)))
    })
    .await
}

pub async fn read<S: CrudableAxumState>(
    State(state): State<S>,
    ax_ctx: S::AxumCtx,
    Json(VecOrSingle(keys)): Json<VecOrSingle<<S::CRUD as CrudableAxum>::PkeyDe>>,
) -> Result<impl IntoResponse, S::Error>
where
    <S as CrudableAxumState>::Error: Send,
    <S as CrudableAxumState>::AxumCtx: Send,
{
    let keys = keys.into_iter().map(Into::into).collect();
    with_ctx(state, ax_ctx, |s, mut ctx, mut sh| async move {
        let out = s.handler().read(keys, &mut ctx, &mut sh).await?;
        Ok(Json(into_owned_vec(out)))
    })
    .await
}

pub async fn update<S: CrudableAxumState>(
    State(state): State<S>,
    ax_ctx: S::AxumCtx,
    Json(VecOrSingle(items)): Json<VecOrSingle<S::CRUD>>,
) -> Result<impl IntoResponse, S::Error>
where
    <S as CrudableAxumState>::Error: Send,
    <S as CrudableAxumState>::AxumCtx: Send,
{
    with_ctx(state, ax_ctx, |s, mut ctx, mut sh| async move {
        let out = s.handler().update(items, &mut ctx, &mut sh).await?;
        Ok(Json(into_owned_vec(out)))
    })
    .await
}

pub async fn delete<S: CrudableAxumState>(
    State(state): State<S>,
    ax_ctx: S::AxumCtx,
    Json(VecOrSingle(keys)): Json<VecOrSingle<<S::CRUD as CrudableAxum>::PkeyDe>>,
) -> Result<impl IntoResponse, S::Error>
where
    <S as CrudableAxumState>::Error: Send,
    <S as CrudableAxumState>::AxumCtx: Send,
{
    let keys = keys.into_iter().map(Into::into).collect();
    with_ctx(state, ax_ctx, |s, mut ctx, mut sh| async move {
        s.handler().delete(keys, &mut ctx, &mut sh).await?;
        Ok(axum::http::StatusCode::NO_CONTENT)
    })
    .await
}

pub async fn read_list<S: CrudableAxumStateListExt>(
    State(state): State<S>,
    ax_ctx: S::AxumCtx,
    AxumListParams(params): AxumListParams<S::Column>,
) -> Result<impl IntoResponse, S::Error>
where
    <S as CrudableAxumState>::Error: Send,
    <S as CrudableAxumState>::AxumCtx: Send,
{
    with_ctx(state, ax_ctx, |s, mut ctx, mut sh| async move {
        let out = s
            .handler_list()
            .read_list(params, &mut ctx, &mut sh)
            .await?;
        Ok(Json(into_owned_vec(out)))
    })
    .await
}