on 3dcf025 help sign in
bat/src/style.rs
106 lines 3.1 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 Rule,
13 Header,
14 LineNumbers,
15 Snip,
16 Full,
17 Plain,
20impl StyleComponent {
21 pub fn components(self, interactive_terminal: bool) -> &'static [StyleComponent] {
22 match self {
23 StyleComponent::Auto => {
24 if interactive_terminal {
25 StyleComponent::Full.components(interactive_terminal)
26 } else {
27 StyleComponent::Plain.components(interactive_terminal)
28 }
29 }
30 #[cfg(feature = "git")]
31 StyleComponent::Changes => &[StyleComponent::Changes],
32 StyleComponent::Grid => &[StyleComponent::Grid],
33 StyleComponent::Rule => &[StyleComponent::Rule],
34 StyleComponent::Header => &[StyleComponent::Header],
35 StyleComponent::LineNumbers => &[StyleComponent::LineNumbers],
36 StyleComponent::Snip => &[StyleComponent::Snip],
37 StyleComponent::Full => &[
38 #[cfg(feature = "git")]
39 StyleComponent::Changes,
40 StyleComponent::Grid,
41 StyleComponent::Header,
42 StyleComponent::LineNumbers,
43 StyleComponent::Snip,
44 ],
45 StyleComponent::Plain => &[],
46 }
47 }
50impl FromStr for StyleComponent {
51 type Err = Error;
53 fn from_str(s: &str) -> Result<Self> {
54 match s {
55 "auto" => Ok(StyleComponent::Auto),
56 #[cfg(feature = "git")]
57 "changes" => Ok(StyleComponent::Changes),
58 "grid" => Ok(StyleComponent::Grid),
59 "rule" => Ok(StyleComponent::Rule),
60 "header" => Ok(StyleComponent::Header),
61 "numbers" => Ok(StyleComponent::LineNumbers),
62 "snip" => Ok(StyleComponent::Snip),
63 "full" => Ok(StyleComponent::Full),
64 "plain" => Ok(StyleComponent::Plain),
65 _ => Err(format!("Unknown style '{}'", s).into()),
66 }
67 }
70#[derive(Debug, Clone, Default)]
71pub struct StyleComponents(pub HashSet<StyleComponent>);
73impl StyleComponents {
74 pub fn new(components: &[StyleComponent]) -> StyleComponents {
75 StyleComponents(components.iter().cloned().collect())
76 }
78 #[cfg(feature = "git")]
79 pub fn changes(&self) -> bool {
80 self.0.contains(&StyleComponent::Changes)
81 }
83 pub fn grid(&self) -> bool {
84 self.0.contains(&StyleComponent::Grid)
85 }
87 pub fn rule(&self) -> bool {
88 self.0.contains(&StyleComponent::Rule)
89 }
91 pub fn header(&self) -> bool {
92 self.0.contains(&StyleComponent::Header)
93 }
95 pub fn numbers(&self) -> bool {
96 self.0.contains(&StyleComponent::LineNumbers)
97 }
99 pub fn snip(&self) -> bool {
100 self.0.contains(&StyleComponent::Snip)
101 }
103 pub fn plain(&self) -> bool {
104 self.0.iter().all(|c| c == &StyleComponent::Plain)
105 }