From 18d55793d9632fe13ab7c742a07c846f839618c4 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 18 Jan 2025 14:28:43 +0800 Subject: [PATCH] feat: v1.0.0 --- Cargo.lock | 439 +++++++++++++-------- Cargo.toml | 14 +- src/help.rs | 20 + src/install.rs | 85 ++-- src/list.rs | 74 ++-- src/main.rs | 90 +---- src/{help_dart.rs => script.help.dart.txt} | 8 +- src/{help_go.rs => script.help.go.txt} | 8 +- src/{help_rs.rs => script.help.rust.txt} | 9 +- src/{help_ts.rs => script.help.ts.txt} | 8 +- src/template.rs | 39 ++ src/util.rs | 164 ++++++-- 12 files changed, 535 insertions(+), 423 deletions(-) create mode 100644 src/help.rs rename src/{help_dart.rs => script.help.dart.txt} (58%) rename src/{help_go.rs => script.help.go.txt} (65%) rename src/{help_rs.rs => script.help.rust.txt} (89%) rename src/{help_ts.rs => script.help.ts.txt} (57%) create mode 100644 src/template.rs diff --git a/Cargo.lock b/Cargo.lock index 2b51ef4..702e01a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -60,6 +60,12 @@ dependencies = [ "syn", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.4.0" @@ -78,26 +84,20 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block-buffer" @@ -122,9 +122,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.2.7" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "shlex", ] @@ -280,6 +280,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -314,6 +315,7 @@ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-io", + "futures-sink", "futures-task", "memchr", "pin-project-lite", @@ -350,15 +352,15 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" -version = "0.3.26" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap", "slab", @@ -381,9 +383,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "0.2.12" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -392,12 +394,24 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", "pin-project-lite", ] @@ -407,47 +421,76 @@ version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.32" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "h2", "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", "socket2", "tokio", "tower-service", "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", ] [[package]] @@ -613,9 +656,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -639,7 +682,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.7.0", + "bitflags", "libc", ] @@ -657,9 +700,9 @@ checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "memchr" @@ -675,9 +718,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", ] @@ -731,7 +774,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.7.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -795,9 +838,9 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -824,20 +867,24 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", "h2", "http", "http-body", + "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -854,17 +901,33 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", + "tower", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] name = "runrs" -version = "0.4.0" +version = "1.0.0" dependencies = [ "argh", "reqwest", @@ -904,7 +967,7 @@ version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.7.0", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -912,12 +975,42 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "1.0.4" +name = "rustls" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ - "base64", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] @@ -947,7 +1040,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.7.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -1063,12 +1156,24 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "stable_deref_trait" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "2.0.96" @@ -1082,9 +1187,12 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -1099,20 +1207,20 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -1208,6 +1316,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.13" @@ -1221,6 +1339,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -1264,6 +1403,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.4" @@ -1316,20 +1461,21 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", @@ -1341,9 +1487,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -1354,9 +1500,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1364,9 +1510,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -1377,15 +1523,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -1414,12 +1563,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.48.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-targets 0.48.5", + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", ] [[package]] @@ -1428,7 +1598,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1437,22 +1607,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -1461,46 +1616,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -1513,64 +1650,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "write16" version = "1.0.0" @@ -1628,6 +1731,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zerovec" version = "0.10.4" diff --git a/Cargo.toml b/Cargo.toml index e2005f9..b7be9f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "runrs" -version = "0.4.0" +version = "1.0.0" edition = "2018" license = "MIT/Apache-2.0" description = "A Tool for Run Rust Scripts" @@ -16,9 +16,9 @@ switch-ts-lang = [] switch-dart-lang = [] [dependencies] -reqwest = { version = "0.11.14", features = ["blocking"] } -rust_util = "0.6.41" -sha256 = "1.0.3" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.125" -argh = "0.1.13" +reqwest = { version = "0.12", features = ["blocking"] } +rust_util = "0.6" +sha256 = "1.0" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +argh = "0.1" diff --git a/src/help.rs b/src/help.rs new file mode 100644 index 0000000..feaa53f --- /dev/null +++ b/src/help.rs @@ -0,0 +1,20 @@ +pub fn print_help() { + let help = get_help() + .replace("{CARGO_PKG_NAME}", env!("CARGO_PKG_NAME")) + .replace("{CARGO_PKG_VERSION}", env!("CARGO_PKG_VERSION")) + .replace("{CARGO_PKG_DESCRIPTION}", env!("CARGO_PKG_DESCRIPTION")); + println!("{}", help); +} + +#[allow(unreachable_code)] +fn get_help() -> &'static str { + #[cfg(feature = "switch-rust-lang")] + return include_str!("script.help.rust.txt"); + #[cfg(feature = "switch-go-lang")] + return include_str!("script.help.go.txt"); + #[cfg(feature = "switch-ts-lang")] + return include_str!("script.help.ts.txt"); + #[cfg(feature = "switch-dart-lang")] + return include_str!("script.help.dart.txt"); + panic!("Unknown feature assigned."); +} diff --git a/src/install.rs b/src/install.rs index 16af99f..c5533cd 100644 --- a/src/install.rs +++ b/src/install.rs @@ -1,54 +1,39 @@ +use crate::util; +use crate::util::ScriptMeta; +use std::collections::BTreeMap; use std::fs; use std::os::unix::fs::PermissionsExt; use std::path::PathBuf; -use crate::util::{SCRIPT_DOT_EXT, SCRIPT_HYPHEN_EXT}; -use rust_util::util_os::get_user_home; +pub fn install_scripts(arguments: &[String]) { + if arguments.is_empty() { + failure_and_exit!("No scripts assigned."); + } + let script_meta_map = util::fetch_script_meta_or_die(); + for (i, script_name) in arguments.iter().enumerate() { + information!( + "Installing script: {} [ {} / {} ]", + script_name, + (i + 1), + arguments.len() + ); + install_script(script_name, &script_meta_map); + } +} -#[cfg(feature = "switch-rust-lang")] -const SCRIPT_PATTERN: &str = - "https://git.hatter.ink/rust-scripts/scriptbase/raw/branch/main/$NAME/src/main.rs"; -#[cfg(feature = "switch-go-lang")] -const SCRIPT_PATTERN: &str = - "https://git.hatter.ink/hatter/go-scripts/raw/branch/main/$NAME/main.go"; -#[cfg(feature = "switch-ts-lang")] -const SCRIPT_PATTERN: &str = - "https://git.hatter.ink/hatter/ts-scripts/raw/branch/main/$NAME/main.ts"; -#[cfg(feature = "switch-dart-lang")] -const SCRIPT_PATTERN: &str = - "https://git.hatter.ink/hatter/dart-scripts/raw/branch/main/$NAME/main.dart"; - -pub fn install_script(script_name: &str) { - let normalized_script_name = if script_name.ends_with(SCRIPT_DOT_EXT) { - script_name - .chars() - .take(script_name.len() - SCRIPT_DOT_EXT.len()) - .collect::() - + SCRIPT_HYPHEN_EXT - } else if script_name.ends_with(SCRIPT_HYPHEN_EXT) { - script_name.to_string() - } else { - failure!("Invalid script name: {}", script_name); - return; +pub fn install_script(script_name: &str, script_meta_map: &BTreeMap) { + let script_meta = match script_meta_map.get(script_name) { + None => { + failure!("Script not found: {}", script_name); + return; + } + Some(script_meta) => script_meta, }; - let script_file_name = normalized_script_name - .chars() - .take(normalized_script_name.len() - SCRIPT_HYPHEN_EXT.len()) - .collect::() - + SCRIPT_DOT_EXT; - let user_home = get_user_home().expect("Get user home failed!"); - let output_file_name = PathBuf::from(&user_home) - .join("bin") - .join(&script_file_name); - if output_file_name.exists() { - warning!("Script file: {} exists", output_file_name.to_string_lossy()); - } - - let script_url = SCRIPT_PATTERN.replace("$NAME", &normalized_script_name); + let script_url = &script_meta.script_full_url; information!("Script URL: {}", &script_url); - let get_script_response_result = reqwest::blocking::get(&script_url); + let get_script_response_result = reqwest::blocking::get(script_url); debugging!("Get script response: {:#?}", &get_script_response_result); let get_script_response = match get_script_response_result { @@ -66,16 +51,22 @@ pub fn install_script(script_name: &str) { failure!("Get script failed: {}", get_script_response_status); return; } - - let text = match get_script_response.text() { + let remote_script_content = match get_script_response.text() { Err(e) => { failure!("Get script: {} failed: {}", &script_url, e); return; } - Ok(text) => text, + Ok(remote_script_content) => remote_script_content, }; + let user_home = util::get_user_home_or_die(); + let output_file_name = PathBuf::from(&user_home) + .join("bin") + .join(&script_meta.script_name); + if output_file_name.exists() { + warning!("Script file: {} exists", output_file_name.to_string_lossy()); + } if let Ok(script_content) = fs::read_to_string(&output_file_name) { - if text == script_content { + if remote_script_content == script_content { success!( "File is extract same, skip write file: {}", output_file_name.to_string_lossy() @@ -83,7 +74,7 @@ pub fn install_script(script_name: &str) { return; } } - if let Err(e) = fs::write(&output_file_name, text) { + if let Err(e) = fs::write(&output_file_name, remote_script_content) { failure!( "Write script: {} failed: {}", output_file_name.to_string_lossy(), diff --git a/src/list.rs b/src/list.rs index 9ef5e87..703a304 100644 --- a/src/list.rs +++ b/src/list.rs @@ -1,60 +1,22 @@ -use rust_util::util_os::get_user_home; -use serde::Deserialize; -use std::collections::BTreeMap; +use crate::util; use std::fs; use std::path::PathBuf; -use crate::util::{SCRIPT_DOT_EXT, SCRIPT_HYPHEN_EXT}; - -#[cfg(feature = "switch-rust-lang")] -const FILE_META: &str = "https://git.hatter.ink/rust-scripts/scriptbase/raw/branch/main/script-meta.json"; -#[cfg(feature = "switch-go-lang")] -const FILE_META: &str = "https://git.hatter.ink/hatter/go-scripts/raw/branch/main/script-meta.json"; -#[cfg(feature = "switch-ts-lang")] -const FILE_META: &str = "https://git.hatter.ink/hatter/ts-scripts/raw/branch/main/script-meta.json"; -#[cfg(feature = "switch-dart-lang")] -const FILE_META: &str = "https://git.hatter.ink/hatter/dart-scripts/raw/branch/main/script-meta.json"; - -#[derive(Deserialize)] -struct ScriptMeta { - script_name: String, - script_length: u64, - script_sha256: String, -} pub fn list_scripts(filter: Option<&String>) { - debugging!("Loading URL: {}", FILE_META); - let response = reqwest::blocking::get(FILE_META).unwrap_or_else(|e| { - failure_and_exit!("Get file-meta.json failed: {}", e); - }); - debugging!("Load response: {}", response.status().as_u16()); - if response.status().as_u16() != 200 { - failure_and_exit!("Get file-meta.json failed, status: {}", response.status().as_u16()); - } - let text = response.text().unwrap_or_else(|e| { - failure_and_exit!("Get file-meta.json failed: {}", e); - }); - debugging!("Response text: {}", &text); - - let user_home = get_user_home().expect("Get user home failed!"); - let script_meta_map: BTreeMap = serde_json::from_str(&text).expect("Parse script-meta.json failed."); + let script_meta_map = util::fetch_script_meta_or_die(); let mut messages = vec![]; - for (_, script_meta) in &script_meta_map { + for script_meta in script_meta_map.values() { let script_name = &script_meta.script_name; - let real_script_name = if script_name.ends_with(SCRIPT_HYPHEN_EXT) { - script_name.chars().take(script_name.len() - SCRIPT_HYPHEN_EXT.len()).collect::() + SCRIPT_DOT_EXT - } else { - script_name.to_string() - }; - if let Some(filter) = filter { - if !real_script_name.contains(filter) { + if !script_name.contains(filter) { // NOT CONTAINS `filter`, SKIP continue; } } - let full_script_path = PathBuf::from(&user_home).join("bin").join(&real_script_name); + let user_home = util::get_user_home_or_die(); + let full_script_path = PathBuf::from(&user_home).join("bin").join(script_name); let is_script_exists = full_script_path.is_file(); let script_sha256 = if is_script_exists { let script_content = fs::read(&full_script_path).unwrap_or(vec![]); @@ -64,18 +26,26 @@ pub fn list_scripts(filter: Option<&String>) { }; let is_script_matches = script_sha256 == script_meta.script_sha256; let script_size = rust_util::util_size::get_display_size(script_meta.script_length as i64); - let padding_length = 40 - real_script_name.len(); - messages.push(format!("- {} {} {} {}", - iff!(is_script_exists, iff!(is_script_matches, "✅", "✔️ "), "➖"), - real_script_name, - ".".repeat(iff!(padding_length < 1, 1, padding_length)), - script_size, + let padding_length = 40 - script_name.len(); + messages.push(format!( + "- {} {} {} {}", + iff!(is_script_exists, iff!(is_script_matches, "✅", "✔️ "), "➖"), + script_name, + ".".repeat(iff!(padding_length < 1, 1, padding_length)), + script_size, )); } if filter.is_some() { - messages.insert(0, format!("Total {} script(s), found {} script(s):", script_meta_map.len(), messages.len())); + messages.insert( + 0, + format!( + "Total {} script(s), found {} script(s):", + script_meta_map.len(), + messages.len() + ), + ); } else { messages.insert(0, format!("Found {} script(s):", script_meta_map.len())); } success!("{}", messages.join("\n")); -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index 22d93f9..b78cf86 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,36 +3,19 @@ extern crate rust_util; use argh::FromArgs; use rust_util::util_os::get_user_home; -use std::os::unix::fs::PermissionsExt; -use std::{env, fs}; +use std::env; -use crate::install::install_script; use crate::list::list_scripts; use crate::util::{ build_script_command, get_run_script_bin_name, read_file_and_digest, run_script_command, }; -#[cfg(feature = "switch-dart-lang")] -mod help_dart; -#[cfg(feature = "switch-go-lang")] -mod help_go; -#[cfg(feature = "switch-ts-lang")] -mod help_ts; -#[cfg(feature = "switch-rust-lang")] -mod help_rs; +mod help; mod install; mod list; +mod template; mod util; -#[cfg(feature = "switch-rust-lang")] -const CMD_NAME: &str = "runrs"; -#[cfg(feature = "switch-go-lang")] -const CMD_NAME: &str = "rungo"; -#[cfg(feature = "switch-ts-lang")] -const CMD_NAME: &str = "runts"; -#[cfg(feature = "switch-dart-lang")] -const CMD_NAME: &str = "rundart"; - #[derive(FromArgs, PartialEq, Debug)] /// Run script struct RunScriptArgs { @@ -60,22 +43,20 @@ fn main() { let rs_args: RunScriptArgs = argh::from_env(); // println!("{:#?}", rs_args); + let cmd_name = util::get_cmd_name(); + let cmd_version = env!("CARGO_PKG_VERSION"); if env::args().len() == 1 { failure_and_exit!( - "{} v{}, need arguments, `{} -h` or `{} --help-message` for help", - CMD_NAME, - env!("CARGO_PKG_VERSION"), - CMD_NAME, - CMD_NAME, + "{cmd_name} v{cmd_version}, need arguments, `{cmd_name} -h` or `{cmd_name} --help-message` for help" ); } if rs_args.help_message { - print_help(); + help::print_help(); return; } if rs_args.template { - print_template(&rs_args.output); + template::print_template(&rs_args.output); return; } if rs_args.list { @@ -83,18 +64,7 @@ fn main() { return; } if rs_args.install { - if rs_args.arguments.is_empty() { - failure_and_exit!("No scripts assigned."); - } - for (i, script_name) in rs_args.arguments.iter().enumerate() { - information!( - "Installing script: {} [ {} / {} ]", - script_name, - (i + 1), - rs_args.arguments.len() - ); - install_script(script_name); - } + install::install_scripts(&rs_args.arguments); return; } @@ -129,48 +99,6 @@ fn main() { run_script_command(script_file, &cache_script_bin_name, &mut run_script_cmd) } -fn print_help() { - #[cfg(feature = "switch-rust-lang")] - help_rs::print_help(); - #[cfg(feature = "switch-go-lang")] - help_go::print_help(); - #[cfg(feature = "switch-ts-lang")] - help_ts::print_help(); - #[cfg(feature = "switch-dart-lang")] - help_dart::print_help(); -} - -fn print_template(output: &Option) { - #[cfg(feature = "switch-rust-lang")] - let script = include_str!("script.template.rs"); - #[cfg(feature = "switch-go-lang")] - let script = include_str!("script.template.go"); - #[cfg(feature = "switch-ts-lang")] - let script = include_str!("script.template.ts"); - #[cfg(feature = "switch-dart-lang")] - let script = include_str!("script.template.dart"); - match output { - None => { - println!("{}", script); - } - Some(output_file) => { - if fs::metadata(output_file).is_ok() { - failure!("Output script file exists: {}", output_file); - } else { - match fs::write(output_file, script) { - Ok(_) => { - success!("Write script file success: {}", output_file); - let _ = fs::set_permissions(&output_file, PermissionsExt::from_mode(0o755)); - } - Err(e) => { - failure!("Write script file: {}, failed: {}", output_file, e); - } - } - } - } - } -} - fn get_cache_script_bin_name(user_home: &str, script_sha256: &str) -> String { #[cfg(target_os = "macos")] let cache_script_bin_name = format!( diff --git a/src/help_dart.rs b/src/script.help.dart.txt similarity index 58% rename from src/help_dart.rs rename to src/script.help.dart.txt index 77630f3..ab7d45f 100644 --- a/src/help_dart.rs +++ b/src/script.help.dart.txt @@ -1,5 +1,4 @@ -pub fn print_help() { - println!(r##"rundart v{} - A Tool for Run dart Scripts +rundart v{CARGO_PKG_VERSION} - A Tool for Run dart Scripts Show help: $ rundart -h|--help @@ -12,8 +11,3 @@ $ rundart -l|--list Install script: $ rundart -i|--install - -"##, - env!("CARGO_PKG_VERSION") - ); -} \ No newline at end of file diff --git a/src/help_go.rs b/src/script.help.go.txt similarity index 65% rename from src/help_go.rs rename to src/script.help.go.txt index 064c8ab..81ee72a 100644 --- a/src/help_go.rs +++ b/src/script.help.go.txt @@ -1,5 +1,4 @@ -pub fn print_help() { - println!(r##"rungo v{} - A Tool for Run Go Scripts +rungo v{CARGO_PKG_VERSION} - A Tool for Run Go Scripts Show help: $ rungo -h|--help @@ -14,8 +13,3 @@ Install script: $ rungo -i|--install Powered by gorun, know more reference: https://github.com/erning/gorun - -"##, - env!("CARGO_PKG_VERSION") - ); -} \ No newline at end of file diff --git a/src/help_rs.rs b/src/script.help.rust.txt similarity index 89% rename from src/help_rs.rs rename to src/script.help.rust.txt index e17e5b7..195274a 100644 --- a/src/help_rs.rs +++ b/src/script.help.rust.txt @@ -1,5 +1,4 @@ -pub fn print_help() { - println!(r##"{} v{} - {} +runrs v{CARGO_PKG_VERSION} - {CARGO_PKG_DESCRIPTION} Show help: $ runrs -h|--help @@ -31,9 +30,3 @@ Environment variables: │ RUNRS_MAX_SCRIPT_LEN │ Max script length, default 1MB │ └──────────────────────┴────────────────────────────────────────────────┘ > Type `bool`: `true`, `yes`, `on` or `1` for true, otherwise false -"##, - env!("CARGO_PKG_NAME"), - env!("CARGO_PKG_VERSION"), - env!("CARGO_PKG_DESCRIPTION") - ); -} \ No newline at end of file diff --git a/src/help_ts.rs b/src/script.help.ts.txt similarity index 57% rename from src/help_ts.rs rename to src/script.help.ts.txt index 9154898..f6ec471 100644 --- a/src/help_ts.rs +++ b/src/script.help.ts.txt @@ -1,5 +1,4 @@ -pub fn print_help() { - println!(r##"runts v{} - A Tool for Run TS Scripts +runts v{CARGO_PKG_VERSION} - A Tool for Run TS Scripts Show help: $ runts -h|--help @@ -12,8 +11,3 @@ $ runts -l|--list Install script: $ runts -i|--install - -"##, - env!("CARGO_PKG_VERSION") - ); -} \ No newline at end of file diff --git a/src/template.rs b/src/template.rs new file mode 100644 index 0000000..9b207b4 --- /dev/null +++ b/src/template.rs @@ -0,0 +1,39 @@ +use std::fs; +use std::os::unix::fs::PermissionsExt; + +pub fn print_template(output: &Option) { + let script = get_script_template(); + match output { + None => { + println!("{}", script); + } + Some(output_file) => { + if fs::metadata(output_file).is_ok() { + failure!("Output script file exists: {}", output_file); + } else { + match fs::write(output_file, script) { + Ok(_) => { + success!("Write script file success: {}", output_file); + let _ = fs::set_permissions(output_file, PermissionsExt::from_mode(0o755)); + } + Err(e) => { + failure!("Write script file: {}, failed: {}", output_file, e); + } + } + } + } + } +} + +#[allow(unreachable_code)] +fn get_script_template() -> &'static str { + #[cfg(feature = "switch-rust-lang")] + return include_str!("script.template.rs"); + #[cfg(feature = "switch-go-lang")] + return include_str!("script.template.go"); + #[cfg(feature = "switch-ts-lang")] + return include_str!("script.template.ts"); + #[cfg(feature = "switch-dart-lang")] + return include_str!("script.template.dart"); + panic!("Unknown feature assigned."); +} diff --git a/src/util.rs b/src/util.rs index 92993bc..32ace6e 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,36 +1,92 @@ use rust_util::util_cmd; use rust_util::util_env::is_env_on; +use rust_util::util_os::get_user_home; +use serde::Deserialize; +use std::collections::BTreeMap; use std::path::PathBuf; use std::process::Command; use std::time::SystemTime; use std::{env, fs, process}; -#[cfg(feature = "switch-rust-lang")] -pub const SCRIPT_HYPHEN_EXT: &str = "-rs"; -#[cfg(feature = "switch-go-lang")] -pub const SCRIPT_HYPHEN_EXT: &str = "-go"; -#[cfg(feature = "switch-ts-lang")] -pub const SCRIPT_HYPHEN_EXT: &str = "-ts"; -#[cfg(feature = "switch-dart-lang")] -pub const SCRIPT_HYPHEN_EXT: &str = "-dart"; +#[allow(dead_code)] +#[derive(Deserialize)] +pub struct ScriptMeta { + pub script_name: String, + pub script_length: u64, + pub script_sha256: String, + pub script_full_url: String, + pub single_script_file: Option, +} -#[cfg(feature = "switch-rust-lang")] -pub const SCRIPT_DOT_EXT: &str = ".rs"; -#[cfg(feature = "switch-go-lang")] -pub const SCRIPT_DOT_EXT: &str = ".go"; -#[cfg(feature = "switch-ts-lang")] -pub const SCRIPT_DOT_EXT: &str = ".ts"; -#[cfg(feature = "switch-dart-lang")] -pub const SCRIPT_DOT_EXT: &str = ".dart"; +#[allow(unreachable_code)] +pub fn get_script_meta_url() -> &'static str { + #[cfg(feature = "switch-rust-lang")] + return "https://git.hatter.ink/rust-scripts/scriptbase/raw/branch/main/script-meta-v2.json"; + #[cfg(feature = "switch-go-lang")] + return "https://git.hatter.ink/hatter/go-scripts/raw/branch/main/script-meta-v2.json"; + #[cfg(feature = "switch-ts-lang")] + return "https://git.hatter.ink/hatter/ts-scripts/raw/branch/main/script-meta-v2.json"; + #[cfg(feature = "switch-dart-lang")] + return "https://git.hatter.ink/hatter/dart-scripts/raw/branch/main/script-meta-v2.json"; + panic!("Unknown feature assigned."); +} +#[allow(unreachable_code)] +pub fn get_cmd_name() -> &'static str { + #[cfg(feature = "switch-rust-lang")] + return "runrs"; + #[cfg(feature = "switch-go-lang")] + return "rungo"; + #[cfg(feature = "switch-ts-lang")] + return "runts"; + #[cfg(feature = "switch-dart-lang")] + return "rundart"; + panic!("Unknown feature assigned."); +} -pub fn build_script_command(rust_script: PathBuf, script_file: &str, script_sha256: &str, cache_script_bin_name: &str) -> Command { +pub fn fetch_script_meta_or_die() -> BTreeMap { + let file_meta_url = get_script_meta_url(); + debugging!("Loading URL: {}", file_meta_url); + let response = reqwest::blocking::get(file_meta_url).unwrap_or_else(|e| { + failure_and_exit!("Get file-meta.json failed: {}", e); + }); + debugging!("Load response: {}", response.status().as_u16()); + if response.status().as_u16() != 200 { + failure_and_exit!( + "Get file-meta.json failed, status: {}", + response.status().as_u16() + ); + } + let text = response.text().unwrap_or_else(|e| { + failure_and_exit!("Get file-meta.json failed: {}", e); + }); + debugging!("Response text: {}", &text); + + let script_meta_map: BTreeMap = + serde_json::from_str(&text).expect("Parse script-meta.json failed."); + script_meta_map +} + +pub fn get_user_home_or_die() -> String { + get_user_home().expect("Get user home failed!") +} + +pub fn build_script_command( + rust_script: PathBuf, + script_file: &str, + script_sha256: &str, + cache_script_bin_name: &str, +) -> Command { let skip_cache = is_env_on("RUNRS_SKIP_CACHE"); let rebuild = is_env_on("RUNRS_REBUILD"); - let cache_script_bin_name_exists = fs::metadata(&cache_script_bin_name).is_ok(); - debugging!("Bin name: {} {}exists", cache_script_bin_name, iff!(cache_script_bin_name_exists, "", "not ")); + let cache_script_bin_name_exists = fs::metadata(cache_script_bin_name).is_ok(); + debugging!( + "Bin name: {} {}exists", + cache_script_bin_name, + iff!(cache_script_bin_name_exists, "", "not ") + ); if !rebuild && !skip_cache && cache_script_bin_name_exists { - Command::new(&cache_script_bin_name) + Command::new(cache_script_bin_name) } else { let mut cmd = Command::new(rust_script); if !is_env_on("RUNRS_SILENT_BUILD") { @@ -40,37 +96,52 @@ pub fn build_script_command(rust_script: PathBuf, script_file: &str, script_sha2 if rebuild { cmd.arg("--force"); } - cmd.args(&["--bin-name", &script_sha256, script_file]); + cmd.args(["--bin-name", script_sha256, script_file]); cmd } } -pub fn run_script_command(script_file: &str, cache_script_bin_name: &str, mut run_script_cmd: &mut Command) -> ! { +pub fn run_script_command( + script_file: &str, + cache_script_bin_name: &str, + run_script_cmd: &mut Command, +) -> ! { debugging!("Run command: {:?}", run_script_cmd); let run_command_start = SystemTime::now(); - match util_cmd::run_command_and_wait(&mut run_script_cmd) { + match util_cmd::run_command_and_wait(run_script_cmd) { Err(e) => failure_and_exit!("Run rust-script failed: {}", e), Ok(exit_status) => { write_script_file_to_src(script_file, cache_script_bin_name); if let Ok(run_command_cost) = SystemTime::now().duration_since(run_command_start) { debugging!("Run command cost: {}ms", run_command_cost.as_millis()); } - process::exit(exit_status.code().unwrap_or_else(|| 0)) + process::exit(exit_status.code().unwrap_or(0)) } } } pub fn write_script_file_to_src(script_file: &str, cache_script_bin_name: &str) { if let Ok(Some(canonicalized_script_file)) = PathBuf::from(script_file) - .canonicalize().map(|f| f.to_str().map(|f| f.to_string())) { + .canonicalize() + .map(|f| f.to_str().map(|f| f.to_string())) + { let cache_script_bin_name_src = format!("{}.src", cache_script_bin_name); let src_content = fs::read_to_string(&cache_script_bin_name_src).ok(); - if src_content.as_ref().map(|c| c.contains(&canonicalized_script_file)).unwrap_or_else(|| false) { + if src_content + .as_ref() + .map(|c| c.contains(&canonicalized_script_file)) + .unwrap_or_else(|| false) + { return; } - let new_src_content = src_content.unwrap_or_else(|| "".to_string()) + &format!("{}\n", canonicalized_script_file); - if let Ok(_) = fs::write(&cache_script_bin_name_src, &new_src_content) { - debugging!("Add {} to {}", canonicalized_script_file, cache_script_bin_name_src); + let new_src_content = src_content.unwrap_or_else(|| "".to_string()) + + &format!("{}\n", canonicalized_script_file); + if fs::write(&cache_script_bin_name_src, &new_src_content).is_ok() { + debugging!( + "Add {} to {}", + canonicalized_script_file, + cache_script_bin_name_src + ); } } } @@ -87,13 +158,20 @@ pub fn get_run_script_bin_name(home: &str) -> PathBuf { if !rust_script.exists() { warning!("rust-script not found, install it..."); let mut cargo_install_rust_script = Command::new("cargo"); - cargo_install_rust_script.args(&["install", "--git", "https://git.hatter.ink/hatter/runrs", "rust-script"]); + cargo_install_rust_script.args([ + "install", + "--git", + "https://git.hatter.ink/hatter/runrs", + "rust-script", + ]); debugging!("Run command: {:?}", cargo_install_rust_script); match util_cmd::run_command_and_wait(&mut cargo_install_rust_script) { Err(e) => failure_and_exit!("Install rust-script failed: {}", e), - Ok(exist_status) => if !exist_status.success() { - failure!("Install rust-script not success: {}", exist_status); - }, + Ok(exist_status) => { + if !exist_status.success() { + failure!("Install rust-script not success: {}", exist_status); + } + } } } rust_script @@ -102,19 +180,21 @@ pub fn get_run_script_bin_name(home: &str) -> PathBuf { pub fn read_file_and_digest(script_file: &str) -> (String, String) { let default_max_script_len = 1024 * 1024; let max_script_len: u64 = env::var("RUNRS_MAX_SCRIPT_LEN") - .map(|len| len.parse().unwrap_or_else(|_| default_max_script_len)).unwrap_or_else(|_| default_max_script_len); + .map(|len| len.parse().unwrap_or(default_max_script_len)) + .unwrap_or(default_max_script_len); match fs::metadata(script_file) { Err(_) => failure_and_exit!("Script file not exists: {}", script_file), - Ok(metadata) => if metadata.is_dir() { - failure_and_exit!("Assigned input is dir: {}", script_file); - } else if metadata.len() > max_script_len { - failure_and_exit!("Script file: {} too large: {}", script_file, metadata.len()); + Ok(metadata) => { + if metadata.is_dir() { + failure_and_exit!("Assigned input is dir: {}", script_file); + } else if metadata.len() > max_script_len { + failure_and_exit!("Script file: {} too large: {}", script_file, metadata.len()); + } } } - let script_content = fs::read_to_string(script_file).unwrap_or_else(|e| - failure_and_exit!("Read file: {}, failed: {}", script_file, e) - ); + let script_content = fs::read_to_string(script_file) + .unwrap_or_else(|e| failure_and_exit!("Read file: {}, failed: {}", script_file, e)); let script_sha256 = sha256::digest(script_content.as_str()); (script_content, script_sha256) -} \ No newline at end of file +}