on a70efae help sign in
bat/src/style.rs
99 lines 2.9 kB history raw
1use std::collections::HashSet;
2use std::str::FromStr;
4use crate::error::*;
6#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
7pub enum StyleComponent {
8 Auto,
9 #[cfg(feature = "git")]
10 Changes,
11 Grid,
12 Header,
13 LineNumbers,
14 Snip,
15 Full,
16 Plain,
19impl StyleComponent {
20 pub fn components(self, interactive_terminal: bool) -> &'static [StyleComponent] {
21 match self {
22 StyleComponent::Auto => {
23 if interactive_terminal {
24 StyleComponent::Full.components(interactive_terminal)
25 } else {
26 StyleComponent::Plain.components(interactive_terminal)
27 }
28 }
29 #[cfg(feature = "git")]
30 StyleComponent::Changes => &[StyleComponent::Changes],
31 StyleComponent::Grid => &[StyleComponent::Grid],
32 StyleComponent::Header => &[StyleComponent::Header],
33 StyleComponent::LineNumbers => &[StyleComponent::LineNumbers],
34 StyleComponent::Snip => &[StyleComponent::Snip],
35 StyleComponent::Full => &[
36 #[cfg(feature = "git")]
37 StyleComponent::Changes,
38 StyleComponent::Grid,
39 StyleComponent::Header,
40 StyleComponent::LineNumbers,
41 StyleComponent::Snip,
42 ],
43 StyleComponent::Plain => &[],
44 }
45 }
48impl FromStr for StyleComponent {
49 type Err = Error;
51 fn from_str(s: &str) -> Result<Self> {
52 match s {
53 "auto" => Ok(StyleComponent::Auto),
54 #[cfg(feature = "git")]
55 "changes" => Ok(StyleComponent::Changes),
56 "grid" => Ok(StyleComponent::Grid),
57 "header" => Ok(StyleComponent::Header),
58 "numbers" => Ok(StyleComponent::LineNumbers),
59 "snip" => Ok(StyleComponent::Snip),
60 "full" => Ok(StyleComponent::Full),
61 "plain" => Ok(StyleComponent::Plain),
62 _ => Err(format!("Unknown style '{}'", s).into()),
63 }
64 }
67#[derive(Debug, Clone, Default)]
68pub struct StyleComponents(pub HashSet<StyleComponent>);
70impl StyleComponents {
71 pub fn new(components: &[StyleComponent]) -> StyleComponents {
72 StyleComponents(components.iter().cloned().collect())
73 }
75 #[cfg(feature = "git")]
76 pub fn changes(&self) -> bool {
77 self.0.contains(&StyleComponent::Changes)
78 }
80 pub fn grid(&self) -> bool {
81 self.0.contains(&StyleComponent::Grid)
82 }
84 pub fn header(&self) -> bool {
85 self.0.contains(&StyleComponent::Header)
86 }
88 pub fn numbers(&self) -> bool {
89 self.0.contains(&StyleComponent::LineNumbers)
90 }
92 pub fn snip(&self) -> bool {
93 self.0.contains(&StyleComponent::Snip)
94 }
96 pub fn plain(&self) -> bool {
97 self.0.iter().all(|c| c == &StyleComponent::Plain)
98 }