use error_stack::{Result, ResultExt};
#[cfg(feature = "online")]
use std::time::Duration;
use crate::client::Client;
use crate::datafile::Datafile;
use crate::error::ClientError;
#[cfg(feature = "online")]
use crate::event_api::EventDispatcher;
use crate::DecideOptions;
pub struct UninitializedClient {
pub(crate) datafile: Datafile,
pub(crate) default_decide_options: Option<DecideOptions>,
#[cfg(feature = "online")]
pub(crate) update_interval: Option<Duration>,
#[cfg(feature = "online")]
pub(crate) event_dispatcher: Option<Box<dyn EventDispatcher>>,
}
impl Client {
#[cfg(feature = "online")]
pub fn from_sdk_key(sdk_key: &str) -> Result<UninitializedClient, ClientError> {
let datafile = Datafile::from_sdk_key(sdk_key).change_context(ClientError::InvalidDatafile)?;
Client::from_datafile(datafile)
}
pub fn from_local_datafile(file_path: &str) -> Result<UninitializedClient, ClientError> {
let datafile = Datafile::from_local_datafile(file_path).change_context(ClientError::InvalidDatafile)?;
Client::from_datafile(datafile)
}
pub fn from_string<S>(content: S) -> Result<UninitializedClient, ClientError>
where
S: AsRef<str>,
{
let datafile = Datafile::from_string(content).change_context(ClientError::InvalidDatafile)?;
Client::from_datafile(datafile)
}
fn from_datafile(datafile: Datafile) -> Result<UninitializedClient, ClientError> {
Ok(UninitializedClient::new(datafile))
}
}
impl UninitializedClient {
pub(super) fn new(datafile: Datafile) -> UninitializedClient {
UninitializedClient {
datafile,
default_decide_options: None,
#[cfg(feature = "online")]
update_interval: None,
#[cfg(feature = "online")]
event_dispatcher: None,
}
}
#[cfg(feature = "online")]
pub fn with_event_dispatcher<F, D>(mut self, dispatcher: F) -> UninitializedClient
where
F: FnOnce(&Datafile) -> D,
D: EventDispatcher,
{
let dispatcher = dispatcher(&self.datafile);
self.event_dispatcher = Some(Box::new(dispatcher));
self
}
pub fn with_default_decide_options(mut self, options: DecideOptions) -> UninitializedClient {
self.default_decide_options = Some(options);
self
}
#[cfg(feature = "online")]
pub fn with_update_interval(mut self, interval: Duration) -> UninitializedClient {
self.update_interval = Some(interval);
self
}
pub fn initialize(self) -> Client {
Client::from(self)
}
}