Skip to content

Commit 8543190

Browse files
committed
refactor: Tracker Checker: use clap and anyhow
1 parent 75a502f commit 8543190

File tree

3 files changed

+33
-48
lines changed

3 files changed

+33
-48
lines changed

src/checker/app.rs

+22-38
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,41 @@
1+
use std::path::PathBuf;
12
use std::sync::Arc;
23

4+
use anyhow::Context;
5+
use clap::Parser;
6+
37
use super::config::Configuration;
48
use super::console::Console;
5-
use super::service::{CheckError, Service};
9+
use super::service::{CheckResult, Service};
610
use crate::checker::config::parse_from_json;
711

8-
pub const NUMBER_OF_ARGUMENTS: usize = 2;
12+
#[derive(Parser, Debug)]
13+
#[clap(author, version, about, long_about = None)]
14+
struct Args {
15+
config_path: PathBuf,
16+
}
917

1018
/// # Errors
1119
///
12-
/// If some checks fails it will return a vector with all failing checks.
13-
///
14-
/// # Panics
15-
///
16-
/// Will panic if:
17-
///
18-
/// - It can't read the json configuration file.
19-
/// - The configuration file is invalid.
20-
pub async fn run() -> Result<(), Vec<CheckError>> {
21-
let args = parse_arguments();
22-
let config = setup_config(&args);
20+
/// Will return an error if it can't read or parse the configuration file.
21+
pub async fn run() -> anyhow::Result<Vec<CheckResult>> {
22+
let args = Args::parse();
23+
24+
let config = setup_config(&args)?;
25+
2326
let console_printer = Console {};
27+
2428
let service = Service {
2529
config: Arc::new(config),
2630
console: console_printer,
2731
};
2832

29-
service.run_checks().await
30-
}
31-
32-
pub struct Arguments {
33-
pub config_path: String,
34-
}
35-
36-
fn parse_arguments() -> Arguments {
37-
let args: Vec<String> = std::env::args().collect();
38-
39-
if args.len() < NUMBER_OF_ARGUMENTS {
40-
eprintln!("Usage: cargo run --bin tracker_checker <PATH_TO_CONFIG_FILE>");
41-
eprintln!("For example: cargo run --bin tracker_checker ./share/default/config/tracker_checker.json");
42-
std::process::exit(1);
43-
}
44-
45-
let config_path = &args[1];
46-
47-
Arguments {
48-
config_path: config_path.to_string(),
49-
}
33+
Ok(service.run_checks().await)
5034
}
5135

52-
fn setup_config(args: &Arguments) -> Configuration {
53-
let file_content = std::fs::read_to_string(args.config_path.clone())
54-
.unwrap_or_else(|_| panic!("Can't read config file {}", args.config_path));
36+
fn setup_config(args: &Args) -> anyhow::Result<Configuration> {
37+
let file_content =
38+
std::fs::read_to_string(&args.config_path).with_context(|| format!("can't read config file {:?}", args.config_path))?;
5539

56-
parse_from_json(&file_content).expect("Invalid config format")
40+
parse_from_json(&file_content).context("invalid config format")
5741
}

src/checker/config.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::error::Error;
12
use std::fmt;
23
use std::net::SocketAddr;
34

@@ -43,6 +44,8 @@ pub enum ConfigurationError {
4344
InvalidUrl(url::ParseError),
4445
}
4546

47+
impl Error for ConfigurationError {}
48+
4649
impl fmt::Display for ConfigurationError {
4750
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4851
match self {

src/checker/service.rs

+8-10
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ pub struct Service {
1414
pub(crate) console: Console,
1515
}
1616

17+
pub type CheckResult = Result<(), CheckError>;
18+
1719
#[derive(Debug)]
1820
pub enum CheckError {
1921
UdpError,
@@ -25,7 +27,7 @@ impl Service {
2527
/// # Errors
2628
///
2729
/// Will return OK is all checks pass or an array with the check errors.
28-
pub async fn run_checks(&self) -> Result<(), Vec<CheckError>> {
30+
pub async fn run_checks(&self) -> Vec<CheckResult> {
2931
self.console.println("Running checks for trackers ...");
3032

3133
self.check_udp_trackers();
@@ -50,23 +52,19 @@ impl Service {
5052
}
5153
}
5254

53-
async fn run_health_checks(&self) -> Result<(), Vec<CheckError>> {
55+
async fn run_health_checks(&self) -> Vec<CheckResult> {
5456
self.console.println("Health checks ...");
5557

56-
let mut check_errors = vec![];
58+
let mut check_results = vec![];
5759

5860
for health_check_url in &self.config.health_checks {
5961
match self.run_health_check(health_check_url.clone()).await {
60-
Ok(()) => {}
61-
Err(err) => check_errors.push(err),
62+
Ok(()) => check_results.push(Ok(())),
63+
Err(err) => check_results.push(Err(err)),
6264
}
6365
}
6466

65-
if check_errors.is_empty() {
66-
Ok(())
67-
} else {
68-
Err(check_errors)
69-
}
67+
check_results
7068
}
7169

7270
fn check_udp_tracker(&self, address: &SocketAddr) {

0 commit comments

Comments
 (0)