use crate::reference::Reference;
use citum_schema::Style;
use citum_schema::options::{Config, Substitute, SubstituteKey};
pub struct Matcher<'a> {
style: &'a Style,
default_config: &'a Config,
}
impl<'a> Matcher<'a> {
#[must_use]
pub fn new(style: &'a Style, default_config: &'a Config) -> Self {
Self {
style,
default_config,
}
}
#[must_use]
pub fn contributors_match(&self, prev: &Reference, current: &Reference) -> bool {
let substitute = self.get_substitute_config();
let prev_contributors = self.get_primary_contributors(prev, &substitute);
let curr_contributors = self.get_primary_contributors(current, &substitute);
match (prev_contributors, curr_contributors) {
(Some(p), Some(c)) => p == c,
_ => false,
}
}
fn get_substitute_config(&self) -> Substitute {
self.style
.options
.as_ref()
.and_then(|o| o.substitute.as_ref())
.map(citum_schema::options::SubstituteConfig::resolve)
.or_else(|| {
self.default_config
.substitute
.as_ref()
.map(citum_schema::options::SubstituteConfig::resolve)
})
.unwrap_or_default()
}
fn get_primary_contributors(
&self,
reference: &Reference,
substitute: &Substitute,
) -> Option<crate::reference::Contributor> {
if let Some(author) = reference.author() {
return Some(author);
}
for key in &substitute.template {
let contributor = match key {
SubstituteKey::Editor => reference.editor(),
SubstituteKey::Translator => reference.translator(),
SubstituteKey::Title => None, };
if contributor.is_some() {
return contributor;
}
}
None
}
}