pub(super) fn apply_nasa_mode_fixes(formatted_code: &mut String) {
*formatted_code = formatted_code.replace("serde_json::Value", "String");
*formatted_code = formatted_code.replace("serde_json :: Value", "String");
*formatted_code = formatted_code.replace("serde_json::to_string(&", "format!(\"{:?}\", &");
*formatted_code = formatted_code.replace("serde_json :: to_string(&", "format!(\"{:?}\", &");
*formatted_code = formatted_code.replace("serde_json::json!", "format!(\"{:?}\", ");
*formatted_code = formatted_code.replace("serde_json :: json !", "format!(\"{:?}\", ");
*formatted_code = formatted_code.replace("serde_json::from_str::<String>(", "String::from(");
*formatted_code = formatted_code.replace("use serde_json;\n", "");
*formatted_code = formatted_code.replace("use serde_json ;\n", "");
*formatted_code = formatted_code.replace("use serde;\n", "");
*formatted_code = formatted_code.replace("use base64::Engine;\n", "");
*formatted_code = formatted_code.replace("use tokio;\n", "");
*formatted_code = formatted_code.replace("use rand;\n", "");
*formatted_code = formatted_code.replace("use regex;\n", "");
*formatted_code = formatted_code.replace("use itertools::Itertools;\n", "");
*formatted_code = formatted_code.replace("use itertools :: Itertools ;\n", "");
*formatted_code = formatted_code.replace("use itertools;\n", "");
*formatted_code = formatted_code.replace("use chrono::prelude::*;\n", "");
*formatted_code = formatted_code.replace("use chrono;\n", "");
*formatted_code = formatted_code.replace("use anyhow;\n", "");
*formatted_code = formatted_code.replace("use thiserror;\n", "");
*formatted_code = formatted_code.replace("use digest::Digest;\n", "");
*formatted_code = formatted_code.replace("use digest :: Digest ;\n", "");
*formatted_code = formatted_code.replace("use sha2::Sha256;\n", "");
*formatted_code = formatted_code.replace("use sha2 :: Sha256 ;\n", "");
*formatted_code = formatted_code.replace("use base64::prelude::*;\n", "");
*formatted_code = formatted_code.replace("use base64 :: prelude :: * ;\n", "");
*formatted_code = formatted_code.replace("use csv;\n", "");
*formatted_code = formatted_code.replace("use walkdir;\n", "");
*formatted_code = formatted_code.replace("use glob;\n", "");
*formatted_code = formatted_code.replace("use url;\n", "");
*formatted_code = formatted_code.replace("use md5;\n", "");
*formatted_code = formatted_code.replace("use sha2;\n", "");
*formatted_code = formatted_code.replace(
"base64::engine::general_purpose::STANDARD.encode(",
"format!(\"{:?}\", ",
);
*formatted_code = formatted_code.replace(
"base64::engine::general_purpose::STANDARD\n .encode(",
"format!(\"{:?}\", ",
);
*formatted_code = formatted_code.replace(
"base64::engine::general_purpose::STANDARD.decode(",
"format!(\"{:?}\", ",
);
*formatted_code = formatted_code.replace(
"base64::engine::general_purpose::STANDARD\n .decode(",
"format!(\"{:?}\", ",
);
*formatted_code = formatted_code.replace(
"base64::engine::general_purpose::URL_SAFE.encode(",
"format!(\"{:?}\", ",
);
*formatted_code = formatted_code.replace(
"base64::engine::general_purpose::URL_SAFE\n .encode(",
"format!(\"{:?}\", ",
);
*formatted_code = formatted_code.replace("use base64;\n", "");
*formatted_code = formatted_code.replace("use serde;\n", "");
*formatted_code = formatted_code.replace("use serde::Serialize;\n", "");
*formatted_code = formatted_code.replace("use serde::Deserialize;\n", "");
*formatted_code = formatted_code.replace("use serde::{Serialize, Deserialize};\n", "");
*formatted_code = formatted_code.replace(", serde::Serialize, serde::Deserialize", "");
*formatted_code = formatted_code.replace(", serde :: Serialize, serde :: Deserialize", "");
*formatted_code = formatted_code.replace("serde::Serialize, serde::Deserialize, ", "");
*formatted_code = formatted_code.replace("serde::Serialize, serde::Deserialize", "");
*formatted_code = formatted_code.replace("use sha2::Digest;\n", "");
*formatted_code = formatted_code.replace("use sha2 :: Digest;\n", "");
*formatted_code = formatted_code.replace(
"sha2::Sha256::new()",
"std::collections::hash_map::DefaultHasher::new()",
);
*formatted_code = formatted_code.replace(
"sha2 :: Sha256 :: new()",
"std::collections::hash_map::DefaultHasher::new()",
);
*formatted_code = formatted_code.replace(
"Box::new(sha2::Sha256::new()) as Box<dyn DynDigest>",
"format!(\"sha256_stub\")",
);
*formatted_code = formatted_code.replace(
"sha2::Sha512::new()",
"std::collections::hash_map::DefaultHasher::new()",
);
*formatted_code = formatted_code.replace("use digest::DynDigest;\n", "");
*formatted_code = formatted_code.replace("use digest :: DynDigest;\n", "");
*formatted_code = formatted_code.replace(": Box<dyn DynDigest>", ": String");
*formatted_code = formatted_code.replace("Option<UnionType>", "Option<String>");
*formatted_code = formatted_code.replace("Vec<UnionType>", "Vec<String>");
*formatted_code = formatted_code.replace("&Vec<UnionType>", "&Vec<String>");
*formatted_code = formatted_code.replace("HashMap<UnionType,", "HashMap<String,");
*formatted_code = formatted_code.replace(", UnionType>", ", String>");
*formatted_code = formatted_code.replace(": UnionType", ": String");
*formatted_code = formatted_code.replace("(UnionType)", "(String)");
*formatted_code = formatted_code.replace("<UnionType>", "<String>");
*formatted_code = formatted_code.replace("use md5;\n", "");
*formatted_code = formatted_code.replace("use sha1;\n", "");
*formatted_code = formatted_code.replace("md5::compute(", "format!(\"md5:{:?}\", ");
*formatted_code = formatted_code.replace("sha1::Sha1::digest(", "format!(\"sha1:{:?}\", ");
*formatted_code = formatted_code.replace(
"format!(\"{:?}\", encoded)\n .unwrap()",
"format!(\"{:?}\", encoded)",
);
*formatted_code = formatted_code.replace(
"format!(\"{:?}\", data)\n .unwrap()",
"format!(\"{:?}\", data)",
);
*formatted_code = formatted_code.replace(
"format!(\"{:?}\", b\"\")\n .unwrap()",
"format!(\"{:?}\", b\"\")",
);
*formatted_code = formatted_code.replace(
"format!(\"{:?}\", original)\n .unwrap()",
"format!(\"{:?}\", original)",
);
*formatted_code =
formatted_code.replace("csv::Reader::from_reader(", "std::io::BufReader::new(");
*formatted_code =
formatted_code.replace("csv::Writer::from_writer(", "std::io::BufWriter::new(");
*formatted_code = formatted_code.replace(
"csv::ReaderBuilder::new().has_headers(true).from_reader(",
"std::io::BufReader::new(",
);
*formatted_code = formatted_code.replace("walkdir::WalkDir::new(", "std::fs::read_dir(");
*formatted_code = formatted_code.replace("glob::glob(", "vec![std::path::PathBuf::from(");
*formatted_code = formatted_code.replace("url::Url::parse(", "String::from(");
*formatted_code = formatted_code.replace("url::Url::join(", "format!(\"{}{}\", ");
*formatted_code = formatted_code.replace("tokio::spawn(", "std::thread::spawn(");
*formatted_code = formatted_code.replace("tokio :: spawn(", "std::thread::spawn(");
*formatted_code = formatted_code.replace("tokio::time::timeout(", "Some(");
*formatted_code = formatted_code.replace("tokio::time::sleep(", "std::thread::sleep(");
*formatted_code = formatted_code.replace("tokio::join!(", "(");
*formatted_code = formatted_code.replace(".copied()", ".cloned()");
*formatted_code = formatted_code.replace("#[derive(clap::Parser)]\n", "#[derive(Default)]\n");
*formatted_code = formatted_code.replace("#[derive(clap :: Parser)]\n", "#[derive(Default)]\n");
*formatted_code = formatted_code.replace(
"#[derive(clap::Parser, Debug)]\n",
"#[derive(Debug, Default)]\n",
);
*formatted_code = formatted_code.replace(
"#[derive(clap::Parser, Debug, Clone)]\n",
"#[derive(Debug, Clone, Default)]\n",
);
*formatted_code = formatted_code.replace("#[derive(clap::Parser)] ", "#[derive(Default)] ");
*formatted_code = formatted_code.replace("#[derive(clap :: Parser)] ", "#[derive(Default)] ");
*formatted_code =
formatted_code.replace("#[derive(clap::Subcommand)]\n", "#[derive(Default)]\n");
*formatted_code =
formatted_code.replace("#[derive(clap :: Subcommand)]\n", "#[derive(Default)]\n");
*formatted_code = formatted_code.replace("#[derive(clap::Subcommand)] ", "#[derive(Default)] ");
*formatted_code =
formatted_code.replace("#[derive(clap :: Subcommand)] ", "#[derive(Default)] ");
*formatted_code = formatted_code.replace(
"enum Commands {\n",
"enum Commands {\n #[default]\n __DepylerNone,\n",
);
*formatted_code = formatted_code.replace("#[command(author, version, about)]\n", "");
while let Some(start) = formatted_code.find("#[command(") {
if let Some(end) = formatted_code[start..].find(")]") {
let attr_end = start + end + 2;
let remove_end = if formatted_code.as_bytes().get(attr_end) == Some(&b' ') {
attr_end + 1
} else {
attr_end
};
*formatted_code = format!(
"{}{}",
&formatted_code[..start],
&formatted_code[remove_end..]
);
} else {
break;
}
}
while let Some(start) = formatted_code.find("#[arg(") {
if let Some(end) = formatted_code[start..].find(")]") {
let attr_end = start + end + 2;
let remove_end = if formatted_code.as_bytes().get(attr_end) == Some(&b' ') {
attr_end + 1
} else {
attr_end
};
*formatted_code = format!(
"{}{}",
&formatted_code[..start],
&formatted_code[remove_end..]
);
} else {
break;
}
}
if !formatted_code.ends_with('\n') {
formatted_code.push('\n');
}
*formatted_code = formatted_code.replace("use clap::Parser;\n", "");
*formatted_code = formatted_code.replace("use clap :: Parser;\n", "");
*formatted_code = formatted_code.replace("use clap;\n", "");
*formatted_code = formatted_code
.lines()
.filter(|line| !line.trim().starts_with("use clap::CommandFactory"))
.collect::<Vec<_>>()
.join("\n");
if !formatted_code.ends_with('\n') {
formatted_code.push('\n');
}
*formatted_code = formatted_code.replace("Args::command().print_help().unwrap()", "()");
*formatted_code = formatted_code.replace("Args :: command().print_help().unwrap()", "()");
*formatted_code = formatted_code.replace("Args::parse()", "Args::default()");
*formatted_code = formatted_code.replace("Args :: parse()", "Args::default()");
*formatted_code = formatted_code
.lines()
.map(|line| {
let trimmed = line.trim();
if trimmed.starts_with("let _context = pytest.raises(")
|| trimmed.starts_with("let _context = pytest .raises(")
|| trimmed == "let _context = pytest.raises("
{
let indent = &line[..line.len() - trimmed.len()];
format!("{}let _context = ();", indent)
} else if trimmed.contains("pytest.") {
let indent = &line[..line.len() - trimmed.len()];
format!("{}// pytest stub: {}", indent, trimmed)
} else {
line.to_string()
}
})
.collect::<Vec<_>>()
.join("\n");
if !formatted_code.ends_with('\n') {
formatted_code.push('\n');
}
}