use aspero_core::{Field, ProviderId, SourceRecord, Usage};
use crate::Engine;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Abstract {
pub text: String,
pub source: ProviderId,
}
#[derive(Debug, Clone, Default)]
pub struct AbstractsReport {
pub found: Vec<Option<Abstract>>,
pub usage: Vec<(ProviderId, Usage)>,
}
impl Engine {
pub async fn abstracts(&self, works: &[&SourceRecord]) -> AbstractsReport {
let mut found: Vec<Option<Abstract>> = works
.iter()
.map(|r| {
non_blank(r.work.abstract_text.clone()).map(|text| Abstract {
text,
source: r.source.clone(),
})
})
.collect();
let mut usage = Vec::new();
for entry in &self.entries {
if !entry
.provider
.capabilities()
.fields
.contains(Field::Abstract)
{
continue;
}
let missing = works
.iter()
.copied()
.enumerate()
.filter(|(i, _)| found[*i].is_none());
for (i, record) in self.ask_about(entry, missing, &mut usage).await {
if let Some(text) = non_blank(record.work.abstract_text) {
found[i] = Some(Abstract {
text,
source: entry.provider.id(),
});
}
}
}
AbstractsReport { found, usage }
}
}
fn non_blank(text: Option<String>) -> Option<String> {
text.filter(|t| !t.trim().is_empty())
}