use crate::prelude::*;
#[injectable]
pub(crate) struct ApiVerifier {
verify_options: Ref<VerifyOptions>,
target_options: Ref<TargetOptions>,
}
impl ApiVerifier {
#[must_use]
pub(crate) fn execute(&self, source: &Source) -> Vec<SourceIssue> {
trace!(
"{} torrent hash against {}",
"Checking".bold(),
source.directory.display()
);
let exclude_tags = self.verify_options.exclude_tags.as_deref().unwrap_or(&[]);
let mut issues: Vec<SourceIssue> = Vec::new();
issues.extend(check_category(source));
issues.extend(check_scene(source));
issues.extend(check_possible_scene(source));
issues.extend(check_lossy_master(source));
issues.extend(check_lossy_web(source));
issues.extend(check_trumpable(source));
issues.extend(check_unconfirmed(source));
issues.extend(check_excluded_tags(source, exclude_tags));
let targets = BTreeSet::from_iter(self.target_options.target.clone());
issues.extend(check_targets(source, &targets));
issues
}
}
pub(crate) fn check_category(source: &Source) -> Option<SourceIssue> {
if source.group.category_name != "Music" {
return Some(SourceIssue::Category {
actual: source.group.category_name.clone(),
});
}
None
}
pub(crate) fn check_scene(source: &Source) -> Option<SourceIssue> {
if source.torrent.scene {
return Some(SourceIssue::Scene);
}
None
}
pub(crate) fn check_possible_scene(source: &Source) -> Option<SourceIssue> {
if !source.torrent.file_path.contains(' ') && !source.torrent.file_list.contains(' ') {
return Some(SourceIssue::PossibleScene);
}
None
}
pub(crate) fn check_lossy_master(source: &Source) -> Option<SourceIssue> {
if source.torrent.lossy_master_approved == Some(true) {
return Some(SourceIssue::LossyMaster);
}
None
}
pub(crate) fn check_lossy_web(source: &Source) -> Option<SourceIssue> {
if source.torrent.lossy_web_approved == Some(true) {
return Some(SourceIssue::LossyWeb);
}
None
}
pub(crate) fn check_trumpable(source: &Source) -> Option<SourceIssue> {
if source.torrent.trumpable == Some(true) {
return Some(SourceIssue::Trumpable);
}
None
}
pub(crate) fn check_unconfirmed(source: &Source) -> Option<SourceIssue> {
if source.torrent.remastered == Some(false) {
return Some(SourceIssue::Unconfirmed);
}
None
}
pub(crate) fn check_excluded_tags(source: &Source, exclude_tags: &[String]) -> Option<SourceIssue> {
let excluded: Vec<String> = exclude_tags
.iter()
.filter(|x| source.group.tags.contains(x))
.cloned()
.collect();
if !excluded.is_empty() {
return Some(SourceIssue::Excluded { tags: excluded });
}
None
}
pub(crate) fn check_targets(
source: &Source,
configured_targets: &BTreeSet<TargetFormat>,
) -> Option<SourceIssue> {
if source.targets.is_empty() {
return Some(SourceIssue::NoTargets {
formats: configured_targets.clone(),
});
}
None
}