salt 0.2.3

Task management for the CLI
use crate::get_and_parse;
use crate::task;
use colored::*;
use serde::{Deserialize, Serialize};
use std::io::Error;

#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct Node {
	pub name: String,
	pub tasks: Vec<task::Task>,
	pub next_id: i32,
}

pub fn get_node(name: &str) -> anyhow::Result<Node> {
	let nodes = get_and_parse::read(get_and_parse::file_path())?;
	let node = nodes
		.nodes
		.into_iter()
		.find(|node| node.name.to_lowercase() == name.to_lowercase());
	if let Some(n) = node {
		Ok(n)
	} else {
		Err(anyhow::Error::new(Error::new(
			std::io::ErrorKind::InvalidInput,
			format!("No node with name `{}` was found", name),
		)))
	}
}

pub fn display_node(node: Node, show_hidden: bool) -> String {
	let name = node.name.truecolor(246, 105, 194).bold().to_string();
	let tasks_size = format!(
		"{}{}{}",
		"[".yellow().to_string(),
		node.tasks
			.iter()
			.filter(|task| if show_hidden { true } else { !task.checked })
			.count()
			.to_string()
			.blue()
			.to_string(),
		"]".yellow().to_string()
	);
	let tasks = node
		.tasks
		.iter()
		.filter(|task| if show_hidden { true } else { !task.checked })
		.map(|task| task::display_task(task))
		.collect::<Vec<_>>()
		.join("\n  └─> ");
	format!(
		"{} {}\n {}\n  └─> {}",
		name,
		tasks_size,
		"Tasks".bold().truecolor(113, 247, 159).to_string(),
		tasks
	)
}