From 85b319d2399d42e7cdfdf8be413aea572d7cdc10 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Mon, 13 Apr 2026 00:26:08 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A6=20Add=20Serde=20and=20Serde=20JSON?= =?UTF-8?q?=20dependencies=20for=20cheat=20sheet=20metadata=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- md-rs/Cargo.lock | 21 +++++++++++++++ md-rs/Cargo.toml | 2 ++ md-rs/src/main.rs | 62 +++++++++++++++++++++++++++++++++++++++++++-- script-meta-v2.json | 6 ++--- script-meta.json | 4 +-- 5 files changed, 88 insertions(+), 7 deletions(-) diff --git a/md-rs/Cargo.lock b/md-rs/Cargo.lock index 5d6f128..81bca75 100644 --- a/md-rs/Cargo.lock +++ b/md-rs/Cargo.lock @@ -877,6 +877,8 @@ version = "0.1.0" dependencies = [ "reqwest", "rust_util", + "serde", + "serde_json", "termimad", ] @@ -1394,6 +1396,19 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + [[package]] name = "shlex" version = "1.3.0" @@ -2294,3 +2309,9 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/md-rs/Cargo.toml b/md-rs/Cargo.toml index 84c2d18..fd48fb7 100644 --- a/md-rs/Cargo.toml +++ b/md-rs/Cargo.toml @@ -6,4 +6,6 @@ edition = "2024" [dependencies] reqwest = { version = "0.13.2", features = ["blocking"] } rust_util = "0.6.51" +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.149" termimad = "0.34.1" diff --git a/md-rs/src/main.rs b/md-rs/src/main.rs index 52a4014..4b5cea3 100755 --- a/md-rs/src/main.rs +++ b/md-rs/src/main.rs @@ -4,6 +4,8 @@ //! [dependencies] //! reqwest = { version = "0.13.2", features = ["blocking"] } //! rust_util = "0.6.51" +//! serde = { version = "1.0.228", features = ["derive"] } +//! serde_json = "1.0.149" //! termimad = "0.34.1" //! ``` @@ -15,7 +17,9 @@ // println!("\nand now {}\n", skin.inline("a little *too much* **style!** (and `some(code)` too)")); use rust_util::{opt_result, warning, XResult}; +use serde::Deserialize; use std::io::Read; +use std::process::exit; use std::{fs, io}; // https://github.com/Canop/termimad @@ -44,6 +48,18 @@ fn read_to_string(path_opt: Option<&String>) -> XResult { Ok(buffer) } Some(path) => { + let path = if let Some(cheat_sheet_name) = try_cheat_sheet(path) { + if cheat_sheet_name.is_empty() { + print_cheat_sheet_meta(); + } + format!( + "https://git.hatter.ink/hatter/cheatsheets/raw/branch/main/{cheat_sheet_name}/CHEATSHEET.md" + ) + } else { + path.to_string() + }; + + let path = &path; let is_http_path = path.starts_with("http://"); let is_https_path = path.starts_with("https://"); if is_http_path || is_https_path { @@ -64,5 +80,47 @@ fn read_to_string(path_opt: Option<&String>) -> XResult { } } -// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260412T235541+08:00.MEUCID7zWIZ1zyjpISPbbROS -// X+wrb0hfpeWaan8mYIaG9hoaAiEAw1jj2TvjDx0Y6egXTfpIQD5XzW91sutNjSz62Nc9taI= +#[derive(Deserialize)] +struct CheatSheetMeta { + name: String, + // aliases: Option, + // repo: String, + description: String, +} + +fn print_cheat_sheet_meta() -> ! { + let cheat_sheet_meta_url = + "https://git.hatter.ink/hatter/cheatsheets/raw/branch/main/meta.json"; + let cheat_sheet_meta_json = reqwest::blocking::get(cheat_sheet_meta_url) + .expect("Get cheat sheet meta failed") + .text() + .expect("Read cheat sheet meta failed"); + let cheat_sheet_meta: Vec = + serde_json::from_str(&cheat_sheet_meta_json).expect("Parse cheat sheet meta failed"); + + let mut cheat_sheet_md = String::new(); + cheat_sheet_md.push_str("# Cheat Sheets\n\n"); + cheat_sheet_md.push_str("| Name | Description |\n"); + cheat_sheet_md.push_str("| ----- | ------ |\n"); + for cheat_sheet in &cheat_sheet_meta { + cheat_sheet_md.push_str(&format!( + "| {} | {} |\n", + cheat_sheet.name, cheat_sheet.description + )); + } + termimad::print_text(&cheat_sheet_md); + exit(0); +} + +fn try_cheat_sheet(path: &str) -> Option { + let cheat_prefixes = ["cheat:", "cheatsheet:", "cheat_sheet:"]; + for cheat_prefix in cheat_prefixes { + if path.starts_with(cheat_prefix) { + return Some(path.chars().skip(cheat_prefix.len()).collect::()); + } + } + None +} + +// @SCRIPT-SIGNATURE-V1: yk-r1.ES256.20260413T002526+08:00.MEUCIQDtbn9VsvXD5i0CDDpX +// vaa/uR8bjm5CuvKZFs9gIVFfxwIgYXGJkKom0g+uG6QB6jqi31d7Vtyg80SWmyRAi5aZCvk= diff --git a/script-meta-v2.json b/script-meta-v2.json index 6350d76..86a62de 100644 --- a/script-meta-v2.json +++ b/script-meta-v2.json @@ -82,11 +82,11 @@ }, "md.rs": { "script_name": "md.rs", - "script_length": 2081, - "script_sha256": "d4723b7f59bd9e805a4a482e3107f2f30ec70d24d8efb3717b7bc7008a1cc67b", + "script_length": 4052, + "script_sha256": "eaf9e006406250ae6841b62ea75d751826e42562e6117b505b77fc9f594cdff5", "script_full_url": "https://git.hatter.ink/rust-scripts/scriptbase/raw/branch/main/md-rs/src/main.rs", "publish_time": 1775921621093, - "update_time": 1776009548379 + "update_time": 1776011164981 }, "myip.rs": { "script_name": "myip.rs", diff --git a/script-meta.json b/script-meta.json index ed02e88..dffc681 100644 --- a/script-meta.json +++ b/script-meta.json @@ -46,8 +46,8 @@ }, "md-rs": { "script_name": "md-rs", - "script_length": 2081, - "script_sha256": "d4723b7f59bd9e805a4a482e3107f2f30ec70d24d8efb3717b7bc7008a1cc67b" + "script_length": 4052, + "script_sha256": "eaf9e006406250ae6841b62ea75d751826e42562e6117b505b77fc9f594cdff5" }, "myip-rs": { "script_name": "myip-rs",