#!/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.dart"); 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, }) }