use crate::error_mod::{Error, Result};
use crate::public_api_mod::{GREEN, RED, RESET, YELLOW};
use glob::glob;
use lazy_static::lazy_static;
use regex::*;
use crate::public_api_mod::CargoTomlPublicApiMethods;
lazy_static! {
static ref REGEX_MD_START: Regex = Regex::new(r#"(?m)^\[//\]: # \(auto_cargo_toml_to_md start\)$"#).expect("regex new");
static ref REGEX_MD_END: Regex = Regex::new(r#"(?m)^\[//\]: # \(auto_cargo_toml_to_md end\)$"#).expect("regex new");
}
pub fn auto_cargo_toml_to_md() -> Result<()> {
let cargo_toml = crate::auto_cargo_toml_mod::CargoToml::read()?;
let version = cargo_toml.package_version();
let author_name = cargo_toml.package_author_name();
let homepage = cargo_toml.package_homepage();
let repository = cargo_toml.package_repository().unwrap_or("".to_owned());
let description = cargo_toml.package_description().unwrap_or("".to_owned());
let keywords = cargo_toml.package_keywords().to_vec();
let now_utc_date_iso = &crate::utils_mod::now_utc_date_iso();
let mut new_text = format!("\n**{description}** \n");
new_text.push_str(&format!(
"***version: {version} date: {now_utc_date_iso} author: [{author_name}]({homepage}) repository: [GitHub]({repository})***\n\n"
));
for keyword in keywords.iter() {
let color = if keyword == "work-in-progress" {
"yellow"
} else if keyword == "maintained" || keyword == "ready-for-use" {
"green"
} else if keyword == "obsolete" || keyword == "archived" {
"red"
} else {
"orange"
};
let keyword_underscore = keyword.replace('-', "_");
new_text.push_str(&format!(
" \n"
));
}
new_text.push('\n');
for filename_result in glob("*.md")? {
let filename_pathbuff = filename_result?;
let md_filename = filename_pathbuff
.to_str()
.ok_or_else(|| Error::ErrorFromStr("filename_pathbuff is None"))?;
let mut md_text_content = std::fs::read_to_string(md_filename)?;
if md_text_content.contains("\r\n") {
return Err(Error::ErrorFromString(format!(
"{RED}Error: {md_filename} has CRLF line endings instead of LF. Correct the file! {RESET}"
)));
}
if let Some(cap) = REGEX_MD_START.captures(&md_text_content) {
let pos_start = cap.get(0).ok_or_else(|| Error::ErrorFromStr("cap get 0 is None"))?.end() + 1;
if let Some(cap) = REGEX_MD_END.captures(&md_text_content) {
let pos_end = cap.get(0).ok_or_else(|| Error::ErrorFromStr("cap get 0 is None"))?.start();
md_text_content.replace_range(pos_start..pos_end, &new_text);
println!(" {YELLOW}Write to md file: {}{RESET}", md_filename);
println!("{GREEN}{}{RESET}", &new_text.trim_end_matches("\n\n"));
std::fs::write(md_filename, md_text_content)?;
}
}
}
Ok(())
}