use std::sync::Arc;
use crate::{
config::Config,
node::{Node, NodeEventListener},
Error,
};
#[derive(uniffi::Object)]
pub struct NodeBuilder {
config: Arc<Config>,
event_listener: Option<Arc<dyn NodeEventListener>>,
}
#[uniffi::export]
impl NodeBuilder {
#[uniffi::constructor]
pub fn new(config: &Config) -> Arc<Self> {
Arc::new(Self {
config: Arc::new(config.clone()),
event_listener: None,
})
}
pub fn with_event_listener(
self: Arc<Self>,
listener: Box<dyn NodeEventListener>,
) -> Arc<Self> {
Arc::new(Self {
config: Arc::clone(&self.config),
event_listener: Some(Arc::from(listener)),
})
}
pub fn register(
&self,
mnemonic: String,
invite_code: Option<String>,
) -> Result<Arc<Node>, Error> {
let node = crate::register_internal(mnemonic, invite_code, &self.config)?;
self.attach_observers(&node)?;
Ok(node)
}
pub fn recover(&self, mnemonic: String) -> Result<Arc<Node>, Error> {
let node = crate::recover_internal(mnemonic, &self.config)?;
self.attach_observers(&node)?;
Ok(node)
}
pub fn connect(
&self,
credentials: Vec<u8>,
mnemonic: Option<String>,
) -> Result<Arc<Node>, Error> {
let node = match mnemonic {
Some(mnemonic) => crate::connect_internal(mnemonic, credentials, &self.config)?,
None => crate::connect_signerless_internal(credentials, &self.config)?,
};
self.attach_observers(&node)?;
Ok(node)
}
pub fn register_or_recover(
&self,
mnemonic: String,
invite_code: Option<String>,
) -> Result<Arc<Node>, Error> {
let node =
crate::register_or_recover_internal(mnemonic, invite_code, &self.config)?;
self.attach_observers(&node)?;
Ok(node)
}
}
impl NodeBuilder {
fn attach_observers(&self, node: &Arc<Node>) -> Result<(), Error> {
if let Some(listener) = self.event_listener.as_ref() {
node.set_event_listener(Arc::clone(listener))?;
}
Ok(())
}
}