use crate::config::{DEFAULT_BASE_URL, DEFAULT_WS_URL, RadionConfig};
use crate::error::{RadionError, Result};
#[derive(Debug)]
#[non_exhaustive]
pub struct Radion {
pub config: RadionConfig,
#[cfg(feature = "realtime")]
#[cfg_attr(docsrs, doc(cfg(feature = "realtime")))]
pub realtime: crate::realtime::RealtimeClient,
}
impl Radion {
pub fn builder() -> RadionBuilder {
RadionBuilder::default()
}
}
#[derive(Debug, Default)]
pub struct RadionBuilder {
api_key: Option<String>,
base_url: Option<String>,
ws_url: Option<String>,
}
impl RadionBuilder {
#[must_use]
pub fn api_key(mut self, api_key: impl Into<String>) -> Self {
self.api_key = Some(api_key.into());
self
}
#[must_use]
pub fn base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_url = Some(base_url.into());
self
}
#[must_use]
pub fn ws_url(mut self, ws_url: impl Into<String>) -> Self {
self.ws_url = Some(ws_url.into());
self
}
pub fn build(self) -> Result<Radion> {
let api_key = self.api_key.unwrap_or_default();
if api_key.is_empty() {
return Err(RadionError::connection("api_key is required"));
}
let config = RadionConfig {
api_key: api_key.clone(),
base_url: self
.base_url
.unwrap_or_else(|| DEFAULT_BASE_URL.to_string()),
ws_url: self.ws_url.unwrap_or_else(|| DEFAULT_WS_URL.to_string()),
};
#[cfg(feature = "realtime")]
let realtime = crate::realtime::RealtimeClient::new(
crate::realtime::RealtimeOptions::new(api_key).url(config.ws_url.clone()),
);
Ok(Radion {
config,
#[cfg(feature = "realtime")]
realtime,
})
}
}