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