entertainarr-adapter-http 0.1.0

HTTP adapter for entertainarr
Documentation
use axum::Json;
use axum::response::IntoResponse;
use axum::routing::{get, head};

use crate::entity::language::Language;

mod auth;
pub mod client;
pub(crate) mod error;
mod media;
mod podcast;
mod podcast_episode;
pub(crate) mod prelude;
mod status;
mod task;
mod tvshow;
mod tvshow_episode;
mod tvshow_season;

pub fn create<S>() -> axum::Router<S>
where
    S: crate::server::prelude::ServerState + Clone,
{
    let api = axum::Router::new()
        .merge(auth::create::<S>())
        .merge(media::create::<S>())
        .merge(podcast::create::<S>())
        .merge(podcast_episode::create::<S>())
        .merge(tvshow::create::<S>())
        .merge(tvshow_episode::create::<S>())
        .merge(tvshow_season::create::<S>());

    axum::Router::new()
        .route("/", get(client::handle_index::<S>))
        .route("/{filename}", get(client::handle::<S>))
        .route("/api", head(status::handle))
        .nest("/api", api)
}

impl IntoResponse for error::ApiErrorResponse {
    fn into_response(self) -> axum::response::Response {
        (self.status_code, Json(self.body)).into_response()
    }
}

impl From<entertainarr_domain::language::Language> for Language {
    fn from(value: entertainarr_domain::language::Language) -> Self {
        match value {
            entertainarr_domain::language::Language::En => Self::En,
            entertainarr_domain::language::Language::Fr => Self::Fr,
        }
    }
}

impl From<Language> for entertainarr_domain::language::Language {
    fn from(value: Language) -> Self {
        match value {
            Language::En => Self::En,
            Language::Fr => Self::Fr,
        }
    }
}