use std::{fmt, io, result};
use create::Create;
use delete::Delete;
use std::{marker::PhantomData, sync::Arc};
use tansu_sans_io::ErrorCode;
use url::Url;
use crate::list::List;
mod create;
mod delete;
mod list;
pub type Result<T, E = Error> = result::Result<T, E>;
#[derive(thiserror::Error, Debug)]
pub enum Error {
Api(ErrorCode),
Client(#[from] tansu_client::Error),
Io(Arc<io::Error>),
Protocol(#[from] tansu_sans_io::Error),
SerdeJson(Arc<serde_json::Error>),
}
impl From<io::Error> for Error {
fn from(value: io::Error) -> Self {
Self::Io(Arc::new(value))
}
}
impl From<serde_json::Error> for Error {
fn from(value: serde_json::Error) -> Self {
Self::SerdeJson(Arc::new(value))
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{self:?}")
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Topic {
Create(create::Configuration),
Delete(delete::Configuration),
List(list::Configuration),
}
impl Topic {
pub fn create() -> create::Builder<PhantomData<Url>, PhantomData<String>, PhantomData<i32>> {
create::Builder::default()
}
pub fn delete() -> delete::Builder<PhantomData<Url>, PhantomData<String>> {
delete::Builder::default()
}
pub fn list() -> list::Builder<PhantomData<Url>> {
list::Builder::default()
}
pub async fn main(self) -> Result<ErrorCode> {
match self {
Self::Create(configuration) => Create::try_from(configuration)?.main().await,
Self::Delete(configuration) => Delete::try_from(configuration)?.main().await,
Self::List(configuration) => List::try_from(configuration)?.main().await,
}
}
}