steer_core/app/
system_context.rs1use 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}