consolidate new() and parse() in PolicyParser

This commit is contained in:
kevin zhao
2025-11-12 17:53:15 -05:00
parent ff970d57fb
commit e51178cb27
3 changed files with 10 additions and 26 deletions

View File

@@ -47,6 +47,5 @@ fn load_policy(policy_path: &Path) -> Result<codex_execpolicy2::Policy> {
let content = fs::read_to_string(policy_path)
.with_context(|| format!("failed to read policy at {}", policy_path.display()))?;
let policy_source = policy_path.to_string_lossy();
let parser = PolicyParser::new(policy_source.as_ref(), &content);
Ok(parser.parse()?)
Ok(PolicyParser::parse(policy_source.as_ref(), &content)?)
}

View File

@@ -22,23 +22,14 @@ use crate::rule::PrefixPattern;
use crate::rule::PrefixRule;
use crate::rule::Rule;
pub struct PolicyParser {
policy_source: String,
unparsed_policy: String,
}
// todo: support parsing multiple policies
pub struct PolicyParser;
impl PolicyParser {
pub fn new(policy_source: &str, unparsed_policy: &str) -> Self {
Self {
policy_source: policy_source.to_string(),
unparsed_policy: unparsed_policy.to_string(),
}
}
pub fn parse(&self) -> Result<crate::policy::Policy> {
pub fn parse(policy_source: &str, unparsed_policy: &str) -> Result<crate::policy::Policy> {
let mut dialect = Dialect::Extended.clone();
dialect.enable_f_strings = true;
let ast = AstModule::parse(&self.policy_source, self.unparsed_policy.clone(), &dialect)
let ast = AstModule::parse(policy_source, unparsed_policy.to_string(), &dialect)
.map_err(|e| Error::Starlark(e.to_string()))?;
let globals = GlobalsBuilder::standard().with(policy_builtins).build();
let module = Module::new();

View File

@@ -21,9 +21,7 @@ prefix_rule(
pattern = ["git", "status"],
)
"#;
let policy = PolicyParser::new("test.codexpolicy", policy_src)
.parse()
.expect("parse policy");
let policy = PolicyParser::parse("test.codexpolicy", policy_src).expect("parse policy");
let cmd = tokens(&["git", "status"]);
let evaluation = policy.check(&cmd);
assert_eq!(
@@ -45,8 +43,7 @@ prefix_rule(
pattern = [["bash", "sh"], ["-c", "-l"]],
)
"#;
let parser = PolicyParser::new("test.codexpolicy", policy_src);
let policy = parser.parse().expect("parse policy");
let policy = PolicyParser::parse("test.codexpolicy", policy_src).expect("parse policy");
let bash_rules = policy.rules().get_vec("bash").expect("bash rules");
let sh_rules = policy.rules().get_vec("sh").expect("sh rules");
@@ -103,8 +100,7 @@ prefix_rule(
pattern = ["npm", ["i", "install"], ["--legacy-peer-deps", "--no-save"]],
)
"#;
let parser = PolicyParser::new("test.codexpolicy", policy_src);
let policy = parser.parse().expect("parse policy");
let policy = PolicyParser::parse("test.codexpolicy", policy_src).expect("parse policy");
let rules = policy.rules().get_vec("npm").expect("npm rules");
assert_eq!(
@@ -162,8 +158,7 @@ prefix_rule(
],
)
"#;
let parser = PolicyParser::new("test.codexpolicy", policy_src);
let policy = parser.parse().expect("parse policy");
let policy = PolicyParser::parse("test.codexpolicy", policy_src).expect("parse policy");
let match_eval = policy.check(&tokens(&["git", "status"]));
assert_eq!(
Evaluation::Match {
@@ -201,8 +196,7 @@ prefix_rule(
decision = "forbidden",
)
"#;
let parser = PolicyParser::new("test.codexpolicy", policy_src);
let policy = parser.parse().expect("parse policy");
let policy = PolicyParser::parse("test.codexpolicy", policy_src).expect("parse policy");
let status = policy.check(&tokens(&["git", "status"]));
assert_eq!(