1pub mod args;
2pub mod block;
3mod conversions;
4mod entry;
5pub mod error;
6pub mod header;
7pub mod settings;
8pub mod used_values;
9pub mod value;
10
11use block::Config;
12use error::LayoutError;
13use std::path::Path;
14
15pub fn load_layout(filename: &str) -> Result<Config, LayoutError> {
16 let text = std::fs::read_to_string(filename)
17 .map_err(|_| LayoutError::FileError(format!("failed to open file: {}", filename)))?;
18
19 let ext = Path::new(filename)
20 .extension()
21 .and_then(|s| s.to_str())
22 .map(|s| s.to_ascii_lowercase())
23 .unwrap_or_default();
24
25 let cfg: Config = match ext.as_str() {
26 "toml" => toml::from_str(&text).map_err(|e| {
27 LayoutError::FileError(format!("failed to parse file {}: {}", filename, e))
28 })?,
29 "yaml" | "yml" => serde_yaml::from_str(&text).map_err(|e| {
30 LayoutError::FileError(format!("failed to parse file {}: {}", filename, e))
31 })?,
32 "json" => serde_json::from_str(&text).map_err(|e| {
33 LayoutError::FileError(format!("failed to parse file {}: {}", filename, e))
34 })?,
35 _ => {
36 return Err(LayoutError::FileError(
37 "Unsupported file format".to_string(),
38 ));
39 }
40 };
41
42 Ok(cfg)
43}