diff --git a/Cargo.lock b/Cargo.lock index 3dffffb..026a394 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,7 +193,7 @@ dependencies = [ [[package]] name = "conductor" -version = "2.0.0" +version = "2.0.1" dependencies = [ "actix", "actix-rt", diff --git a/Cargo.toml b/Cargo.toml index 4f48522..75d184e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "conductor" -version = "2.0.0" +version = "2.0.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/definition.rs b/src/definition.rs index 1a129d9..9f1f722 100644 --- a/src/definition.rs +++ b/src/definition.rs @@ -28,6 +28,15 @@ impl From<&str> for Command { } } +impl Command { + pub fn is_empty(&self) -> bool { + match self { + Command::Multiple(v) => v.is_empty(), + Command::Single(v) => v.is_empty(), + } + } +} + impl std::fmt::Display for Command { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { @@ -98,7 +107,7 @@ impl Project { .flat_map(|jobs| jobs.to_vec()) .collect::>(); jobs.push(job); - Jobs::new(jobs) + Jobs::new(jobs.into_iter().filter(|t| !t.command.is_empty()).collect()) }) .or_else(|| { self.components.iter().find_map(|(c_name, component)| { @@ -137,7 +146,7 @@ impl Project { .flat_map(|jobs| jobs.to_vec()) .collect::>(); jobs.push(job); - Jobs::new(jobs) + Jobs::new(jobs.into_iter().filter(|t| !t.command.is_empty()).collect()) }) } else { None @@ -311,7 +320,7 @@ impl Default for Component { #[derive(Serialize, Deserialize, Default, Clone)] #[serde(default)] pub struct TaskDefinition { - pub description: String, + pub description: Option, /// A map of environment variables that are provided before running the task pub env: HashMap, /// The command(s) to execute when the task is launched @@ -329,6 +338,7 @@ impl From<&TaskDefinition> for Job { command: source.command.clone(), retry: false, keep_alive: false, + path: source.path.clone().unwrap_or_else(|| String::from(".")), retry_delay: 0, ..Default::default() } @@ -458,8 +468,7 @@ mod tests { assert_eq!(jobs.get(0).unwrap().name, "ui:build-ui"); assert_eq!(jobs.get(1).unwrap().name, "server:setup"); assert_eq!(jobs.get(2).unwrap().name, "server:build"); - assert_eq!(jobs.get(3).unwrap().name, "build"); - assert_eq!(jobs.len(), 4); + assert_eq!(jobs.len(), 3); } #[test] diff --git a/src/term.rs b/src/term.rs index 2eafe3d..5168e5c 100644 --- a/src/term.rs +++ b/src/term.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, fmt::Display}; use ansi_term::Color; -use crate::definition::{Group, Project}; +use crate::definition::{Group, Project, TaskDefinition}; pub fn header>(name: T, msg: &str) { let text = format!(" - --=[ {: <20} {: >20} ]=-- -", name.into(), msg); @@ -50,12 +50,13 @@ pub fn item_list(project: &Project) { if project.tasks.is_empty() && project.components.values().all(|c| c.tasks.is_empty()) { println!("{}", Color::White.dimmed().paint("no tasks defined")); } else { - for (name, _tasks) in sort_map(&project.tasks).iter() { - println!("{}", name); + for (name, task) in sort_map(&project.tasks).iter() { + print_task(name, task); } + for (c_name, component) in sort_map(&project.components).iter() { - for (t_name, _tasks) in sort_map(&component.tasks).iter() { - println!("{}:{}", c_name, t_name); + for (t_name, task) in sort_map(&component.tasks).iter() { + print_task(&format!("{}:{}", c_name, t_name), task); } } } @@ -70,6 +71,14 @@ where items } +fn print_task(name: &str, task: &TaskDefinition) { + if let Some(ref desc) = task.description { + println!("{: <31}{}", name, desc); + } else { + println!("{}", name); + } +} + fn print_group(name: &str, group: &Group) { if let Some(ref desc) = group.description { println!("{: <31}{}", name, desc);