use crate::token_budget::apply_token_budget_selection;
use scribe_core::{Config, FileInfo, Result};
#[derive(Debug, Clone)]
pub struct SelectionCriteria<'a> {
pub files: Vec<FileInfo>,
pub token_budget: usize,
pub config: &'a Config,
}
#[derive(Debug, Clone)]
pub struct SelectionResult {
pub files: Vec<FileInfo>,
pub total_tokens_used: usize,
pub budget: usize,
pub unused_tokens: usize,
pub total_files_considered: usize,
}
impl SelectionResult {
pub fn file_paths(&self) -> Vec<String> {
self.files.iter().map(|f| f.relative_path.clone()).collect()
}
}
pub struct CodeSelector;
impl CodeSelector {
pub fn new() -> Self {
Self
}
pub async fn select(&self, criteria: SelectionCriteria<'_>) -> Result<SelectionResult> {
let total_files_considered = criteria.files.len();
let budget = criteria.token_budget;
let files =
apply_token_budget_selection(criteria.files, criteria.token_budget, criteria.config)
.await?;
let total_tokens_used: usize = files.iter().filter_map(|f| f.token_estimate).sum();
let unused_tokens = budget.saturating_sub(total_tokens_used);
Ok(SelectionResult {
files,
total_tokens_used,
budget,
unused_tokens,
total_files_considered,
})
}
}
impl Default for CodeSelector {
fn default() -> Self {
Self::new()
}
}