use super::ConnectorId;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct PortIdLocal {
pub index: u32,
}
impl PortIdLocal {
pub fn new(id: u32) -> Self {
Self{ index: id }
}
// TODO: Unsure about this, maybe remove, then also remove all struct
// instances where I call this
pub fn new_invalid() -> Self {
Self{ index: u32::MAX }
}
pub fn is_valid(&self) -> bool {
return self.index != u32::MAX;
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum PortKind {
Putter,
Getter,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum PortState {
Open,
Closed,
}
/// Represents a port inside of the runtime. This is generally the local view of
/// a connector on its port, which may not be consistent with the rest of the
/// global system (e.g. its peer was moved to a new connector, or the peer might
/// have died in the meantime, so it is no longer usable).
#[derive(Clone)]
pub struct Port {
pub self_id: PortIdLocal,
pub peer_id: PortIdLocal,
pub kind: PortKind,
pub state: PortState,
pub peer_connector: ConnectorId, // might be temporarily inconsistent while peer port is sent around in non-sync phase
}
// TODO: Turn port ID into its own type
pub struct Channel {
pub putter_id: PortIdLocal, // can put on it, so from the connector's point of view, this is an output
pub getter_id: PortIdLocal, // vice versa: can get on it, so an input for the connector
}