use std::fmt;
use std::net::SocketAddr;
use std::time::Instant;
use crate::channel::AccessRights;
use epics_base_rs::types::DbFieldType;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ChannelState {
Searching,
Connecting,
Connected,
Unresponsive,
Disconnected,
Shutdown,
}
impl ChannelState {
pub fn is_operational(self) -> bool {
matches!(self, Self::Connected | Self::Unresponsive)
}
}
impl fmt::Display for ChannelState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Searching => write!(f, "Searching"),
Self::Connecting => write!(f, "Connecting"),
Self::Connected => write!(f, "Connected"),
Self::Unresponsive => write!(f, "Unresponsive"),
Self::Disconnected => write!(f, "Disconnected"),
Self::Shutdown => write!(f, "Shutdown"),
}
}
}
pub(crate) struct ChannelInner {
pub cid: u32,
pub pv_name: String,
pub state: ChannelState,
pub sid: u32,
pub native_type: Option<DbFieldType>,
pub element_count: u32,
pub server_addr: Option<SocketAddr>,
pub access_rights: AccessRights,
pub connect_waiters: Vec<epics_base_rs::runtime::sync::oneshot::Sender<()>>,
pub conn_tx: epics_base_rs::runtime::sync::broadcast::Sender<ConnectionEvent>,
pub reconnect_count: u32,
pub last_connected_at: Option<Instant>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConnectionEvent {
Connected,
Disconnected,
Unresponsive,
AccessRightsChanged {
read: bool,
write: bool,
},
}