mirror of
https://github.com/Llewellynvdm/starship.git
synced 2024-11-24 21:57:41 +00:00
c8a5adb412
* Add starship preset command * Use ValueEnum for preset command * Generate ValueEnum struct in build.rs * Use absolute paths and refactor codegen * Use dunce to canonicalize path * Use raw string literal in include_bytes! * Use .cloned() * Apply fixes * Fix path escaping * Removed error message if stdout is unavailable Co-authored-by: David Knaack <davidkna@users.noreply.github.com> Co-authored-by: David Knaack <davidkna@users.noreply.github.com>
72 lines
1.7 KiB
Rust
72 lines
1.7 KiB
Rust
use std::fs::{self, File};
|
|
use std::io::Write;
|
|
|
|
use shadow_rs::SdResult;
|
|
|
|
fn main() -> SdResult<()> {
|
|
shadow_rs::new().map_err(|err| err.to_string())?;
|
|
shadow_rs::new_hook(gen_presets_hook)?;
|
|
|
|
#[cfg(windows)]
|
|
{
|
|
let mut res = winres::WindowsResource::new();
|
|
res.set_manifest_file("starship.exe.manifest")
|
|
.set_icon("media/icon.ico");
|
|
res.compile()?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn gen_presets_hook(mut file: &File) -> SdResult<()> {
|
|
println!("cargo:rerun-if-changed=docs/.vuepress/public/presets/toml");
|
|
let paths = fs::read_dir("docs/.vuepress/public/presets/toml")?;
|
|
|
|
let mut presets = String::new();
|
|
let mut match_arms = String::new();
|
|
for path in paths {
|
|
let unwrapped = path?;
|
|
let file_name = unwrapped.file_name();
|
|
let full_path = dunce::canonicalize(unwrapped.path())?;
|
|
let full_path = full_path.to_str().expect("failed to convert to string");
|
|
let name = file_name
|
|
.to_str()
|
|
.and_then(|v| v.strip_suffix(".toml"))
|
|
.expect("Failed to process filename");
|
|
presets.push_str(format!("print::Preset(\"{}\"),\n", name).as_str());
|
|
match_arms.push_str(
|
|
format!(
|
|
r#"
|
|
"{name}" => {{
|
|
let mut stdout = io::stdout().lock();
|
|
let _ = stdout.write_all(include_bytes!(r"{full_path}"));
|
|
}}
|
|
"#
|
|
)
|
|
.as_str(),
|
|
);
|
|
}
|
|
|
|
writeln!(
|
|
file,
|
|
r#"
|
|
use std::io::{{self, Write}};
|
|
use crate::print;
|
|
|
|
pub fn get_preset_list<'a>() -> &'a [print::Preset] {{
|
|
&[
|
|
{presets}
|
|
]
|
|
}}
|
|
|
|
pub fn print_preset_content(name: &str) {{
|
|
match name {{
|
|
{match_arms}
|
|
_ => {{}}
|
|
}}
|
|
}}
|
|
"#
|
|
)?;
|
|
Ok(())
|
|
}
|