Skip to content

Commit

Permalink
[Code Quality]: default implementation for reader and writer (#461)
Browse files Browse the repository at this point in the history
* misc tweaks

* changing commands except for completions to be public, so they can be used once built

* adding some new helper methods for reader, and writer to reduce verbosity
  • Loading branch information
joshfried-aws committed Feb 16, 2024
1 parent ec7f760 commit ac0fa41
Show file tree
Hide file tree
Showing 10 changed files with 112 additions and 94 deletions.
6 changes: 2 additions & 4 deletions guard/src/commands/rulegen_tests.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::commands::rulegen;
use crate::utils::writer::WriteBuffer;
use crate::utils::writer::Writer;
use pretty_assertions::assert_eq;
use std::io::{stderr, stdout};

#[test]
fn test_rulegen() {
Expand Down Expand Up @@ -31,7 +29,7 @@ fn test_rulegen() {
"#,
);

let mut writer = Writer::new(WriteBuffer::Stdout(stdout()), WriteBuffer::Stderr(stderr()));
let mut writer = Writer::default();
let generated_rules = rulegen::parse_template_and_call_gen(&data, &mut writer);

assert_eq!(1, generated_rules.len());
Expand Down Expand Up @@ -62,7 +60,7 @@ fn test_rulegen_no_properties() {
"#,
);

let mut writer = Writer::new(WriteBuffer::Stdout(stdout()), WriteBuffer::Stderr(stderr()));
let mut writer = Writer::default();
let generated_rules = rulegen::parse_template_and_call_gen(&data, &mut writer);

assert_eq!(0, generated_rules.len());
Expand Down
11 changes: 5 additions & 6 deletions guard/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ mod utils;

use crate::commands::{CfnGuard, Commands};
use crate::utils::reader::{ReadBuffer, Reader};
use crate::utils::writer::WriteBuffer::Stderr;
use crate::utils::writer::{WriteBuffer::File as WBFile, WriteBuffer::Stdout, Writer};
use clap::Parser;
use rules::errors::Error;
Expand All @@ -16,14 +15,14 @@ fn main() -> Result<(), Error> {

let mut writer = match &args.command {
Commands::ParseTree(cmd) => match &cmd.output {
Some(path) => Writer::new(WBFile(File::create(path)?), Stderr(std::io::stderr())),
None => Writer::new(Stdout(std::io::stdout()), Stderr(std::io::stderr())),
Some(path) => Writer::new(WBFile(File::create(path)?)),
None => Writer::new(Stdout(std::io::stdout())),
},
Commands::Rulegen(cmd) => match &cmd.output {
Some(path) => Writer::new(WBFile(File::create(path)?), Stderr(std::io::stderr())),
None => Writer::new(Stdout(std::io::stdout()), Stderr(std::io::stderr())),
Some(path) => Writer::new(WBFile(File::create(path)?)),
None => Writer::new(Stdout(std::io::stdout())),
},
_ => Writer::new(Stdout(std::io::stdout()), Stderr(std::io::stderr())),
_ => Writer::new(Stdout(std::io::stdout())),
};

let mut reader = Reader::new(ReadBuffer::Stdin(std::io::stdin()));
Expand Down
4 changes: 1 addition & 3 deletions guard/src/rules/eval_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ use grep_searcher::SearcherBuilder;
use indoc::formatdoc;
use pretty_assertions::{assert_eq, assert_ne};
use std::collections::HashMap;
use std::io::{stderr, stdout};

use crate::rules::eval_context::eval_context_tests::BasicQueryTesting;
use crate::rules::eval_context::{root_scope, EventRecord, RecordTracker};
use crate::utils::writer::WriteBuffer::{Stderr, Stdout};

use super::*;

Expand Down Expand Up @@ -3892,7 +3890,7 @@ fn parameterized_evaluations() -> Result<()> {
let mut eval = root_scope(&rules_files, Rc::new(template));
let status = eval_rules_file(&rules_files, &mut eval, None)?;
let top = eval.reset_recorder().extract();
let mut writer = Writer::new(Stdout(stdout()), Stderr(stderr()));
let mut writer = Writer::default();
crate::commands::validate::print_verbose_tree(&top, &mut writer);
assert_eq!(status, Status::FAIL);

Expand Down
8 changes: 8 additions & 0 deletions guard/src/utils/reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ pub struct Reader {
inner: ReadBuffer,
}

impl Default for Reader {
fn default() -> Self {
Self {
inner: ReadBuffer::Stdin(std::io::stdin()),
}
}
}

impl Read for Reader {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
match &mut self.inner {
Expand Down
22 changes: 21 additions & 1 deletion guard/src/utils/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,28 @@ pub struct Writer {
err: WriteBuffer,
}

impl Default for Writer {
fn default() -> Self {
Self {
buffer: WriteBuffer::Stdout(std::io::stdout()),
err: WriteBuffer::Stderr(std::io::stderr()),
}
}
}

impl Writer {
pub fn new(buffer: WriteBuffer, err: WriteBuffer) -> Self {
pub fn new(buffer: WriteBuffer) -> Self {
if let WriteBuffer::Stderr(_) = buffer {
panic!("unable to use stderr as regular buffer");
}

Self {
buffer,
err: WriteBuffer::Stderr(std::io::stderr()),
}
}

pub fn new_with_err(buffer: WriteBuffer, err: WriteBuffer) -> Self {
if let WriteBuffer::Stderr(_) = buffer {
panic!("unable to use stderr as regular buffer");
}
Expand Down
17 changes: 8 additions & 9 deletions guard/tests/parse_tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ pub(crate) mod utils;
#[cfg(test)]
mod parse_tree_tests {
use cfn_guard::commands::{PRINT_JSON, PRINT_YAML, RULES};
use cfn_guard::utils::reader::ReadBuffer::Stdin;
use cfn_guard::utils::reader::Reader;
use cfn_guard::utils::writer::{WriteBuffer::Vec as WBVec, Writer};
use pretty_assertions::assert_eq;
Expand Down Expand Up @@ -72,8 +71,8 @@ mod parse_tree_tests {

#[test]
fn test_json_output() {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = ParseTreeTestRunner::default()
.print_json()
.rules("validate/rules-dir/s3_bucket_server_side_encryption_enabled.guard")
Expand Down Expand Up @@ -111,8 +110,8 @@ mod parse_tree_tests {
#[case] expected_writer_output: &str,
#[case] expected_status_code: i32,
) {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = ParseTreeTestRunner::default()
.rules(rules_arg)
.run(&mut writer, &mut reader);
Expand All @@ -131,8 +130,8 @@ mod parse_tree_tests {
#[case] rules_arg: &str,
#[case] expected_status_code: i32,
) {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new_with_err(WBVec(vec![]), WBVec(vec![]));
let status_code = ParseTreeTestRunner::default()
.rules(rules_arg)
.run(&mut writer, &mut reader);
Expand Down Expand Up @@ -169,8 +168,8 @@ mod parse_tree_tests {
#[case] expected_writer_output: &str,
#[case] expected_status_code: i32,
) {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = ParseTreeTestRunner::default()
.rules(rules_arg)
.run(&mut writer, &mut reader);
Expand Down
6 changes: 2 additions & 4 deletions guard/tests/rulegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ pub(crate) mod utils;
mod rulegen_tests {
use crate::assert_output_from_file_eq;
use cfn_guard::commands::{OUTPUT, TEMPLATE};
use cfn_guard::utils::reader::ReadBuffer::Stdin;
use cfn_guard::utils::reader::Reader;
use cfn_guard::utils::writer::WriteBuffer::Stderr;
use cfn_guard::utils::writer::{WriteBuffer::Vec as WBVec, Writer};
use pretty_assertions::assert_eq;

Expand Down Expand Up @@ -67,8 +65,8 @@ mod rulegen_tests {
#[case] expected_output_file_path: &str,
#[case] expected_status_code: i32,
) {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), Stderr(std::io::stderr()));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = RulegenTestRunner::default()
.template(template_arg)
.run(&mut writer, &mut reader);
Expand Down
45 changes: 22 additions & 23 deletions guard/tests/test_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ mod test_command_tests {
ALPHABETICAL, DIRECTORY, LAST_MODIFIED, OUTPUT_FORMAT, RULES_AND_TEST_FILE, RULES_FILE,
TEST_DATA, VERBOSE,
};
use cfn_guard::utils::reader::ReadBuffer::Stdin;
use cfn_guard::utils::reader::Reader;
use cfn_guard::utils::writer::{WriteBuffer::Vec as WBVec, Writer};
use cfn_guard::Error;
Expand Down Expand Up @@ -134,8 +133,8 @@ mod test_command_tests {
#[case("json")]
#[case("yaml")]
fn test_data_file_with_shorthand_reference(#[case] file_type: &str) -> Result<(), Error> {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Some(&format!(
"resources/test-command/data-dir/s3_bucket_logging_enabled_tests.{}",
Expand All @@ -159,8 +158,8 @@ mod test_command_tests {
#[case("json")]
#[case("yaml")]
fn test_data_file(#[case] file_type: &str) -> Result<(), Error> {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Some(&format!(
"resources/test-command/data-dir/s3_bucket_server_side_encryption_enabled.{}",
Expand All @@ -182,8 +181,8 @@ mod test_command_tests {

#[test]
fn test_parse_error_when_guard_rule_has_syntax_error() {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Some("resources/test-command/data-dir/test.yaml"))
.rules(Some("resources/test-command/rule-dir/invalid_rule.guard"))
Expand All @@ -203,8 +202,8 @@ mod test_command_tests {

#[test]
fn test_parse_error_when_file_dne() {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new_with_err(WBVec(vec![]), WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Some("resources/test-command/data-dir/test.yaml"))
.rules(Some("/resources/test-command/data-dir/invalid_rule.guard"))
Expand All @@ -221,8 +220,8 @@ mod test_command_tests {

#[test]
fn test_data_file_verbose() -> Result<(), Error> {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Some(
"resources/test-command/data-dir/s3_bucket_server_side_encryption_enabled.yaml",
Expand All @@ -244,8 +243,8 @@ mod test_command_tests {

#[test]
fn test_with_rules_dir_verbose() {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.directory(Option::from("resources/test-command/dir"))
.directory_only()
Expand All @@ -264,8 +263,8 @@ mod test_command_tests {
#[case("yaml")]
#[case("junit")]
fn test_structured_single_report(#[case] output: &str) {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Option::from(
"resources/test-command/data-dir/s3_bucket_server_side_encryption_enabled.yaml",
Expand Down Expand Up @@ -295,8 +294,8 @@ mod test_command_tests {
#[case("yaml")]
#[case("junit")]
fn test_structured_directory_report(#[case] output: &str) {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.directory(Option::from("resources/test-command/dir"))
.output_format(output)
Expand All @@ -320,8 +319,8 @@ mod test_command_tests {
#[case("json")]
#[case("yaml")]
fn test_structured_report_with_illegal_args(#[case] output: &str) {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.directory(Option::from("resources/test-command/dir"))
.output_format(output)
Expand All @@ -333,8 +332,8 @@ mod test_command_tests {

#[test]
fn test_with_function_expr() {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Option::from(
"resources/test-command/functions/data/template.yaml",
Expand All @@ -350,8 +349,8 @@ mod test_command_tests {

#[test]
fn test_with_failure() {
let mut reader = Reader::new(Stdin(std::io::stdin()));
let mut writer = Writer::new(WBVec(vec![]), WBVec(vec![]));
let mut reader = Reader::default();
let mut writer = Writer::new(WBVec(vec![]));
let status_code = TestCommandTestRunner::default()
.test_data(Option::from(
"resources/test-command/data-dir/failing_test.yaml",
Expand Down
2 changes: 1 addition & 1 deletion guard/tests/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ pub fn sanitize_junit_writer(writer: Writer) -> Writer {
let rgx = Regex::new(r#"time="\d+""#).unwrap();
let res = rgx.replace_all(&buf, r#"time="0""#);

Writer::new(WBVec(res.as_bytes().to_vec()), WBVec(vec![]))
Writer::new(WBVec(res.as_bytes().to_vec()))
}

pub fn get_full_path_for_resource_file(path: &str) -> String {
Expand Down

0 comments on commit ac0fa41

Please sign in to comment.