use crate::Error;
use misskey_api::model::{channel::Channel, drive::DriveFile};
use misskey_api::{endpoint, EntityRef};
use misskey_core::Client;
pub struct ChannelBuilder<C> {
client: C,
request: endpoint::channels::create::Request,
}
impl<C> ChannelBuilder<C> {
pub fn new(client: C) -> Self {
let request = endpoint::channels::create::Request {
name: String::default(),
description: None,
banner_id: None,
};
ChannelBuilder { client, request }
}
pub fn as_request(&self) -> &endpoint::channels::create::Request {
&self.request
}
pub fn name(&mut self, name: impl Into<String>) -> &mut Self {
self.request.name = name.into();
self
}
pub fn description(&mut self, description: impl Into<String>) -> &mut Self {
self.request.description.replace(description.into());
self
}
pub fn banner(&mut self, file: impl EntityRef<DriveFile>) -> &mut Self {
self.request.banner_id.replace(file.entity_ref());
self
}
}
impl<C: Client> ChannelBuilder<C> {
pub async fn create(&self) -> Result<Channel, Error<C::Error>> {
let channel = self
.client
.request(&self.request)
.await
.map_err(Error::Client)?
.into_result()?;
Ok(channel)
}
}
pub struct ChannelUpdateBuilder<C> {
client: C,
request: endpoint::channels::update::Request,
}
impl<C> ChannelUpdateBuilder<C> {
pub fn new(client: C, channel: impl EntityRef<Channel>) -> Self {
let channel_id = channel.entity_ref();
let request = endpoint::channels::update::Request {
channel_id,
name: None,
description: None,
banner_id: None,
};
ChannelUpdateBuilder { client, request }
}
pub fn as_request(&self) -> &endpoint::channels::update::Request {
&self.request
}
pub fn name(&mut self, name: impl Into<String>) -> &mut Self {
self.request.name.replace(name.into());
self
}
update_builder_string_option_field! {
pub description;
}
update_builder_option_field! {
#[doc_name = "banner image"]
pub banner: impl EntityRef<DriveFile> { banner_id = banner.entity_ref() };
}
}
impl<C: Client> ChannelUpdateBuilder<C> {
pub async fn update(&self) -> Result<Channel, Error<C::Error>> {
let channel = self
.client
.request(&self.request)
.await
.map_err(Error::Client)?
.into_result()?;
Ok(channel)
}
}