use super::{AdmissionDimension, AdmissionDimensionSet};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AdmissionBindError {
UnsupportedDimension {
requested: AdmissionDimension,
supported: AdmissionDimensionSet,
},
AlreadyBound,
ExplicitBindingNotConsumed {
limiter: String,
component: String,
},
}
impl std::fmt::Display for AdmissionBindError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::UnsupportedDimension {
requested,
supported,
} => write!(
f,
"configured ingress admission does not support the `{}` dimension \
required at this admission point (supported: {})",
requested.as_str(),
supported.to_display_string()
),
Self::AlreadyBound => f.write_str("ingress admission binding was already consumed"),
Self::ExplicitBindingNotConsumed { limiter, component } => write!(
f,
"component `{component}` explicitly binds rate limiter `{limiter}` but does not consume ingress admission during construction"
),
}
}
}
impl std::error::Error for AdmissionBindError {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn dimension_mismatch_message_names_required_and_supported() {
let err = AdmissionBindError::UnsupportedDimension {
requested: AdmissionDimension::Bytes,
supported: AdmissionDimensionSet::single(AdmissionDimension::Messages),
};
let text = err.to_string();
assert!(text.contains("`bytes`"), "unexpected message: {text}");
assert!(text.contains("[messages]"), "unexpected message: {text}");
}
}