use super::{APIConnector, Client, EventHandlerFunc, RawEventHandlerFunc, WebhookOptions};
use crate::{
api::{types::UpdateType, APIClient, TlsClient},
framework::Framework,
};
use parking_lot::RwLock;
use std::sync::Arc;
use typemap_rev::TypeMap;
pub struct ClientBuilder {
hyper_client: Option<TlsClient>,
api_client: Option<Arc<Box<APIConnector>>>,
webhook: Option<WebhookOptions>,
framework: Option<Arc<Framework>>,
token: Option<String>,
allowed_updates: Vec<UpdateType>,
event_handler_funcs: Vec<EventHandlerFunc>,
raw_event_handler_funcs: Vec<RawEventHandlerFunc>,
}
impl ClientBuilder {
#[allow(clippy::new_without_default)]
pub fn new() -> Self {
Self {
api_client: None,
hyper_client: None,
webhook: None,
framework: None,
token: None,
allowed_updates: Vec::new(),
event_handler_funcs: Vec::new(),
raw_event_handler_funcs: Vec::new(),
}
}
pub fn set_webhook(&mut self, webhook: &WebhookOptions) -> &mut Self {
self.webhook = Some(webhook.clone());
self
}
pub fn set_framework(&mut self, framework: Arc<Framework>) -> &mut Self {
self.framework = Some(framework);
self
}
#[allow(clippy::needless_pass_by_value)] pub fn set_token(&mut self, token: impl ToString) -> &mut Self {
self.token = Some(token.to_string());
self
}
pub fn set_hyper_client(&mut self, client: TlsClient) -> &mut Self {
self.hyper_client = Some(client);
self
}
pub fn set_api_client(&mut self, client: Arc<Box<APIConnector>>) -> &mut Self {
self.api_client = Some(client);
self
}
pub fn set_allowed_updates(&mut self, allowed: Vec<UpdateType>) -> &mut Self {
self.allowed_updates = allowed;
self
}
pub fn add_allowed_updates(&mut self, allowed: UpdateType) -> &mut Self {
self.allowed_updates.push(allowed);
self
}
pub fn remove_allowed_updates(&mut self, denied: &UpdateType) -> &mut Self {
self.allowed_updates.retain(|t| t != denied);
self
}
pub fn add_handler_func(&mut self, handler: EventHandlerFunc) -> &mut Self {
self.event_handler_funcs.push(handler);
self
}
pub fn add_raw_handler_func(&mut self, handler: RawEventHandlerFunc) -> &mut Self {
self.raw_event_handler_funcs.push(handler);
self
}
pub fn build(&mut self) -> Client {
if self.framework.is_some()
&& !self.allowed_updates.is_empty()
&& !self.allowed_updates.contains(&UpdateType::Message)
{
self.allowed_updates.push(UpdateType::Message);
}
self.api_client.clone().map_or_else(
|| Client {
api_client: Arc::new(Box::new(APIClient::new(
self.hyper_client.clone(),
self.token
.as_ref()
.expect("A token must be provided for the telegram bot to work"),
))),
event_handlers: self.event_handler_funcs.clone(),
raw_event_handlers: self.raw_event_handler_funcs.clone(),
data: Arc::new(RwLock::new(TypeMap::custom())),
framework: self.framework.clone(),
webhook_opts: self.webhook.clone(),
allowed_updates: self.allowed_updates.clone(),
},
|c| Client {
api_client: c,
event_handlers: self.event_handler_funcs.clone(),
webhook_opts: self.webhook.clone(),
raw_event_handlers: self.raw_event_handler_funcs.clone(),
data: Arc::new(RwLock::new(TypeMap::custom())),
framework: self.framework.clone(),
allowed_updates: self.allowed_updates.clone(),
},
)
}
}