use probe_code::models::{LimitedSearchResults, SearchResult};
use probe_code::search::token_utils::count_tokens;
pub fn apply_limits(
results: Vec<SearchResult>,
max_results: Option<usize>,
max_bytes: Option<usize>,
max_tokens: Option<usize>,
) -> LimitedSearchResults {
if max_results.is_none() && max_bytes.is_none() && max_tokens.is_none() {
return LimitedSearchResults {
results,
truncated: false,
total_results: results.len(),
total_bytes: results.iter().map(|r| r.content.len()).sum(),
total_tokens: results.iter().map(|r| count_tokens(&r.content)).sum(),
};
}
let mut limited_results = Vec::new();
let mut current_bytes = 0;
let mut current_tokens = 0;
let mut truncated = false;
let total_bytes = results.iter().map(|r| r.content.len()).sum();
let total_tokens = results.iter().map(|r| count_tokens(&r.content)).sum();
for result in results {
if let Some(max) = max_results {
if limited_results.len() >= max {
truncated = true;
break;
}
}
if let Some(max) = max_bytes {
if current_bytes + result.content.len() > max {
truncated = true;
break;
}
}
if let Some(max) = max_tokens {
let result_tokens = count_tokens(&result.content);
if current_tokens + result_tokens > max {
truncated = true;
break;
}
current_tokens += result_tokens;
}
current_bytes += result.content.len();
limited_results.push(result);
}
LimitedSearchResults {
results: limited_results,
truncated,
total_results: limited_results.len(),
total_bytes: current_bytes,
total_tokens: current_tokens,
}
}