use omp_core::Str;
pub mod health;
pub mod hello;
pub mod tls;
pub mod uds;
pub use health::{HealthReporter, health_service};
pub use hello::{HelloService, MIN_SCHEMA_REV, Peer, handshake};
pub use tls::{TlsConfig, client_tls, server_tls};
pub use uds::{Incoming, connect, listen};
pub enum Error {
Io(std::io::Error),
Transport(tonic::transport::Error),
Rpc(tonic::Status),
Tls(Str),
SchemaTooOld {
server: u32,
client: u32,
},
SchemaUnsupported {
server_min: u32,
client: u32,
},
Unsupported(&'static str),
}
impl std::fmt::Debug for Error {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self, formatter)
}
}
impl std::fmt::Display for Error {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Io(error) => write!(formatter, "I/O error ({:?})", error.kind()),
Self::Transport(_) => formatter.write_str("transport error"),
Self::Rpc(status) => write!(formatter, "RPC error ({:?})", status.code()),
Self::Tls(_) => formatter.write_str("TLS configuration error"),
Self::SchemaTooOld { server, client } => write!(
formatter,
"server schema revision {server} is older than client revision {client}"
),
Self::SchemaUnsupported { server_min, client } => write!(
formatter,
"client schema revision {client} is below server minimum {server_min}"
),
Self::Unsupported(kind) => write!(formatter, "unsupported transport: {kind}"),
}
}
}
impl std::error::Error for Error {}
impl From<std::io::Error> for Error {
fn from(error: std::io::Error) -> Self {
Self::Io(error)
}
}
impl From<tonic::transport::Error> for Error {
fn from(error: tonic::transport::Error) -> Self {
Self::Transport(error)
}
}
impl From<tonic::Status> for Error {
fn from(status: tonic::Status) -> Self {
Self::Rpc(status)
}
}
#[cfg(test)]
mod tests {
use super::Error;
#[test]
fn observable_error_surfaces_discard_untrusted_diagnostics() {
const CANARY: &str = "canary-private-key-and-access-token";
let errors = [
Error::Io(std::io::Error::other(CANARY)),
Error::Rpc(tonic::Status::permission_denied(CANARY)),
Error::Tls(CANARY.into()),
];
for error in errors {
assert!(!error.to_string().contains(CANARY));
assert!(!format!("{error:?}").contains(CANARY));
assert!(std::error::Error::source(&error).is_none());
}
}
}