earl_protocol_bash/
schema.rs1use 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}