webserver_config/
nginx.rs

1use crate::config::{Block, Config, ConfigItem};
2
3pub trait NginxConfig {
4	fn to_string_level(&self, level: usize) -> String;
5	fn to_nginx(&self) -> String;
6}
7
8impl NginxConfig for Block {
9
10	fn to_nginx(&self) -> String {
11		self.to_string_level(0)
12	}
13
14	fn to_string_level(&self, level: usize) -> String {
15		let padding = " ".repeat(4 * level);
16		let params = self.params.is_empty()
17			.then(String::new)
18			.unwrap_or_else(|| format!(" {}", self.params.join(" ")));
19
20		let header = format!("{}{}{} {{\n", padding, self.name, params);
21		let content = self.config.to_string_level(level + 1);
22		let footer = format!("{}}}\n", padding);
23		format!("{}{}{}", header, content, footer)
24	}
25
26}
27
28impl NginxConfig for Config {
29
30	fn to_nginx(&self) -> String {
31		self.to_string_level(0)
32	}
33
34	fn to_string_level(&self, level: usize) -> String {
35		let padding = " ".repeat(4 * level);
36		self.content.iter().map(|item| {
37			match item {
38				ConfigItem::Directive(d) => {
39					format!("{}{} {};\n", padding, d.name, d.values.join(" "))
40				},
41				ConfigItem::Block(b) => b.to_string_level(level)
42			}
43		}).collect()
44	}
45
46}