use crate::CupelError;
use crate::model::{ContextBudget, ContextItem};
type ClassifyResult = Result<(Vec<ContextItem>, Vec<ContextItem>, Vec<ContextItem>), CupelError>;
pub(crate) fn classify(items: &[ContextItem], budget: &ContextBudget) -> ClassifyResult {
let mut pinned = Vec::new();
let mut scoreable = Vec::new();
let mut neg_items = Vec::new();
for item in items {
if item.tokens() < 0 {
neg_items.push(item.clone());
continue;
}
if item.pinned() {
pinned.push(item.clone());
} else {
scoreable.push(item.clone());
}
}
let pinned_tokens: i64 = pinned.iter().map(|i| i.tokens()).sum();
let available = budget.max_tokens() - budget.output_reserve();
if pinned_tokens > available {
return Err(CupelError::PinnedExceedsBudget {
pinned_tokens,
available,
});
}
Ok((pinned, scoreable, neg_items))
}