monoloop_connector/
instance.rs1use crate::session::SessionAdapter;
4use crate::traits::Connector;
5use monoloop_contracts::IdentityError;
6use std::fmt;
7use std::sync::Arc;
8use thiserror::Error;
9use uuid::Uuid;
10
11#[derive(Clone, Debug, PartialEq, Eq, Hash)]
13pub struct ConnectorInstanceId(String);
14
15impl ConnectorInstanceId {
16 pub fn try_new(value: impl Into<String>) -> Result<Self, IdentityError> {
18 let s = value.into();
19 monoloop_contracts::validate_identity_string(&s)?;
20 Ok(Self(s))
21 }
22
23 pub fn generate() -> Self {
25 Self(Uuid::new_v4().to_string())
26 }
27
28 pub fn as_str(&self) -> &str {
30 &self.0
31 }
32}
33
34impl fmt::Display for ConnectorInstanceId {
35 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36 f.write_str(&self.0)
37 }
38}
39
40pub struct ConnectorInstance {
42 pub instance_id: ConnectorInstanceId,
44 pub connector: Arc<dyn Connector>,
46 pub sessions: Option<Arc<dyn SessionAdapter>>,
48}
49
50impl ConnectorInstance {
51 pub fn new(
53 instance_id: ConnectorInstanceId,
54 connector: Arc<dyn Connector>,
55 sessions: Option<Arc<dyn SessionAdapter>>,
56 ) -> Self {
57 Self {
58 instance_id,
59 connector,
60 sessions,
61 }
62 }
63}
64
65pub trait ConnectorFactory: Send + Sync {
67 fn create(&self) -> Result<ConnectorInstance, ConnectorBuildError>;
69}
70
71#[derive(Clone, Debug, Error, PartialEq, Eq)]
73pub enum ConnectorBuildError {
74 #[error("connector configuration invalid: {0}")]
76 ConfigurationInvalid(&'static str),
77 #[error("connector resource unavailable: {0}")]
79 ResourceUnavailable(&'static str),
80 #[error("connector build invariant failed: {0}")]
82 InvariantFailed(&'static str),
83}