use bincode::{Decode as dDecode, Encode, Encode as dEncode};
use serde::{Deserialize, Serialize};
use std::error::Error;
use std::fmt::{Debug, Display, Formatter};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CuError {
message: String,
cause: Option<String>,
}
impl Display for CuError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let context_str = match &self.cause {
Some(c) => c.to_string(),
None => "None".to_string(),
};
write!(f, "{}\n context:{}", self.message, context_str)?;
Ok(())
}
}
impl Error for CuError {}
impl From<&str> for CuError {
fn from(s: &str) -> CuError {
CuError {
message: s.to_string(),
cause: None,
}
}
}
impl From<String> for CuError {
fn from(s: String) -> CuError {
CuError {
message: s,
cause: None,
}
}
}
impl CuError {
pub fn new_with_cause(message: &str, cause: impl Error) -> CuError {
CuError {
message: message.to_string(),
cause: Some(cause.to_string()),
}
}
pub fn add_cause(mut self, context: &str) -> CuError {
self.cause = Some(context.into());
self
}
}
pub type CuResult<T> = Result<T, CuError>;
pub trait WriteStream<E: Encode>: Sync + Send + Debug {
fn log(&mut self, obj: &E) -> CuResult<()>;
fn flush(&mut self) -> CuResult<()> {
Ok(())
}
}
#[derive(dEncode, dDecode, Copy, Clone, Debug, PartialEq)]
pub enum UnifiedLogType {
Empty, StructuredLogLine, CopperList, LastEntry, }
pub trait CopperListTuple: bincode::Encode + bincode::Decode + Sized + Debug {}
impl<T> CopperListTuple for T where T: bincode::Encode + bincode::Decode + Debug + Sized {}