mirror of
https://github.com/Llewellynvdm/starship.git
synced 2024-12-01 01:04:00 +00:00
feat: Add starship preset command (#4112)
* 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>
This commit is contained in:
parent
b456b9c519
commit
c8a5adb412
@ -110,6 +110,7 @@ nix = { version = "0.24.2", default-features = false, features = ["feature", "fs
|
|||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
shadow-rs = "0.16.1"
|
shadow-rs = "0.16.1"
|
||||||
|
dunce = "1.0.2"
|
||||||
|
|
||||||
[target.'cfg(windows)'.build-dependencies]
|
[target.'cfg(windows)'.build-dependencies]
|
||||||
winres = "0.1.12"
|
winres = "0.1.12"
|
||||||
|
60
build.rs
60
build.rs
@ -1,7 +1,11 @@
|
|||||||
use std::error::Error;
|
use std::fs::{self, File};
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
use shadow_rs::SdResult;
|
||||||
|
|
||||||
|
fn main() -> SdResult<()> {
|
||||||
shadow_rs::new().map_err(|err| err.to_string())?;
|
shadow_rs::new().map_err(|err| err.to_string())?;
|
||||||
|
shadow_rs::new_hook(gen_presets_hook)?;
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
{
|
{
|
||||||
@ -13,3 +17,55 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
|
|
||||||
Ok(())
|
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(())
|
||||||
|
}
|
||||||
|
@ -9,6 +9,10 @@ in brackets instead of using the default Starship wording ("via", "on", etc.).
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
|
```sh
|
||||||
|
starship preset bracketed-segments > ~/.config/starship.toml
|
||||||
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/bracketed-segments.toml)
|
[Click to download TOML](/presets/toml/bracketed-segments.toml)
|
||||||
|
|
||||||
<<< @/.vuepress/public/presets/toml/bracketed-segments.toml
|
<<< @/.vuepress/public/presets/toml/bracketed-segments.toml
|
||||||
|
@ -12,6 +12,10 @@ This preset changes the symbols for each module to use Nerd Font symbols.
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
|
```sh
|
||||||
|
starship preset nerd-font-symbols > ~/.config/starship.toml
|
||||||
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/nerd-font-symbols.toml)
|
[Click to download TOML](/presets/toml/nerd-font-symbols.toml)
|
||||||
|
|
||||||
<<< @/.vuepress/public/presets/toml/nerd-font-symbols.toml
|
<<< @/.vuepress/public/presets/toml/nerd-font-symbols.toml
|
||||||
|
@ -8,6 +8,10 @@ This preset hides the version of language runtimes. If you work in containers or
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
|
```sh
|
||||||
|
starship preset no-runtime-versions > ~/.config/starship.toml
|
||||||
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/no-runtime-versions.toml)
|
[Click to download TOML](/presets/toml/no-runtime-versions.toml)
|
||||||
|
|
||||||
<<< @/.vuepress/public/presets/toml/no-runtime-versions.toml
|
<<< @/.vuepress/public/presets/toml/no-runtime-versions.toml
|
||||||
|
@ -13,6 +13,10 @@ It also shows how path substitution works in starship.
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
|
```sh
|
||||||
|
starship preset pastel-powerline > ~/.config/starship.toml
|
||||||
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/pastel-powerline.toml)
|
[Click to download TOML](/presets/toml/pastel-powerline.toml)
|
||||||
|
|
||||||
<<< @/.vuepress/public/presets/toml/pastel-powerline.toml
|
<<< @/.vuepress/public/presets/toml/pastel-powerline.toml
|
||||||
|
@ -9,6 +9,10 @@ don't have access to Unicode.
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
|
```sh
|
||||||
|
starship preset plain-text-symbols > ~/.config/starship.toml
|
||||||
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/plain-text-symbols.toml)
|
[Click to download TOML](/presets/toml/plain-text-symbols.toml)
|
||||||
|
|
||||||
<<< @/.vuepress/public/presets/toml/plain-text-symbols.toml
|
<<< @/.vuepress/public/presets/toml/plain-text-symbols.toml
|
||||||
|
@ -8,6 +8,10 @@ This preset emulates the look and behavior of [Pure](https://github.com/sindreso
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
|
```sh
|
||||||
|
starship preset pure-preset > ~/.config/starship.toml
|
||||||
|
```
|
||||||
|
|
||||||
[Click to download TOML](/presets/toml/pure-preset.toml)
|
[Click to download TOML](/presets/toml/pure-preset.toml)
|
||||||
|
|
||||||
<<< @/.vuepress/public/presets/toml/pure-preset.toml
|
<<< @/.vuepress/public/presets/toml/pure-preset.toml
|
||||||
|
10
src/main.rs
10
src/main.rs
@ -63,6 +63,15 @@ enum Commands {
|
|||||||
#[clap(flatten)]
|
#[clap(flatten)]
|
||||||
properties: Properties,
|
properties: Properties,
|
||||||
},
|
},
|
||||||
|
/// Prints a preset config
|
||||||
|
Preset {
|
||||||
|
/// The name of preset to be printed
|
||||||
|
#[clap(required_unless_present("list"), value_enum)]
|
||||||
|
name: Option<print::Preset>,
|
||||||
|
/// List out all preset names
|
||||||
|
#[clap(short, long)]
|
||||||
|
list: bool,
|
||||||
|
},
|
||||||
/// Prints the computed starship configuration
|
/// Prints the computed starship configuration
|
||||||
PrintConfig {
|
PrintConfig {
|
||||||
/// Print the default instead of the computed config
|
/// Print the default instead of the computed config
|
||||||
@ -182,6 +191,7 @@ fn main() {
|
|||||||
print::module(&module_name, properties);
|
print::module(&module_name, properties);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Commands::Preset { name, list } => print::preset_command(name, list),
|
||||||
Commands::Config { name, value } => {
|
Commands::Config { name, value } => {
|
||||||
if let Some(name) = name {
|
if let Some(name) = name {
|
||||||
if let Some(value) = value {
|
if let Some(value) = value {
|
||||||
|
44
src/print.rs
44
src/print.rs
@ -1,4 +1,5 @@
|
|||||||
use ansi_term::ANSIStrings;
|
use ansi_term::ANSIStrings;
|
||||||
|
use clap::{PossibleValue, ValueEnum};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
use std::fmt::{self, Debug, Write as FmtWrite};
|
use std::fmt::{self, Debug, Write as FmtWrite};
|
||||||
@ -15,6 +16,7 @@ use crate::module::Module;
|
|||||||
use crate::module::ALL_MODULES;
|
use crate::module::ALL_MODULES;
|
||||||
use crate::modules;
|
use crate::modules;
|
||||||
use crate::segment::Segment;
|
use crate::segment::Segment;
|
||||||
|
use crate::shadow;
|
||||||
|
|
||||||
pub struct Grapheme<'a>(pub &'a str);
|
pub struct Grapheme<'a>(pub &'a str);
|
||||||
|
|
||||||
@ -450,6 +452,35 @@ pub fn print_schema() {
|
|||||||
println!("{}", serde_json::to_string_pretty(&schema).unwrap());
|
println!("{}", serde_json::to_string_pretty(&schema).unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Preset(pub &'static str);
|
||||||
|
|
||||||
|
impl ValueEnum for Preset {
|
||||||
|
fn value_variants<'a>() -> &'a [Self] {
|
||||||
|
shadow::get_preset_list()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_possible_value<'a>(&self) -> Option<clap::PossibleValue<'a>> {
|
||||||
|
Some(PossibleValue::new(self.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn preset_command(name: Option<Preset>, list: bool) {
|
||||||
|
if list {
|
||||||
|
println!("{}", preset_list());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let variant = name.expect("name argument must be specified");
|
||||||
|
shadow::print_preset_content(variant.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn preset_list() -> String {
|
||||||
|
Preset::value_variants()
|
||||||
|
.iter()
|
||||||
|
.map(|v| format!("{}\n", v.0))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -490,6 +521,19 @@ mod test {
|
|||||||
assert_eq!(expected, actual);
|
assert_eq!(expected, actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn preset_list_returns_one_or_more_items() {
|
||||||
|
assert!(preset_list().trim().split('\n').count() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn preset_command_does_not_panic_on_correct_inputs() {
|
||||||
|
preset_command(None, true);
|
||||||
|
Preset::value_variants()
|
||||||
|
.iter()
|
||||||
|
.for_each(|v| preset_command(Some(v.clone()), false));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "config-schema")]
|
#[cfg(feature = "config-schema")]
|
||||||
fn print_schema_does_not_panic() {
|
fn print_schema_does_not_panic() {
|
||||||
|
Loading…
Reference in New Issue
Block a user