Skip to main content

earl_protocol_bash/
schema.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use earl_core::schema::TransportTemplate;
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
9#[serde(deny_unknown_fields)]
10pub struct BashOperationTemplate {
11    pub bash: BashScriptTemplate,
12    #[serde(default)]
13    pub stream: bool,
14    pub transport: Option<TransportTemplate>,
15}
16
17#[derive(Debug, Clone, Deserialize, Serialize)]
18#[serde(deny_unknown_fields)]
19pub struct BashScriptTemplate {
20    pub script: String,
21    #[serde(default)]
22    pub env: Option<BTreeMap<String, Value>>,
23    pub cwd: Option<String>,
24    pub sandbox: Option<BashSandboxTemplate>,
25}
26
27#[derive(Debug, Clone, Deserialize, Serialize)]
28#[serde(deny_unknown_fields)]
29pub struct BashSandboxTemplate {
30    pub network: Option<bool>,
31    pub writable_paths: Option<Vec<String>>,
32    pub max_time_ms: Option<u64>,
33    pub max_output_bytes: Option<u64>,
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn bash_operation_defaults_stream_false() {
42        let json = r#"{"bash":{"script":"echo hello"}}"#;
43        let op: BashOperationTemplate = serde_json::from_str(json).unwrap();
44        assert!(!op.stream);
45    }
46
47    #[test]
48    fn bash_operation_accepts_stream_true() {
49        let json = r#"{"stream":true,"bash":{"script":"echo hello"}}"#;
50        let op: BashOperationTemplate = serde_json::from_str(json).unwrap();
51        assert!(op.stream);
52    }
53}