#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ApprovalOverride {
pub modified_args_json: String,
pub injected_context: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResolvedCall {
pub args_json: String,
pub injected_context: Option<String>,
}
#[must_use]
pub fn resolve_approved_call(
proposed_args_json: &str,
over: Option<&ApprovalOverride>,
) -> ResolvedCall {
let args_json = match over {
Some(o) if !o.modified_args_json.trim().is_empty() => o.modified_args_json.clone(),
_ => proposed_args_json.to_owned(),
};
let injected_context = over
.map(|o| o.injected_context.trim())
.filter(|c| !c.is_empty())
.map(str::to_owned);
ResolvedCall {
args_json,
injected_context,
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::pedantic, clippy::nursery, missing_docs)]
use super::*;
#[test]
fn no_override_runs_proposed() {
let r = resolve_approved_call(r#"{"path":"/etc/hosts"}"#, None);
assert_eq!(r.args_json, r#"{"path":"/etc/hosts"}"#);
}
#[test]
fn empty_edit_runs_proposed() {
for blank in ["", " ", "\n\t "] {
let over = ApprovalOverride {
modified_args_json: blank.to_owned(),
injected_context: String::new(),
};
let r = resolve_approved_call(r#"{"path":"/etc/hosts"}"#, Some(&over));
assert_eq!(
r.args_json, r#"{"path":"/etc/hosts"}"#,
"blank edit {blank:?} must fall back to the proposed args"
);
}
}
#[test]
fn non_empty_edit_runs_edited() {
let over = ApprovalOverride {
modified_args_json: r#"{"path":"/etc/hostname"}"#.to_owned(),
injected_context: String::new(),
};
let r = resolve_approved_call(r#"{"path":"/etc/shadow"}"#, Some(&over));
assert_eq!(
r.args_json, r#"{"path":"/etc/hostname"}"#,
"the approver's edit is what executes"
);
assert_eq!(r.injected_context, None);
}
#[test]
fn injected_context_resolves_independently_of_args() {
let over = ApprovalOverride {
modified_args_json: String::new(),
injected_context: "only touch files under src/".to_owned(),
};
let r = resolve_approved_call(r#"{"path":"a"}"#, Some(&over));
assert_eq!(r.args_json, r#"{"path":"a"}"#);
assert_eq!(
r.injected_context.as_deref(),
Some("only touch files under src/")
);
let blank = ApprovalOverride {
modified_args_json: String::new(),
injected_context: " \n".to_owned(),
};
assert_eq!(
resolve_approved_call("{}", Some(&blank)).injected_context,
None
);
}
}