From 1a99af083740593f29f6b8de431a57707366f609 Mon Sep 17 00:00:00 2001
From: theMackabu <theMackabu@gmail.com>
Date: Sun, 24 Nov 2024 21:19:52 -0800
Subject: [PATCH] add hcl support

---
 Cargo.lock                | 139 ++++++++++++++++++--------------------
 Cargo.toml                |   8 +--
 maid/client/parse/file.rs |   6 +-
 3 files changed, 72 insertions(+), 81 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 09f1c77..171cadd 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -912,6 +912,45 @@ version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3"
 
+[[package]]
+name = "hcl-edit"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47a966f321ccf77cf6df2e600a3ebc8adb0b9d10acf3ed563fcf27efc69a7204"
+dependencies = [
+ "fnv",
+ "hcl-primitives",
+ "vecmap-rs",
+ "winnow",
+]
+
+[[package]]
+name = "hcl-primitives"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c48fcfd8788ffb4673ac4d3c914dfae15ceedc71d6c6975ab167f9da88a1f142"
+dependencies = [
+ "itoa",
+ "kstring",
+ "ryu",
+ "serde",
+ "unicode-ident",
+]
+
+[[package]]
+name = "hcl-rs"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "048bb0eadcf99b53625333e7b40591309d13c35074961307c80cbf8d4729c76d"
+dependencies = [
+ "hcl-edit",
+ "hcl-primitives",
+ "indexmap 2.6.0",
+ "itoa",
+ "serde",
+ "vecmap-rs",
+]
+
 [[package]]
 name = "heck"
 version = "0.5.0"
@@ -1330,17 +1369,6 @@ dependencies = [
  "wasm-bindgen",
 ]
 
-[[package]]
-name = "json5"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1"
-dependencies = [
- "pest",
- "pest_derive",
- "serde",
-]
-
 [[package]]
 name = "kqueue"
 version = "1.0.8"
@@ -1361,6 +1389,16 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "kstring"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1"
+dependencies = [
+ "serde",
+ "static_assertions",
+]
+
 [[package]]
 name = "lazy_static"
 version = "1.5.0"
@@ -1451,11 +1489,11 @@ dependencies = [
  "futures-core",
  "futures-util",
  "global_placeholders",
+ "hcl-rs",
  "home",
  "human_bytes",
  "indicatif",
  "inquire",
- "json5",
  "lazy_static",
  "libc",
  "macros-rs",
@@ -1750,51 +1788,6 @@ version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
-[[package]]
-name = "pest"
-version = "2.7.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442"
-dependencies = [
- "memchr",
- "thiserror",
- "ucd-trie",
-]
-
-[[package]]
-name = "pest_derive"
-version = "2.7.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd"
-dependencies = [
- "pest",
- "pest_generator",
-]
-
-[[package]]
-name = "pest_generator"
-version = "2.7.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e"
-dependencies = [
- "pest",
- "pest_meta",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pest_meta"
-version = "2.7.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d"
-dependencies = [
- "once_cell",
- "pest",
- "sha2",
-]
-
 [[package]]
 name = "pin-project"
 version = "1.1.7"
@@ -2387,17 +2380,6 @@ dependencies = [
  "digest",
 ]
 
-[[package]]
-name = "sha2"
-version = "0.10.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
 [[package]]
 name = "sharded-slab"
 version = "0.1.7"
@@ -2498,6 +2480,12 @@ dependencies = [
  "loom",
 ]
 
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
 [[package]]
 name = "strip-ansi-escapes"
 version = "0.2.0"
@@ -2912,12 +2900,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "ucd-trie"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
-
 [[package]]
 name = "uncased"
 version = "0.9.10"
@@ -3021,6 +3003,15 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
 
+[[package]]
+name = "vecmap-rs"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78fc839a22ab6c4e2f48cf5b935064188148258d467f49323134d503dd08294"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "version_check"
 version = "0.9.5"
diff --git a/Cargo.toml b/Cargo.toml
index 5251675..d0a1963 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -26,9 +26,9 @@ required-features = ["server"]
 default = ["client", "server"]
 
 client = [
-   "dep:url", 
-   "dep:toml", 
-   "dep:json5", 
+   "dep:url",
+   "dep:toml",
+   "dep:hcl-rs",
    "dep:notify", 
    "dep:inquire", 
    "dep:reqwest",
@@ -92,8 +92,8 @@ tungstenite = { version = "0.20.1", features = ["rustls-tls-webpki-roots"] }
 # enable-feature = client
 url = { version = "2.5.3", optional = true }
 toml = { version = "0.8.19", optional = true }
-json5 = { version = "0.4.1", optional = true }
 notify = { version = "6.1.1", optional = true }
+hcl-rs = { version = "0.18.2", optional = true }
 inquire = { version = "0.6.2", optional = true }
 fs_extra = { version = "1.3.0", optional = true }
 env_logger = { version = "0.10.2", optional = true }
diff --git a/maid/client/parse/file.rs b/maid/client/parse/file.rs
index 8d9a9ea..49380a2 100644
--- a/maid/client/parse/file.rs
+++ b/maid/client/parse/file.rs
@@ -67,7 +67,7 @@ fn find_file(starting_directory: &Path, file_name: &String) -> Option<PathBuf> {
     };
 
     loop {
-        for extension in vec!["", "toml", "yaml", "yml", "json", "json5"].iter() {
+        for extension in vec!["", "toml", "yaml", "yml", "json", "hcl"].iter() {
             let kind = find_kind(extension, path.clone());
             then!(kind.is_file, return kind.path);
         }
@@ -89,7 +89,7 @@ fn read_file(path: PathBuf, kind: &str) -> Maidfile {
     let result = match kind {
         "toml" => toml::from_str(&contents).map_err(|err| string!(err)),
         "json" => serde_json::from_str(&contents).map_err(|err| string!(err)),
-        "json5" => json5::from_str(&contents).map_err(|err| string!(err)),
+        "hcl" => hcl::from_str(&contents).map_err(|err| string!(err)),
         "yaml" | "yml" => serde_yaml::from_str(&contents).map_err(|err| string!(err)),
         _ => error!("Invalid format, cannot read Maidfile"),
     };
@@ -108,7 +108,7 @@ pub fn read_maidfile_with_error(filename: &String, error: &str) -> Maidfile {
                 debug!(path = path.display().to_string(), kind = extension, "Found tasks");
 
                 match extension {
-                    Some("yaml") | Some("yml") | Some("json") | Some("json5") => read_file(path.clone(), extension.unwrap()),
+                    Some("yaml") | Some("yml") | Some("json") | Some("hcl") => read_file(path.clone(), extension.unwrap()),
                     _ => read_file(path, "toml"),
                 }
             }
-- 
GitLab