aboutsummaryrefslogtreecommitdiffstats
path: root/renderer/src/opt.rs
blob: 224262420f8d53c6c352ccd1da8dd14cf803b1df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
pub struct RenderOptions {
	initial_header_level: u8,
}

impl Default for RenderOptions {
	fn default() -> Self {
		RenderOptions {
			initial_header_level: 0,
		}
	}
}

pub trait RenderOptionsBuilder {
	fn initial_header_level(&self) -> u8;
	fn with_initial_header_level(&mut self, lvl: u8) -> &mut Self;
}

impl RenderOptionsBuilder for RenderOptions {
	fn initial_header_level(&self) -> u8 {
		self.initial_header_level
	}
	fn with_initial_header_level(&mut self, lvl: u8) -> &mut Self {
		self.initial_header_level = lvl;
		self
	}
}

// standalone document formats

pub struct RenderOptionsStandalone {
	render_options: RenderOptions,
	standalone: bool,
}

impl Default for RenderOptionsStandalone {
	fn default() -> Self {
		RenderOptionsStandalone {
			render_options: Default::default(),
			standalone: true,
		}
	}
}

pub trait RenderOptionsStandaloneBuilder {
	fn into_render_options(self) -> RenderOptions;
	fn render_options(&self) -> &RenderOptions;
	fn render_options_mut(&mut self) -> &mut RenderOptions;
	fn standalone(&self) -> bool;
	fn with_standalone(&mut self, standalone: bool) -> &mut Self;
}

impl<T> RenderOptionsBuilder for T where T: RenderOptionsStandaloneBuilder {
	fn initial_header_level(&self) -> u8 {
		self.render_options().initial_header_level()
	}
	fn with_initial_header_level(&mut self, lvl: u8) -> &mut Self {
		self.render_options_mut().with_initial_header_level(lvl);
		self
	}
}

impl RenderOptionsStandaloneBuilder for RenderOptionsStandalone {
	fn into_render_options(self) -> RenderOptions {
		self.render_options
	}
	fn render_options(&self) -> &RenderOptions {
		&self.render_options
	}
	fn render_options_mut(&mut self) -> &mut RenderOptions {
		&mut self.render_options
	}
	fn standalone(&self) -> bool {
		self.standalone
	}
	fn with_standalone(&mut self, standalone: bool) -> &mut Self {
		self.standalone = standalone;
		self
	}
}

impl From<bool> for RenderOptionsStandalone {
	fn from(standalone: bool) -> Self {
		let mut r: RenderOptionsStandalone = Default::default();
		r.with_standalone(standalone);
		r
	}
}

impl<T> From<T> for RenderOptions where T: RenderOptionsStandaloneBuilder {
	fn from(opts: T) -> Self {
		opts.into_render_options()
	}
}