]> git.lizzy.rs Git - rust.git/blob - build_system/config.rs
ef540cf1f822b467b80adbc23f2c490e96c647ac
[rust.git] / build_system / config.rs
1 use std::{fs, process};
2
3 fn load_config_file() -> Vec<(String, Option<String>)> {
4     fs::read_to_string("config.txt")
5         .unwrap()
6         .lines()
7         .map(|line| if let Some((line, _comment)) = line.split_once('#') { line } else { line })
8         .map(|line| line.trim())
9         .filter(|line| !line.is_empty())
10         .map(|line| {
11             if let Some((key, val)) = line.split_once('=') {
12                 (key.trim().to_owned(), Some(val.trim().to_owned()))
13             } else {
14                 (line.to_owned(), None)
15             }
16         })
17         .collect()
18 }
19
20 pub(crate) fn get_bool(name: &str) -> bool {
21     let values = load_config_file()
22         .into_iter()
23         .filter(|(key, _)| key == name)
24         .map(|(_, val)| val)
25         .collect::<Vec<_>>();
26     if values.is_empty() {
27         false
28     } else {
29         if values.iter().any(|val| val.is_some()) {
30             eprintln!("Boolean config `{}` has a value", name);
31             process::exit(1);
32         }
33         true
34     }
35 }
36
37 pub(crate) fn get_value(name: &str) -> Option<String> {
38     let values = load_config_file()
39         .into_iter()
40         .filter(|(key, _)| key == name)
41         .map(|(_, val)| val)
42         .collect::<Vec<_>>();
43     if values.is_empty() {
44         None
45     } else if values.len() == 1 {
46         if values[0].is_none() {
47             eprintln!("Config `{}` missing value", name);
48             process::exit(1);
49         }
50         values.into_iter().next().unwrap()
51     } else {
52         eprintln!("Config `{}` given multiple values: {:?}", name, values);
53         process::exit(1);
54     }
55 }