Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

expose policy info from the engine #255

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions src/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,61 @@ impl Engine {
.collect()
}

pub fn get_packages_texts(&self) -> Result<Map<String, String>> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that these APIs are public, they would need to be documented as well as tested via doc tests.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For my own understanding, what is the use of such an that maps filenames to package names?

let mut packages_text: Map<String, String> = Map::new();

for module in &self.modules {
let path_string = Interpreter::get_path_string(&module.package.refr, Some("data"))?;
let package_text = module.package.span.text().to_string();
packages_text.insert(path_string, package_text);
}

Ok(packages_text)
}

pub fn get_packages_imports(&self) -> Result<Map<String, Vec<String>>> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that there is also a as part:

import data.x as y

let mut packages_imports: Map<String, Vec<String>> = Map::new();

for module in &self.modules {
let path_string = Interpreter::get_path_string(&module.package.refr, Some("data"))?;
let import_strings: Result<Vec<String>> = module
.imports
.iter()
.map(|import| Ok(import.span.text().to_string()))
.collect();
packages_imports.insert(path_string, import_strings?);
}

Ok(packages_imports)
}

pub fn get_packages_policies(&self) -> Result<Map<String, Vec<String>>> {
let mut packages_policies: Map<String, Vec<String>> = Map::new();

for module in &self.modules {
let path_string = Interpreter::get_path_string(&module.package.refr, Some("data"))?;
let policy_strings: Result<Vec<String>> = module
.policy
.iter()
.map(|policy| Ok(policy.span().text().to_string()))
.collect();
packages_policies.insert(path_string, policy_strings?);
}

Ok(packages_policies)
}

pub fn get_package_rego_v1(&self) -> Result<Map<String, bool>> {
let mut packages_rego_v1s: Map<String, bool> = Map::new();

for module in &self.modules {
let path_string = Interpreter::get_path_string(&module.package.refr, Some("data"))?;
packages_rego_v1s.insert(path_string, module.rego_v1);
}

Ok(packages_rego_v1s)
}

/// Set the input document.
///
/// * `input`: Input documented. Typically this [Value] is constructed from JSON or YAML.
Expand Down