mirror of
https://github.com/lsd-rs/lsd
synced 2025-01-05 16:38:50 +00:00
style: add config for symlink arrow
This commit is contained in:
parent
8ed0611bf8
commit
ce6ebc170a
4 changed files with 74 additions and 3 deletions
|
@ -286,7 +286,7 @@ fn get_output<'a>(
|
||||||
ANSIStrings(&[
|
ANSIStrings(&[
|
||||||
meta.name.render(colors, icons, &display_option),
|
meta.name.render(colors, icons, &display_option),
|
||||||
meta.indicator.render(&flags),
|
meta.indicator.render(&flags),
|
||||||
meta.symlink.render(colors),
|
meta.symlink.render(colors, &flags.styles),
|
||||||
])
|
])
|
||||||
.to_string()
|
.to_string()
|
||||||
};
|
};
|
||||||
|
|
11
src/flags.rs
11
src/flags.rs
|
@ -33,6 +33,7 @@ pub use sorting::SortColumn;
|
||||||
pub use sorting::SortOrder;
|
pub use sorting::SortOrder;
|
||||||
pub use sorting::Sorting;
|
pub use sorting::Sorting;
|
||||||
pub use symlinks::NoSymlink;
|
pub use symlinks::NoSymlink;
|
||||||
|
pub use symlinks::SymlinkArrow;
|
||||||
pub use total_size::TotalSize;
|
pub use total_size::TotalSize;
|
||||||
|
|
||||||
use crate::config_file::Config;
|
use crate::config_file::Config;
|
||||||
|
@ -59,6 +60,13 @@ pub struct Flags {
|
||||||
pub size: SizeFlag,
|
pub size: SizeFlag,
|
||||||
pub sorting: Sorting,
|
pub sorting: Sorting,
|
||||||
pub total_size: TotalSize,
|
pub total_size: TotalSize,
|
||||||
|
pub styles: Styles,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A struct to hold the style flags for the application.
|
||||||
|
#[derive(Clone, Debug, Default)]
|
||||||
|
pub struct Styles {
|
||||||
|
pub symlink_arrow: SymlinkArrow,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Flags {
|
impl Flags {
|
||||||
|
@ -84,6 +92,9 @@ impl Flags {
|
||||||
recursion: Recursion::configure_from(matches, config)?,
|
recursion: Recursion::configure_from(matches, config)?,
|
||||||
sorting: Sorting::configure_from(matches, config),
|
sorting: Sorting::configure_from(matches, config),
|
||||||
total_size: TotalSize::configure_from(matches, config),
|
total_size: TotalSize::configure_from(matches, config),
|
||||||
|
styles: Styles {
|
||||||
|
symlink_arrow: SymlinkArrow::configure_from(matches, config),
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,53 @@ impl Configurable<Self> for NoSymlink {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The flag showing how to display symbolic arrow.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct SymlinkArrow(String);
|
||||||
|
|
||||||
|
impl Configurable<Self> for SymlinkArrow {
|
||||||
|
/// `SymlinkArrow` can not be configured by [ArgMatches]
|
||||||
|
///
|
||||||
|
/// Return `None`
|
||||||
|
fn from_arg_matches(_: &ArgMatches) -> Option<Self> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
/// Get a potential `SymlinkArrow` value from a [Config].
|
||||||
|
///
|
||||||
|
/// If the Config's [Yaml] contains the [String](Yaml::String) value pointed to by
|
||||||
|
/// "symlink-arrow", this returns its value as the value of the `SymlinkArrow`, in a [Some].
|
||||||
|
/// Otherwise this returns [None].
|
||||||
|
fn from_config(config: &Config) -> Option<Self> {
|
||||||
|
if let Some(yaml) = &config.yaml {
|
||||||
|
match &yaml["styles"]["symlink-arrow"] {
|
||||||
|
Yaml::BadValue => None,
|
||||||
|
Yaml::String(value) => Some(SymlinkArrow(value.to_string())),
|
||||||
|
_ => {
|
||||||
|
config.print_wrong_type_warning("symlink-arrow", "string");
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The default value for the `SymlinkArrow` is `\u{21d2}(⇒)`
|
||||||
|
impl Default for SymlinkArrow {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self(String::from("\u{21d2}")) // ⇒
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
impl fmt::Display for SymlinkArrow {
|
||||||
|
// This trait requires `fmt` with this exact signature.
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "{}", self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::NoSymlink;
|
use super::NoSymlink;
|
||||||
|
@ -101,4 +148,16 @@ mod test {
|
||||||
NoSymlink::from_config(&Config::with_yaml(yaml))
|
NoSymlink::from_config(&Config::with_yaml(yaml))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use super::SymlinkArrow;
|
||||||
|
#[test]
|
||||||
|
fn test_from_config_arrow_utf8() {
|
||||||
|
let yaml_string = "styles:
|
||||||
|
symlink-arrow: ↹";
|
||||||
|
let yaml = YamlLoader::load_from_str(yaml_string).unwrap()[0].clone();
|
||||||
|
assert_eq!(
|
||||||
|
Some(SymlinkArrow(String::from("\u{21B9}"))),
|
||||||
|
SymlinkArrow::from_config(&Config::with_yaml(yaml))
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::color::{ColoredString, Colors, Elem};
|
use crate::color::{ColoredString, Colors, Elem};
|
||||||
|
use crate::flags::Styles;
|
||||||
use ansi_term::{ANSIString, ANSIStrings};
|
use ansi_term::{ANSIString, ANSIStrings};
|
||||||
use std::fs::read_link;
|
use std::fs::read_link;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
@ -51,7 +52,7 @@ impl SymLink {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render(&self, colors: &Colors) -> ColoredString {
|
pub fn render(&self, colors: &Colors, styles: &Styles) -> ColoredString {
|
||||||
if let Some(target_string) = self.symlink_string() {
|
if let Some(target_string) = self.symlink_string() {
|
||||||
let elem = if self.valid {
|
let elem = if self.valid {
|
||||||
&Elem::SymLink
|
&Elem::SymLink
|
||||||
|
@ -60,7 +61,7 @@ impl SymLink {
|
||||||
};
|
};
|
||||||
|
|
||||||
let strings: &[ColoredString] = &[
|
let strings: &[ColoredString] = &[
|
||||||
ColoredString::from(" \u{21d2} "), // ⇒
|
ColoredString::from(format!(" {} ", styles.symlink_arrow)), // ⇒ \u{21d2}
|
||||||
colors.colorize(target_string, elem),
|
colors.colorize(target_string, elem),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue