use crate::session::SessionAdapter;
use crate::traits::Connector;
use monoloop_contracts::IdentityError;
use std::fmt;
use std::sync::Arc;
use thiserror::Error;
use uuid::Uuid;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct ConnectorInstanceId(String);
impl ConnectorInstanceId {
pub fn try_new(value: impl Into<String>) -> Result<Self, IdentityError> {
let s = value.into();
monoloop_contracts::validate_identity_string(&s)?;
Ok(Self(s))
}
pub fn generate() -> Self {
Self(Uuid::new_v4().to_string())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl fmt::Display for ConnectorInstanceId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.0)
}
}
pub struct ConnectorInstance {
pub instance_id: ConnectorInstanceId,
pub connector: Arc<dyn Connector>,
pub sessions: Option<Arc<dyn SessionAdapter>>,
}
impl ConnectorInstance {
pub fn new(
instance_id: ConnectorInstanceId,
connector: Arc<dyn Connector>,
sessions: Option<Arc<dyn SessionAdapter>>,
) -> Self {
Self {
instance_id,
connector,
sessions,
}
}
}
pub trait ConnectorFactory: Send + Sync {
fn create(&self) -> Result<ConnectorInstance, ConnectorBuildError>;
}
#[derive(Clone, Debug, Error, PartialEq, Eq)]
pub enum ConnectorBuildError {
#[error("connector configuration invalid: {0}")]
ConfigurationInvalid(&'static str),
#[error("connector resource unavailable: {0}")]
ResourceUnavailable(&'static str),
#[error("connector build invariant failed: {0}")]
InvariantFailed(&'static str),
}