use crate::selector::SelectionResult;
use scribe_core::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContextOptions {
pub include_dependencies: bool,
pub max_depth: usize,
}
impl Default for ContextOptions {
fn default() -> Self {
Self {
include_dependencies: true,
max_depth: 3,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContextFile {
pub path: String,
pub contents: Option<String>,
pub token_estimate: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeContext {
pub files: Vec<ContextFile>,
pub dependencies: Vec<String>,
pub total_tokens: usize,
}
pub struct ContextExtractor;
impl ContextExtractor {
pub fn new() -> Self {
Self
}
pub async fn extract(
&self,
selection: &SelectionResult,
_options: &ContextOptions,
) -> Result<CodeContext> {
let files = selection
.files
.iter()
.map(|file| ContextFile {
path: file.relative_path.clone(),
contents: file.content.clone(),
token_estimate: file.token_estimate,
})
.collect();
Ok(CodeContext {
files,
dependencies: Vec::new(),
total_tokens: selection.total_tokens_used,
})
}
}
impl Default for ContextExtractor {
fn default() -> Self {
Self::new()
}
}