1use super::*;
2
3#[derive(Clone, Debug, Default)]
5pub struct Config {
6 pub max_width: Option<usize>,
8 pub fixed_zero_padding: Option<usize>,
10 pub fixed_number: Option<usize>,
12 pub fixed_ordered_list_marker: Option<OrderedListMarker>,
14 pub fixed_unordered_list_marker: Option<UnorderedListMarker>,
16 pub fixed_indentation: Option<Cow<'static, str>>,
18}
19
20impl Config {
21 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 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 #[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}