markdown_fmt/
config.rs

1use super::*;
2
3/// Configuration options for the Markdown formatter.
4#[derive(Clone, Debug, Default)]
5pub struct Config {
6    /// Maximum line width.
7    pub max_width: Option<usize>,
8    /// If set, all ordered lists will have this many leading zeroes.
9    pub fixed_zero_padding: Option<usize>,
10    /// If set, all ordered lists will begin with this number.
11    pub fixed_number: Option<usize>,
12    /// If set, all ordered lists will have this marker after the number.
13    pub fixed_ordered_list_marker: Option<OrderedListMarker>,
14    /// If set, all unordered lists will begin with this marker.
15    pub fixed_unordered_list_marker: Option<UnorderedListMarker>,
16    /// If set, all lists will have this many indentation per level.
17    pub fixed_indentation: Option<Cow<'static, str>>,
18}
19
20impl Config {
21    /// Steven Hé (Sīchàng)'s opinion on the style.
22    pub fn sichanghe_opinion() -> Self {
23        Self {
24            max_width: Some(80),
25            fixed_zero_padding: Some(0),
26            fixed_number: Some(1),
27            fixed_ordered_list_marker: Some(OrderedListMarker::Period),
28            fixed_unordered_list_marker: Some(UnorderedListMarker::Hyphen),
29            fixed_indentation: Some("    ".into()),
30        }
31    }
32
33    /// Parse a list marker from string with this configuration.
34    pub fn list_marker(&self, source: &str) -> Result<ListMarker, ParseListMarkerError> {
35        Ok(match ListMarker::from_str(source)? {
36            ListMarker::Ordered {
37                zero_padding,
38                number,
39                marker,
40            } => {
41                let zero_padding = match self.fixed_zero_padding {
42                    Some(fixed_zero_padding) => fixed_zero_padding,
43                    None => zero_padding,
44                };
45                let number = match self.fixed_number {
46                    Some(fixed_number) => fixed_number,
47                    None => number,
48                };
49                let marker = match &self.fixed_ordered_list_marker {
50                    Some(fixed_marker) => fixed_marker.clone(),
51                    None => marker,
52                };
53                ListMarker::Ordered {
54                    zero_padding,
55                    number,
56                    marker,
57                }
58            }
59            marker @ ListMarker::Unordered(_) => match &self.fixed_unordered_list_marker {
60                Some(fixed_marker) => ListMarker::Unordered(fixed_marker.clone()),
61                None => marker,
62            },
63        })
64    }
65
66    /// Internal setter for config options. Used for testing
67    #[cfg(test)]
68    pub(crate) fn set(&mut self, field: &str, value: &str) {
69        match field {
70            "max_width" => {
71                let value = value.parse::<usize>().unwrap();
72                self.max_width = Some(value)
73            }
74            _ => panic!("unknown configuration {field}"),
75        }
76    }
77}