add custom errors

This commit is contained in:
rmanach 2023-04-18 22:34:37 +02:00
parent 6d26f1032d
commit a1900c7858
8 changed files with 60 additions and 15 deletions

10
src/error/handler.rs Normal file
View File

@ -0,0 +1,10 @@
use thiserror::Error;
#[allow(dead_code)]
#[derive(Error, Debug)]
pub enum HandlerError {
#[error("error while handling message")]
MessageError,
#[error("unknown handler error")]
Unknown,
}

View File

@ -1,3 +1,7 @@
mod handler;
mod runner;
mod storer; mod storer;
pub use handler::HandlerError;
pub use runner::RunnerError;
pub use storer::StorerError; pub use storer::StorerError;

12
src/error/runner.rs Normal file
View File

@ -0,0 +1,12 @@
use thiserror::Error;
#[allow(dead_code)]
#[derive(Error, Debug)]
pub enum RunnerError {
#[error("error while deploying")]
DeployError,
#[error("error while checking")]
CheckError,
#[error("unknown handler error")]
Unknown,
}

View File

@ -35,8 +35,7 @@ fn main() {
} }
let wait = time::Duration::from_millis(100); let wait = time::Duration::from_millis(100);
while !deployer.healthcheck(WorkerStatus::Stopped) {
while !deployer.healthcheck(WorkerStatus::Pending) {
thread::sleep(wait); thread::sleep(wait);
} }

View File

@ -1,7 +1,7 @@
use std::{thread, time}; use std::{thread, time};
use super::{Runner, RunnerStatus, Storer}; use super::{Runner, RunnerStatus, Storer};
use crate::error::StorerError; use crate::error::{RunnerError, StorerError};
use crate::message::Message; use crate::message::Message;
#[derive(Debug)] #[derive(Debug)]
@ -29,7 +29,7 @@ impl Job {
} }
} }
fn deploy_megaport(&mut self) -> Result<Message, String> { fn deploy_megaport(&mut self) -> Result<Message, RunnerError> {
self.set_status(RunnerStatus::Running); self.set_status(RunnerStatus::Running);
println!( println!(
"[job({} - {:?} - {:?})] deploying megaport...", "[job({} - {:?} - {:?})] deploying megaport...",
@ -48,7 +48,7 @@ impl Job {
Ok(Message::check_deploy(self.id.try_into().unwrap(), "")) Ok(Message::check_deploy(self.id.try_into().unwrap(), ""))
} }
fn check_megaport(&mut self) -> Result<Message, String> { fn check_megaport(&mut self) -> Result<Message, RunnerError> {
self.set_status(RunnerStatus::Running); self.set_status(RunnerStatus::Running);
println!( println!(
"[job({} - {:?} - {:?})] checking megaport...", "[job({} - {:?} - {:?})] checking megaport...",
@ -73,7 +73,7 @@ impl Job {
} }
impl Runner for Job { impl Runner for Job {
fn run(&mut self) -> Result<Message, String> { fn run(&mut self) -> Result<Message, RunnerError> {
match self.action { match self.action {
JobAction::MegaportDeploy => self.deploy_megaport(), JobAction::MegaportDeploy => self.deploy_megaport(),
JobAction::MegaportUndeploy => todo!(), JobAction::MegaportUndeploy => todo!(),

View File

@ -1,4 +1,4 @@
use crate::error::StorerError; use crate::error::{RunnerError, StorerError};
use crate::message::Message; use crate::message::Message;
#[derive(Debug)] #[derive(Debug)]
@ -11,7 +11,7 @@ pub enum RunnerStatus {
} }
pub trait Runner { pub trait Runner {
fn run(&mut self) -> Result<Message, String>; fn run(&mut self) -> Result<Message, RunnerError>;
} }
pub trait Storer { pub trait Storer {

View File

@ -1,11 +1,12 @@
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use crate::error::{HandlerError, RunnerError};
use crate::message::Message; use crate::message::Message;
use crate::model::{Job, JobAction}; use crate::model::{Job, JobAction};
pub trait Handler { pub trait Handler {
fn handle(&self, res: Result<Message, String>); fn handle(&self, res: Result<Message, RunnerError>) -> Result<(), HandlerError>;
} }
pub struct CheckHandler {} pub struct CheckHandler {}
@ -14,12 +15,19 @@ impl CheckHandler {
pub fn new() -> Self { pub fn new() -> Self {
Self {} Self {}
} }
fn manage_message(&self, message: Message) -> Result<(), HandlerError> {
match message {
Message::CheckDeploy(_body) => Ok(()),
Message::StopManager => Err(HandlerError::Unknown),
}
}
} }
impl Handler for CheckHandler { impl Handler for CheckHandler {
fn handle(&self, res: Result<Message, String>) { fn handle(&self, res: Result<Message, RunnerError>) -> Result<(), HandlerError> {
match res { match res {
Ok(_m) => (), Ok(m) => self.manage_message(m),
Err(_e) => todo!(), Err(_e) => todo!(),
} }
} }
@ -34,7 +42,7 @@ impl DeployHandler {
Self { sender } Self { sender }
} }
fn manage_message(&self, message: Message) { fn manage_message(&self, message: Message) -> Result<(), HandlerError> {
match message { match message {
Message::CheckDeploy(body) => { Message::CheckDeploy(body) => {
let guard = self.sender.lock().unwrap(); let guard = self.sender.lock().unwrap();
@ -43,14 +51,16 @@ impl DeployHandler {
if let Err(e) = guard.send(Job::new(id, JobAction::MegaportCheckDeploy)) { if let Err(e) = guard.send(Job::new(id, JobAction::MegaportCheckDeploy)) {
println!("[handler(deploy)] error: {}", e); println!("[handler(deploy)] error: {}", e);
} }
Ok(())
} }
Message::StopManager => todo!(), Message::StopManager => Err(HandlerError::Unknown),
} }
} }
} }
impl Handler for DeployHandler { impl Handler for DeployHandler {
fn handle(&self, res: Result<Message, String>) { fn handle(&self, res: Result<Message, RunnerError>) -> Result<(), HandlerError> {
match res { match res {
Ok(m) => self.manage_message(m), Ok(m) => self.manage_message(m),
Err(_e) => todo!(), Err(_e) => todo!(),

View File

@ -4,6 +4,7 @@ use std::sync::{mpsc::Receiver, Arc, Condvar, Mutex};
use std::thread; use std::thread;
use super::handler::Handler; use super::handler::Handler;
use crate::error::HandlerError;
use crate::model::*; use crate::model::*;
pub struct Queue<T> { pub struct Queue<T> {
@ -26,6 +27,7 @@ pub enum WorkerStatus {
Pending, Pending,
Running, Running,
Failed, Failed,
Stopped,
} }
struct Worker { struct Worker {
@ -95,7 +97,15 @@ impl<T: Runner + Send + 'static> Manager<T> {
drop(guard); drop(guard);
Manager::<T>::set_worker_status(&worker, WorkerStatus::Running); Manager::<T>::set_worker_status(&worker, WorkerStatus::Running);
handler.handle(runner.run()); if let Err(e) = handler.handle(runner.run()) {
match e {
HandlerError::Unknown => {
Manager::<T>::set_worker_status(&worker, WorkerStatus::Failed);
break;
}
_ => (),
}
}
Manager::<T>::set_worker_status(&worker, WorkerStatus::Pending); Manager::<T>::set_worker_status(&worker, WorkerStatus::Pending);
}); });
} }