use crate::color::{ColoredString, Colors};
use crate::flags::Flags;
use crate::meta::FileType;
#[derive(Clone, Debug)]
pub struct Indicator(&'static str);
impl From<FileType> for Indicator {
fn from(file_type: FileType) -> Self {
let res = match file_type {
FileType::Directory { .. } => "/",
FileType::File { exec: true, .. } => "*",
FileType::Pipe => "|",
FileType::Socket => "=",
FileType::SymLink { .. } => "@",
_ => "",
};
Indicator(res)
}
}
impl Indicator {
pub fn render(&self, flags: &Flags) -> ColoredString {
if flags.display_indicators.0 {
ColoredString::new(Colors::default_style(), self.0.to_string())
} else {
ColoredString::new(Colors::default_style(), "".into())
}
}
}
#[cfg(test)]
mod test {
use super::Indicator;
use crate::flags::{Flags, Indicators};
use crate::meta::FileType;
#[test]
fn test_directory_indicator() {
let flags = Flags {
display_indicators: Indicators(true),
..Default::default()
};
let file_type = Indicator::from(FileType::Directory { uid: false });
assert_eq!("/", file_type.render(&flags).to_string());
}
#[test]
fn test_executable_file_indicator() {
let flags = Flags {
display_indicators: Indicators(true),
..Default::default()
};
let file_type = Indicator::from(FileType::File {
uid: false,
exec: true,
});
assert_eq!("*", file_type.render(&flags).to_string());
}
#[test]
fn test_socket_indicator() {
let flags = Flags {
display_indicators: Indicators(true),
..Default::default()
};
let file_type = Indicator::from(FileType::Socket);
assert_eq!("=", file_type.render(&flags).to_string());
}
#[test]
fn test_symlink_indicator() {
let flags = Flags {
display_indicators: Indicators(true),
..Default::default()
};
let file_type = Indicator::from(FileType::SymLink { is_dir: false });
assert_eq!("@", file_type.render(&flags).to_string());
let file_type = Indicator::from(FileType::SymLink { is_dir: true });
assert_eq!("@", file_type.render(&flags).to_string());
}
#[test]
fn test_not_represented_indicator() {
let flags = Flags {
display_indicators: Indicators(true),
..Default::default()
};
let file_type = Indicator::from(FileType::File {
exec: false,
uid: false,
});
assert_eq!("", file_type.render(&flags).to_string());
}
}