Skip to main content

steer_core/app/
system_context.rs

1use crate::app::EnvironmentInfo;
2
3#[derive(Debug, Clone)]
4pub struct SystemContext {
5    pub prompt: String,
6    pub environment: Option<EnvironmentInfo>,
7}
8
9impl SystemContext {
10    pub fn new(prompt: String) -> Self {
11        Self {
12            prompt,
13            environment: None,
14        }
15    }
16
17    pub fn with_environment(prompt: String, environment: Option<EnvironmentInfo>) -> Self {
18        Self {
19            prompt,
20            environment,
21        }
22    }
23
24    pub fn render(&self) -> Option<String> {
25        self.render_with_prompt(Some(self.prompt.clone()))
26    }
27
28    pub fn render_with_prompt(&self, prompt: Option<String>) -> Option<String> {
29        let base = prompt.unwrap_or_default();
30        let base_trimmed = base.trim();
31        let base_value = if base_trimmed.is_empty() {
32            None
33        } else {
34            Some(base.trim_end().to_string())
35        };
36
37        let env_value = self
38            .environment
39            .as_ref()
40            .map(|env| env.as_context())
41            .map(|value| value.trim().to_string())
42            .filter(|value| !value.is_empty());
43
44        let mut combined = String::new();
45        if let Some(base_value) = base_value {
46            combined.push_str(&base_value);
47        }
48        if let Some(env_value) = env_value {
49            if !combined.is_empty() {
50                combined.push_str("\n\n");
51            }
52            combined.push_str(&env_value);
53        }
54
55        if combined.trim().is_empty() {
56            None
57        } else {
58            Some(combined)
59        }
60    }
61}