scribe_selection/
context.rs

1//! Context extraction module that prepares selected files for bundling.
2
3use crate::selector::SelectionResult;
4use scribe_core::Result;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct ContextOptions {
9    /// When true, dependency metadata will be included if available.
10    pub include_dependencies: bool,
11    /// Maximum depth for dependency expansion (currently unused placeholder).
12    pub max_depth: usize,
13}
14
15impl Default for ContextOptions {
16    fn default() -> Self {
17        Self {
18            include_dependencies: true,
19            max_depth: 3,
20        }
21    }
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct ContextFile {
26    /// Path relative to the repository root.
27    pub path: String,
28    /// File contents if they were loaded during selection.
29    pub contents: Option<String>,
30    /// Token estimate computed for the file.
31    pub token_estimate: Option<usize>,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct CodeContext {
36    /// Files that will be bundled.
37    pub files: Vec<ContextFile>,
38    /// Dependency metadata (currently empty until graph extraction lands).
39    pub dependencies: Vec<String>,
40    /// Total tokens consumed by the selected files.
41    pub total_tokens: usize,
42}
43
44pub struct ContextExtractor;
45
46impl ContextExtractor {
47    pub fn new() -> Self {
48        Self
49    }
50
51    pub async fn extract(
52        &self,
53        selection: &SelectionResult,
54        _options: &ContextOptions,
55    ) -> Result<CodeContext> {
56        let files = selection
57            .files
58            .iter()
59            .map(|file| ContextFile {
60                path: file.relative_path.clone(),
61                contents: file.content.clone(),
62                token_estimate: file.token_estimate,
63            })
64            .collect();
65
66        Ok(CodeContext {
67            files,
68            dependencies: Vec::new(),
69            total_tokens: selection.total_tokens_used,
70        })
71    }
72}
73
74impl Default for ContextExtractor {
75    fn default() -> Self {
76        Self::new()
77    }
78}