refactor: abstract printer via Printer trait
All checks were successful
Test / test (push) Successful in 10s

This commit is contained in:
Paul Campbell 2024-09-21 18:25:42 +01:00
parent 5a1fedd94b
commit 5077452f20
7 changed files with 61 additions and 20 deletions

View file

@ -1,12 +1,15 @@
// //
use crate::model::Config; use crate::model::Config;
use crate::patterns::{issue_pattern, marker_pattern}; use crate::patterns::{issue_pattern, marker_pattern};
use crate::printer::Printer;
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use kxio::fs;
use kxio::network::Network;
pub fn init_config(net: kxio::network::Network) -> Result<Config, anyhow::Error> { pub fn init_config(printer: &impl Printer, net: Network) -> Result<Config> {
let config = Config::builder() let config = Config::builder()
.net(net) .net(net)
.fs(kxio::fs::new( .fs(fs::new(
std::env::var("GITHUB_WORKSPACE") std::env::var("GITHUB_WORKSPACE")
.context("GITHUB_WORKSPACE")? .context("GITHUB_WORKSPACE")?
.into(), .into(),
@ -18,9 +21,9 @@ pub fn init_config(net: kxio::network::Network) -> Result<Config, anyhow::Error>
.maybe_auth_token(std::env::var("REPO_TOKEN").ok()) .maybe_auth_token(std::env::var("REPO_TOKEN").ok())
.build(); .build();
println!("Repo: {}", config.repo()); printer.println(format!("Repo: {}", config.repo()));
println!("Prefix: {}", config.prefix_pattern()); printer.println(format!("Prefix: {}", config.prefix_pattern()));
println!("Issues: {}", config.issue_pattern()); printer.println(format!("Issues: {}", config.issue_pattern()));
Ok(config) Ok(config)
} }

View file

@ -2,12 +2,15 @@
use anyhow::{bail, Result}; use anyhow::{bail, Result};
use init::init_config; use init::init_config;
use issues::fetch_open_issues; use issues::fetch_open_issues;
use kxio::network::Network;
use printer::Printer;
use scanner::{find_markers, DefaultFileScanner}; use scanner::{find_markers, DefaultFileScanner};
mod init; mod init;
mod issues; mod issues;
mod model; mod model;
mod patterns; mod patterns;
mod printer;
mod scanner; mod scanner;
#[cfg(test)] #[cfg(test)]
@ -16,13 +19,15 @@ mod tests;
#[tokio::main] #[tokio::main]
#[cfg(not(tarpaulin_include))] #[cfg(not(tarpaulin_include))]
async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> { async fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
Ok(run(kxio::network::Network::new_real()).await?) use printer::StandardPrinter;
Ok(run(&StandardPrinter, Network::new_real()).await?)
} }
async fn run(net: kxio::network::Network) -> Result<()> { async fn run(printer: &impl Printer, net: Network) -> Result<()> {
println!("Forgejo TODO Checker!"); printer.println("Forgejo TODO Checker!");
let config = init_config(net)?; let config = init_config(printer, net)?;
let issues = fetch_open_issues(&config).await?; let issues = fetch_open_issues(&config).await?;
let markers = find_markers(&config, issues, &DefaultFileScanner)?; let markers = find_markers(&config, issues, &DefaultFileScanner)?;
@ -30,7 +35,7 @@ async fn run(net: kxio::network::Network) -> Result<()> {
for marker in (*markers).iter() { for marker in (*markers).iter() {
match marker { match marker {
model::Marker::Closed(_, _) | model::Marker::Invalid(_) => { model::Marker::Closed(_, _) | model::Marker::Invalid(_) => {
println!("{marker}"); printer.println("{marker}");
errors = true; errors = true;
} }
model::Marker::Unmarked | model::Marker::Valid(_, _) => {} model::Marker::Unmarked | model::Marker::Valid(_, _) => {}

11
src/printer.rs Normal file
View file

@ -0,0 +1,11 @@
//
pub trait Printer {
fn println(&self, message: impl Into<String>);
}
pub struct StandardPrinter;
impl Printer for StandardPrinter {
fn println(&self, message: impl Into<String>) {
println!("{}", message.into());
}
}

View file

@ -2,8 +2,10 @@
use super::*; use super::*;
use assert2::let_assert; use assert2::let_assert;
use kxio::network::Network;
use model::Config; use model::Config;
use patterns::{issue_pattern, marker_pattern}; use patterns::{issue_pattern, marker_pattern};
use printer::TestPrinter;
#[test] #[test]
fn init_when_all_valid() -> anyhow::Result<()> { fn init_when_all_valid() -> anyhow::Result<()> {
@ -13,7 +15,8 @@ fn init_when_all_valid() -> anyhow::Result<()> {
std::env::set_var("GITHUB_WORKSPACE", fs.base()); std::env::set_var("GITHUB_WORKSPACE", fs.base());
std::env::set_var("GITHUB_REPOSITORY", "repo"); std::env::set_var("GITHUB_REPOSITORY", "repo");
std::env::set_var("GITHUB_SERVER_URL", "server"); std::env::set_var("GITHUB_SERVER_URL", "server");
let net = kxio::network::Network::new_mock(); let net = Network::new_mock();
let printer = TestPrinter::default();
let expected = Config::builder() let expected = Config::builder()
.net(net.clone()) .net(net.clone())
.fs(kxio::fs::new(fs.base().to_path_buf())) .fs(kxio::fs::new(fs.base().to_path_buf()))
@ -25,7 +28,7 @@ fn init_when_all_valid() -> anyhow::Result<()> {
.build(); .build();
//when //when
let result = init_config(net)?; let result = init_config(&printer, net)?;
//then //then
assert_eq!(result.fs().base(), expected.fs().base()); assert_eq!(result.fs().base(), expected.fs().base());
@ -50,9 +53,10 @@ fn init_when_no_workspace() -> anyhow::Result<()> {
std::env::remove_var("GITHUB_WORKSPACE"); std::env::remove_var("GITHUB_WORKSPACE");
std::env::set_var("GITHUB_REPOSITORY", "repo"); std::env::set_var("GITHUB_REPOSITORY", "repo");
std::env::set_var("GITHUB_SERVER_URL", "server"); std::env::set_var("GITHUB_SERVER_URL", "server");
let printer = TestPrinter::default();
//when //when
let result = init_config(kxio::network::Network::new_mock()); let result = init_config(&printer, Network::new_mock());
//then //then
let_assert!(Err(e) = result); let_assert!(Err(e) = result);
@ -69,9 +73,10 @@ fn init_when_no_repository() -> anyhow::Result<()> {
std::env::set_var("GITHUB_WORKSPACE", fs.base()); std::env::set_var("GITHUB_WORKSPACE", fs.base());
std::env::remove_var("GITHUB_REPOSITORY"); std::env::remove_var("GITHUB_REPOSITORY");
std::env::set_var("GITHUB_SERVER_URL", "server"); std::env::set_var("GITHUB_SERVER_URL", "server");
let printer = TestPrinter::default();
//when //when
let result = init_config(kxio::network::Network::new_mock()); let result = init_config(&printer, Network::new_mock());
//then //then
let_assert!(Err(e) = result); let_assert!(Err(e) = result);
@ -88,9 +93,10 @@ fn init_when_no_server_url() -> anyhow::Result<()> {
std::env::set_var("GITHUB_WORKSPACE", fs.base()); std::env::set_var("GITHUB_WORKSPACE", fs.base());
std::env::set_var("GITHUB_REPOSITORY", "repo"); std::env::set_var("GITHUB_REPOSITORY", "repo");
std::env::remove_var("GITHUB_SERVER_URL"); std::env::remove_var("GITHUB_SERVER_URL");
let printer = TestPrinter::default();
//when //when
let result = init_config(kxio::network::Network::new_mock()); let result = init_config(&printer, Network::new_mock());
//then //then
let_assert!(Err(e) = result); let_assert!(Err(e) = result);

View file

@ -1,12 +1,13 @@
//
use super::*;
use std::sync::{LazyLock, Mutex}; use std::sync::{LazyLock, Mutex};
use model::Config; use model::Config;
use patterns::{issue_pattern, marker_pattern}; use patterns::{issue_pattern, marker_pattern};
//
use super::*;
mod init; mod init;
mod printer;
mod run; mod run;
mod scanner; mod scanner;

14
src/tests/printer.rs Normal file
View file

@ -0,0 +1,14 @@
//
use std::cell::RefCell;
use crate::printer::Printer;
#[derive(Default)]
pub struct TestPrinter {
pub messages: RefCell<Vec<String>>,
}
impl Printer for TestPrinter {
fn println(&self, message: impl Into<String>) {
self.messages.borrow_mut().push(message.into());
}
}

View file

@ -4,6 +4,7 @@ use super::*;
use anyhow::Result; use anyhow::Result;
use kxio::network::{RequestBody, RequestMethod, SavedRequest, StatusCode}; use kxio::network::{RequestBody, RequestMethod, SavedRequest, StatusCode};
use pretty_assertions::assert_eq; use pretty_assertions::assert_eq;
use printer::TestPrinter;
#[tokio::test] #[tokio::test]
async fn run_with_some_invalids() -> Result<()> { async fn run_with_some_invalids() -> Result<()> {
@ -29,7 +30,7 @@ async fn run_with_some_invalids() -> Result<()> {
std::env::set_var("GITHUB_SERVER_URL", "https://git.kemitix.net"); std::env::set_var("GITHUB_SERVER_URL", "https://git.kemitix.net");
//when //when
let result = run(net.clone().into()).await; let result = run(&TestPrinter::default(), net.clone().into()).await;
//then //then
assert!(result.is_err()); // there is an invalid file assert!(result.is_err()); // there is an invalid file
@ -66,7 +67,7 @@ async fn run_with_no_invalids() -> Result<()> {
std::env::set_var("GITHUB_SERVER_URL", "https://git.kemitix.net"); std::env::set_var("GITHUB_SERVER_URL", "https://git.kemitix.net");
//when //when
let result = run(net.clone().into()).await; let result = run(&TestPrinter::default(), net.clone().into()).await;
//then //then
assert!(result.is_ok()); // there is an invalid file assert!(result.is_ok()); // there is an invalid file