diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-01-27 23:06:44 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-01-27 23:06:44 +0100 |
commit | 8e0ff0e22fc32af2e20c4c4d07a8c4cf11e0e860 (patch) | |
tree | 70777d5ee35d85bb8cf12b255c27dea2d62aa783 /src | |
parent | ec77d46f11e4d573b69b40101ed85dc247322c18 (diff) | |
download | rebel-8e0ff0e22fc32af2e20c4c4d07a8c4cf11e0e860.tar rebel-8e0ff0e22fc32af2e20c4c4d07a8c4cf11e0e860.zip |
resolve: more idiomatic error formatting
Diffstat (limited to 'src')
-rw-r--r-- | src/resolve.rs | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/src/resolve.rs b/src/resolve.rs index 95b798a..f3ad284 100644 --- a/src/resolve.rs +++ b/src/resolve.rs @@ -4,23 +4,12 @@ use std::fmt; use crate::types::*; #[derive(Debug)] -pub enum Error { - TaskNotFound(Vec<TaskRef>), - DependencyCycle(Vec<TaskRef>), -} +pub struct DepChain(pub Vec<TaskRef>); -impl Error { - fn extend(&mut self, task: TaskRef) { - let tasks = match self { - Error::TaskNotFound(ref mut tasks) => tasks, - Error::DependencyCycle(ref mut tasks) => tasks, - }; - tasks.push(task); - } - - fn write_tasks(f: &mut fmt::Formatter, tasks: &Vec<TaskRef>) -> fmt::Result { +impl fmt::Display for DepChain { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut first = true; - for task in tasks.iter().rev() { + for task in self.0.iter().rev() { if !first { write!(f, " -> ")?; } @@ -33,19 +22,32 @@ impl Error { } } +#[derive(Debug)] +pub enum Error { + TaskNotFound(DepChain), + DependencyCycle(DepChain), +} + +impl Error { + fn extend(&mut self, task: TaskRef) { + let tasks = match self { + Error::TaskNotFound(ref mut tasks) => tasks, + Error::DependencyCycle(ref mut tasks) => tasks, + }; + tasks.0.push(task); + } +} + impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let tasks = match self { + match self { Error::TaskNotFound(tasks) => { - write!(f, "Task not found: ")?; - tasks + write!(f, "Task not found: {}", tasks) } Error::DependencyCycle(tasks) => { - write!(f, "Dependency Cycle: ")?; - tasks + write!(f, "Dependency Cycle: {}", tasks) } - }; - Error::write_tasks(f, tasks) + } } } @@ -80,14 +82,14 @@ impl<'a> Resolver<'a> { pub fn add_task(&mut self, task: &TaskRef) -> Vec<Error> { match self.resolve_state.get(task) { Some(ResolveState::Resolving) => { - return vec![Error::DependencyCycle(vec![task.clone()])] + return vec![Error::DependencyCycle(DepChain(vec![task.clone()]))] } Some(ResolveState::Resolved) => return vec![], None => (), } let task_def = match self.tasks.get(task) { - None => return vec![Error::TaskNotFound(vec![task.clone()])], + None => return vec![Error::TaskNotFound(DepChain(vec![task.clone()]))], Some(task_def) => task_def, }; |