cedar_policy_cli/command/
check_parse.rs1use std::{path::PathBuf, str::FromStr};
18
19use cedar_policy::Expression;
20use clap::Args;
21use miette::Report;
22
23use crate::{load_entities, CedarExitCode, OptionalPoliciesArgs, OptionalSchemaArgs, PoliciesArgs};
24
25#[derive(Args, Debug)]
26pub struct CheckParseArgs {
27 #[command(flatten)]
29 pub policies: OptionalPoliciesArgs,
30 #[arg(long)]
32 pub expression: Option<String>,
33 #[command(flatten)]
35 pub schema: OptionalSchemaArgs,
36 #[arg(long = "entities", value_name = "FILE")]
38 pub entities_file: Option<PathBuf>,
39}
40
41pub fn check_parse(args: &CheckParseArgs) -> CedarExitCode {
42 if args.policies.policies_file.is_none()
45 && args.schema.schema_file.is_none()
46 && args.entities_file.is_none()
47 && args.expression.is_none()
48 {
49 let pargs = PoliciesArgs {
50 policies_file: None, policy_format: args.policies.policy_format,
52 template_linked_file: args.policies.template_linked_file.clone(),
53 };
54 match pargs.get_policy_set() {
55 Ok(_) => return CedarExitCode::Success,
56 Err(e) => {
57 println!("{e:?}");
58 return CedarExitCode::Failure;
59 }
60 }
61 }
62
63 #[expect(
64 clippy::useless_let_if_seq,
65 reason = "exit_code is mutated by later expressions"
66 )]
67 let mut exit_code = CedarExitCode::Success;
68 if let Err(e) = args.policies.get_policy_set() {
69 println!("{e:?}");
70 exit_code = CedarExitCode::Failure;
71 }
72 if let Some(e) = args
73 .expression
74 .as_ref()
75 .and_then(|expr| Expression::from_str(expr).err())
76 {
77 println!("{:?}", Report::new(e));
78 exit_code = CedarExitCode::Failure;
79 }
80 let schema = match args.schema.get_schema() {
81 Ok(schema) => schema,
82 Err(e) => {
83 println!("{e:?}");
84 exit_code = CedarExitCode::Failure;
85 None
86 }
87 };
88 if let Some(e) = args
89 .entities_file
90 .as_ref()
91 .and_then(|e| load_entities(e, schema.as_ref()).err())
92 {
93 println!("{e:?}");
94 exit_code = CedarExitCode::Failure;
95 }
96 exit_code
97}