summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-01-27 23:06:44 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-01-27 23:06:44 +0100
commit8e0ff0e22fc32af2e20c4c4d07a8c4cf11e0e860 (patch)
tree70777d5ee35d85bb8cf12b255c27dea2d62aa783 /src
parentec77d46f11e4d573b69b40101ed85dc247322c18 (diff)
downloadrebel-8e0ff0e22fc32af2e20c4c4d07a8c4cf11e0e860.tar
rebel-8e0ff0e22fc32af2e20c4c4d07a8c4cf11e0e860.zip
resolve: more idiomatic error formatting
Diffstat (limited to 'src')
-rw-r--r--src/resolve.rs50
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,
};