From 6aa95d1549283a199cda1020704d7237ef6621a9 Mon Sep 17 00:00:00 2001
From: theMackabu <theMackabu@gmail.com>
Date: Sun, 24 Nov 2024 22:44:36 -0800
Subject: [PATCH] revamp info command

---
 maid/client/cli/mod.rs       | 64 ++++++++++++++++++++++++------------
 maid/client/main.rs          |  2 +-
 maid/shared/models/client.rs |  2 +-
 3 files changed, 45 insertions(+), 23 deletions(-)

diff --git a/maid/client/cli/mod.rs b/maid/client/cli/mod.rs
index fb24243..70ce1d2 100644
--- a/maid/client/cli/mod.rs
+++ b/maid/client/cli/mod.rs
@@ -6,7 +6,7 @@ use crate::parse;
 use crate::server;
 use crate::task;
 
-use maid::models::client::{Cache, CacheConfig, Task};
+use maid::models::client::{Cache, CacheConfig, Project, Task};
 use maid::{helpers, log::prelude::*};
 
 use fs_extra::dir::get_size;
@@ -28,32 +28,54 @@ pub fn get_version(short: bool) -> String {
 }
 
 pub fn info(path: &String) {
-    let values = parse::merge(path);
+    let values = parse::merge(path).project;
     let project_root = parse::file::find_maidfile_root(path);
 
-    let name = match &values.project {
-        Some(project) => match project.name.clone() {
-            Some(name) => name,
-            None => string!("none"),
-        },
-        None => string!("none"),
+    let project_name = match values.to_owned() {
+        Some(project) => project.name,
+        None => Project::default().name,
+    };
+
+    let project_version = match values.to_owned() {
+        Some(project) => project.version,
+        None => Project::default().version,
+    };
+
+    match project_name {
+        Some(name) => info!("Project {name} info\n"),
+        None => info!("Project info\n"),
     };
 
-    let version = match &values.project {
-        Some(project) => match project.version.clone() {
-            Some(version) => version,
-            None => string!("none"),
-        },
-        None => string!("none"),
+    match project_version {
+        Some(version) => println!(
+            "{}\n{}",
+            format!("{}: {}", "Version".white(), version.bright_yellow()),
+            format!("{}: {}", "Directory".white(), project_root.to_string_lossy().bright_yellow())
+        ),
+        None => println!("{}", format!("{}: {}", "Directory".white(), project_root.to_string_lossy().bright_yellow())),
     };
+}
+
+pub fn env(path: &String) {
+    let values = parse::merge(path);
 
-    println!(
-        "{}\n{}\n{}\n{}",
-        "Project Info".green().bold(),
-        format!(" {}: {}", "- Name".white(), name.bright_yellow()),
-        format!(" {}: {}", "- Version".white(), version.bright_yellow()),
-        format!(" {}: {}", "- Project".white(), project_root.to_string_lossy().bright_yellow())
-    );
+    let project_name = match values.project {
+        Some(project) => project.name,
+        None => Project::default().name,
+    };
+
+    if let Some(env) = values.env {
+        match project_name {
+            Some(name) => info!("ENV for {name}\n"),
+            None => info!("ENV for this project\n"),
+        };
+
+        for (key, value) in env {
+            println!("{}{}{value}", key.bright_cyan(), "=".white())
+        }
+    } else {
+        error!("No ENV values defined for this project")
+    }
 }
 
 pub fn exec(task: &str, args: &Vec<String>, path: &String, silent: bool, is_dep: bool, is_remote: bool, log_level: Option<tracing::Level>, force: bool) {
diff --git a/maid/client/main.rs b/maid/client/main.rs
index 4c7f0ed..19a8ae1 100644
--- a/maid/client/main.rs
+++ b/maid/client/main.rs
@@ -124,7 +124,7 @@ fn main() {
     if let Some(project) = cli.project {
         return match project {
             Project::Info => cli::info(&cli.path), // add more info
-            Project::Env => {}                     // print env from maidfile
+            Project::Env => cli::env(&cli.path),
         };
     }
 
diff --git a/maid/shared/models/client.rs b/maid/shared/models/client.rs
index 1cabfef..370534a 100644
--- a/maid/shared/models/client.rs
+++ b/maid/shared/models/client.rs
@@ -14,7 +14,7 @@ pub struct Maidfile {
     pub tasks: BTreeMap<String, Tasks>,
 }
 
-#[derive(Clone, Debug, Deserialize, Serialize)]
+#[derive(Clone, Debug, Default, Deserialize, Serialize)]
 pub struct Project {
     #[serde(skip_serializing_if = "Option::is_none")]
     pub name: Option<String>,
-- 
GitLab