pub mod get { use axum::{ extract::{Path, State}, response::{self, IntoResponse, Redirect}, }; use crate::{ app::App, channel, error::Internal, token::extract::Identity, ui::{ assets::{Asset, Assets}, error::NotFound, }, }; pub async fn handler( State(app): State, identity: Option, Path(channel): Path, ) -> Result { let _ = identity.ok_or(Error::NotLoggedIn)?; app.channels() .get(&channel) .await .map_err(Error::internal)? .ok_or(Error::NotFound)?; Assets::index().map_err(Error::Internal) } #[derive(Debug, thiserror::Error)] pub enum Error { #[error("requested channel not found")] NotFound, #[error("not logged in")] NotLoggedIn, #[error("{0}")] Internal(Internal), } impl Error { fn internal(err: impl Into) -> Self { Self::Internal(err.into()) } } impl IntoResponse for Error { fn into_response(self) -> response::Response { match self { Self::NotFound => match Assets::index() { Ok(asset) => NotFound(asset).into_response(), Err(internal) => internal.into_response(), }, Self::NotLoggedIn => Redirect::temporary("/login").into_response(), Self::Internal(error) => error.into_response(), } } } }