use std::collections::HashSet;
use gix_packetline::blocking_io::{StreamingPeekableIter, WithSidebands, Writer};
pub type Capabilities = HashSet<String>;
pub struct Client {
child: std::process::Child,
capabilities: Capabilities,
version: usize,
input: Writer<std::process::ChildStdin>,
out: StreamingPeekableIter<std::process::ChildStdout>,
}
pub struct Server {
capabilities: Capabilities,
version: usize,
input: StreamingPeekableIter<std::io::StdinLock<'static>>,
out: Writer<std::io::StdoutLock<'static>>,
}
#[derive(Debug, Clone)]
pub enum Status {
Previous,
Unset,
Named(String),
}
impl Status {
pub fn success() -> Self {
Status::Named("success".into())
}
pub fn delayed() -> Self {
Status::Named("delayed".into())
}
pub fn abort() -> Self {
Status::Named("abort".into())
}
pub fn exit() -> Self {
Status::Named("send-term-signal".into())
}
pub fn error(message: impl Into<String>) -> Self {
Status::Named(message.into())
}
}
impl Status {
pub fn is_success(&self) -> bool {
match self {
Status::Previous => true,
Status::Unset => false,
Status::Named(n) => n == "success",
}
}
pub fn is_abort(&self) -> bool {
self.message() == Some("abort")
}
pub fn is_delayed(&self) -> bool {
match self {
Status::Previous | Status::Unset => false,
Status::Named(n) => n == "delayed",
}
}
pub fn message(&self) -> Option<&str> {
match self {
Status::Previous | Status::Unset => None,
Status::Named(msg) => msg.as_str().into(),
}
}
}
pub mod client;
pub mod server;
type PacketlineReader<'a, T = std::process::ChildStdout> =
WithSidebands<'a, T, fn(bool, &[u8]) -> gix_packetline::read::ProgressAction>;