#![forbid(unsafe_code)]
use secrecy::{ExposeSecret, SecretString};
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DomainError {
pub code: &'static str,
pub message: String,
}
impl DomainError {
#[must_use]
pub fn new(code: &'static str, message: impl Into<String>) -> Self {
Self {
code,
message: message.into(),
}
}
}
impl fmt::Display for DomainError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}: {}", self.code, self.message)
}
}
impl std::error::Error for DomainError {}
#[inline]
pub fn domain_err(e: DomainError) -> crate::errors::SshCliError {
e.into()
}
#[must_use]
pub fn secret_nonempty(s: &SecretString) -> bool {
!s.expose_secret().is_empty()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn secret_nonempty_helper() {
assert!(!secret_nonempty(&SecretString::from(String::new())));
assert!(secret_nonempty(&SecretString::from("x".to_string())));
}
#[test]
fn domain_into_ssh_cli_error() {
let e: crate::errors::SshCliError =
DomainError::new("host", "empty").into();
assert!(matches!(e, crate::errors::SshCliError::Domain(_)));
}
}