use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GtsIdSegmentError {
pub num: usize,
pub offset: usize,
pub segment: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GtsIdError {
pub input: String,
pub cause: String,
pub segment: Option<GtsIdSegmentError>,
}
impl GtsIdError {
#[must_use]
pub fn new(input: impl Into<String>, cause: impl Into<String>) -> Self {
Self {
input: input.into(),
cause: cause.into(),
segment: None,
}
}
#[must_use]
pub fn with_segment(mut self, num: usize, offset: usize, segment: impl Into<String>) -> Self {
self.segment = Some(GtsIdSegmentError {
num,
offset,
segment: segment.into(),
});
self
}
}
impl fmt::Display for GtsIdError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.segment {
Some(s) => write!(
f,
"Invalid GTS segment #{} @ offset {}: '{}': {}",
s.num, s.offset, s.segment, self.cause
),
None => write!(f, "Invalid GTS identifier: {}: {}", self.input, self.cause),
}
}
}
impl std::error::Error for GtsIdError {}