use crate::{ChannelError, ChildMessage, ShepherdMessage, endpoint, session};
#[derive(Debug)]
pub struct Channel {
pub(crate) reader: std::io::BufReader<endpoint::ReadHalf>,
pub(crate) writer: endpoint::Transport,
pub(crate) version: Option<String>,
}
impl Channel {
pub fn open() -> Result<Option<Self>, ChannelError> {
let found = endpoint::discover()?;
if found == endpoint::Endpoint::Absent {
return Ok(None);
}
let (reader, writer) = endpoint::connect(&found)?;
Ok(Some(Self {
reader: std::io::BufReader::new(reader),
writer,
version: std::env::var(endpoint::VERSION_VAR).ok(),
}))
}
pub fn recv(&mut self) -> Result<Option<ShepherdMessage>, ChannelError> {
session::read_message(&mut self.reader)
}
pub fn send(&mut self, message: &ChildMessage) -> Result<(), ChannelError> {
session::write_message(&mut self.writer, message)
}
#[must_use]
pub fn version(&self) -> Option<&str> {
self.version.as_deref()
}
pub(crate) fn into_halves(
self,
) -> (
std::io::BufReader<endpoint::ReadHalf>,
endpoint::Transport,
Option<String>,
) {
(self.reader, self.writer, self.version)
}
}