Skip to content

Commit

Permalink
styling: 🔨 move symlink arrow to styling mod and use styling
Browse files Browse the repository at this point in the history
fix #409
  • Loading branch information
zwpaper authored and meain committed Nov 2, 2020
1 parent 8c2dc69 commit b1f37c1
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 91 deletions.
3 changes: 2 additions & 1 deletion src/flags.rs
Expand Up @@ -10,6 +10,7 @@ pub mod layout;
pub mod recursion;
pub mod size;
pub mod sorting;
pub mod styling;
pub mod symlinks;
pub mod total_size;

Expand All @@ -32,8 +33,8 @@ pub use sorting::DirGrouping;
pub use sorting::SortColumn;
pub use sorting::SortOrder;
pub use sorting::Sorting;
pub use styling::SymlinkArrow;
pub use symlinks::NoSymlink;
pub use symlinks::SymlinkArrow;
pub use total_size::TotalSize;

use crate::config_file::Config;
Expand Down
103 changes: 103 additions & 0 deletions src/flags/styling.rs
@@ -0,0 +1,103 @@
use super::Configurable;

use crate::config_file::Config;

use clap::ArgMatches;
use yaml_rust::Yaml;

/// 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["styling"]["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)]
mod test {
use crate::config_file::Config;
use crate::flags::Configurable;

use yaml_rust::YamlLoader;

use super::SymlinkArrow;
#[test]
fn test_symlink_arrow_from_config_utf8() {
let yaml_string = "styling:
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))
);
}

#[test]
fn test_symlink_arrow_from_config_type_error() {
let yaml_string = "styling:
symlink-arrow: false";
let yaml = YamlLoader::load_from_str(yaml_string).unwrap()[0].clone();
assert_eq!(None, SymlinkArrow::from_config(&Config::with_yaml(yaml)));
}

#[test]
fn test_symlink_arrow_from_args_none() {
use clap::App;
assert_eq!(
None,
SymlinkArrow::from_arg_matches(&App::new("lsd").get_matches())
);
}

#[test]
fn test_symlink_arrow_default() {
assert_eq!(
SymlinkArrow(String::from("\u{21d2}")),
SymlinkArrow::default()
);
}

#[test]
fn test_symlink_display() {
assert_eq!("⇒", format!("{}", SymlinkArrow::default()));
}
}
89 changes: 0 additions & 89 deletions src/flags/symlinks.rs
Expand Up @@ -46,53 +46,6 @@ 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)]
mod test {
use super::NoSymlink;
Expand Down Expand Up @@ -148,46 +101,4 @@ mod test {
NoSymlink::from_config(&Config::with_yaml(yaml))
);
}

use super::SymlinkArrow;
#[test]
fn test_symlink_arrow_from_config_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))
);
}

#[test]
fn test_symlink_arrow_from_config_type_error() {
let yaml_string = "styles:
symlink-arrow: false";
let yaml = YamlLoader::load_from_str(yaml_string).unwrap()[0].clone();
assert_eq!(None, SymlinkArrow::from_config(&Config::with_yaml(yaml)));
}

#[test]
fn test_symlink_arrow_from_args_none() {
use clap::App;
assert_eq!(
None,
SymlinkArrow::from_arg_matches(&App::new("lsd").get_matches())
);
}

#[test]
fn test_symlink_arrow_default() {
assert_eq!(
SymlinkArrow(String::from("\u{21d2}")),
SymlinkArrow::default()
);
}

#[test]
fn test_symlink_display() {
assert_eq!("⇒", format!("{}", SymlinkArrow::default()));
}
}
2 changes: 1 addition & 1 deletion src/meta/symlink.rs
Expand Up @@ -78,7 +78,7 @@ mod tests {
use super::Styles;
use super::SymLink;
use crate::color::{Colors, Theme};
use crate::flags::symlinks::SymlinkArrow;
use crate::flags::styling::SymlinkArrow;

#[test]
fn test_symlink_render_default_valid_target_nocolor() {
Expand Down

0 comments on commit b1f37c1

Please sign in to comment.