pub trait ExpectedDomain {
fn expected_domain(&self, catalog_id: &str, arg_index: usize) -> Option<&str>;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct NoExpectedDomain;
impl ExpectedDomain for NoExpectedDomain {
fn expected_domain(&self, _catalog_id: &str, _arg_index: usize) -> Option<&str> {
None
}
}
#[derive(Clone, Copy)]
pub struct ChainedExpectedDomain<'a, 'b> {
first: &'a dyn ExpectedDomain,
second: &'b dyn ExpectedDomain,
}
impl<'a, 'b> ChainedExpectedDomain<'a, 'b> {
pub fn new(first: &'a dyn ExpectedDomain, second: &'b dyn ExpectedDomain) -> Self {
ChainedExpectedDomain { first, second }
}
}
impl ExpectedDomain for ChainedExpectedDomain<'_, '_> {
fn expected_domain(&self, catalog_id: &str, arg_index: usize) -> Option<&str> {
self.first
.expected_domain(catalog_id, arg_index)
.or_else(|| self.second.expected_domain(catalog_id, arg_index))
}
}