From 30ff33e7196a6d68f2946616a57af732ff5f1126 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sun, 29 Dec 2024 16:17:52 +0800 Subject: [PATCH] feat: update script-meta --- script-meta.json | 7 +++++ update-meta.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 script-meta.json create mode 100755 update-meta.rs diff --git a/script-meta.json b/script-meta.json new file mode 100644 index 0000000..a2447ba --- /dev/null +++ b/script-meta.json @@ -0,0 +1,7 @@ +{ + "helloworld-go": { + "script_name": "helloworld-go", + "script_length": 128, + "script_sha256": "b807f5d29dd2dbd4dc8c665616c836b1e1c0274d377672109a3e2397bb1139bf" + } +} \ No newline at end of file diff --git a/update-meta.rs b/update-meta.rs new file mode 100755 index 0000000..7897a46 --- /dev/null +++ b/update-meta.rs @@ -0,0 +1,75 @@ +#!/usr/bin/env runrs + +//! ```cargo +//! [dependencies] +//! serde = { version = "1.0", features = ["derive"] } +//! serde_json = "1.0" +//! sha256 = "1.5" +//! rust_util = { version = "0.6" } +//! ``` + +use rust_util::{debugging, failure_and_exit, opt_result, opt_value_result, success, XResult}; +use serde::Serialize; +use std::collections::BTreeMap; +use std::fs; +use std::path::PathBuf; + +const SCRIPT_META_FILE: &str = "script-meta.json"; + +#[derive(Serialize)] +struct ScriptMeta { + script_name: String, + script_length: u64, + script_sha256: String, +} + +fn main() -> XResult<()> { + if fs::metadata(SCRIPT_META_FILE).is_err() { + failure_and_exit!("Script meta file {} not found.", SCRIPT_META_FILE); + } + + let mut script_meta_map = BTreeMap::new(); + + let current_read_dir = opt_result!(fs::read_dir("."), "Read dir '.' failed: {}"); + for dir in current_read_dir { + let dir_entry = opt_result!(dir, "Get dir failed: {}"); + let dir_file_type = opt_result!(dir_entry.file_type(), "Get dir type failed: {}"); + let file_name_os_string = dir_entry.file_name(); + let script_dir = opt_value_result!(file_name_os_string.to_str(), "Cannot get file name."); + if !dir_file_type.is_dir() { + debugging!("Skip none dir: {}", script_dir); + continue; + } + if /*"update-meta-rs" == script_dir ||*/ script_dir.starts_with(".") { + debugging!("Skip update meta rs: {}", script_dir); + continue; + } + let abs_dir_entry = std::path::absolute(&dir_entry.path())?; + let main_rs = abs_dir_entry + .join("main.go"); + + script_meta_map.insert( + script_dir.to_string(), + read_script_meta(script_dir, &main_rs)?, + ); + } + + let script_meta_json = serde_json::to_string_pretty(&script_meta_map)?; + + fs::write(SCRIPT_META_FILE, script_meta_json.as_bytes())?; + + success!("Update file: {} succeed.", SCRIPT_META_FILE); + + Ok(()) +} + +fn read_script_meta(file_name: &str, main_rs: &PathBuf) -> XResult { + let main_rs_meta = opt_result!(main_rs.metadata(), "Read file: {:?} meta failed: {}", main_rs); + let main_rs_content = fs::read(main_rs)?; + let script_sha256 = sha256::digest(&main_rs_content); + Ok(ScriptMeta { + script_name: file_name.to_string(), + script_length: main_rs_meta.len(), + script_sha256, + }) +}