use crate::control::ConnectionControlHandle;
use crate::handles::{ConnectionCompletionHandle, RawInputHandle, RawOutputHandle};
use crate::session::SessionAttachment;
use monoloop_contracts::{ConnectionId, ConnectorLimits, DialectBinding, ExternalSessionId};
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct OpenConnection {
pub connection_id: ConnectionId,
pub endpoint_ref: String,
pub external_session_id: Option<ExternalSessionId>,
pub session_attachment: Option<Arc<SessionAttachment>>,
pub credential_ref: Option<String>,
pub required_dialect: Option<String>,
pub limits: ConnectorLimits,
}
impl OpenConnection {
pub fn new(connection_id: ConnectionId, endpoint_ref: impl Into<String>) -> Self {
Self {
connection_id,
endpoint_ref: endpoint_ref.into(),
external_session_id: None,
session_attachment: None,
credential_ref: None,
required_dialect: None,
limits: ConnectorLimits::default(),
}
}
pub fn with_session_attachment(mut self, attachment: Arc<SessionAttachment>) -> Self {
if !attachment.create_mode {
self.external_session_id = Some(attachment.external_session_id.clone());
}
self.session_attachment = Some(attachment);
self
}
}
pub struct PendingRawConnection {
pub connection_id: ConnectionId,
pub control: ConnectionControlHandle,
pub opened: OpenCompletion,
}
pub type OpenCompletion = Pin<
Box<
dyn Future<Output = Result<OpenedRawConnection, monoloop_contracts::ConnectorError>> + Send,
>,
>;
pub struct OpenedRawConnection {
pub connection_id: ConnectionId,
pub external_session_id: Option<ExternalSessionId>,
pub dialect: DialectBinding,
pub input: RawInputHandle,
pub output: Arc<RawOutputHandle>,
pub control: ConnectionControlHandle,
pub completion: ConnectionCompletionHandle,
}