1use std::fs;
2use std::path::Path;
3
4use crate::finders::{find_bver_toml, find_cargo_toml, find_package_json, find_pyproject_toml};
5use crate::schema::Config;
6
7pub fn load_config() -> Option<Config> {
8 load_from_bver_toml()
9 .or_else(load_from_pyproject_toml)
10 .or_else(load_from_package_json)
11 .or_else(load_from_cargo_toml)
12}
13
14fn load_from_bver_toml() -> Option<Config> {
15 let path = find_bver_toml()?;
16 load_toml_config(&path)
17}
18
19fn load_from_pyproject_toml() -> Option<Config> {
20 let path = find_pyproject_toml()?;
21 let content = fs::read_to_string(&path).ok()?;
22 let value: toml::Value = toml::from_str(&content).ok()?;
23 let bver_config = value.get("tool")?.get("bver")?;
24 let mut config: Config = toml::Value::try_into(bver_config.clone()).ok()?;
25
26 if config.current_version.is_none() {
27 config.current_version = value
28 .get("project")
29 .and_then(|p| p.get("version"))
30 .and_then(|v| v.as_str())
31 .map(String::from);
32 }
33
34 Some(config)
35}
36
37fn load_from_package_json() -> Option<Config> {
38 let path = find_package_json()?;
39 let content = fs::read_to_string(&path).ok()?;
40 let value: serde_json::Value = serde_json::from_str(&content).ok()?;
41 let bver_config = value.get("bver")?;
42 let mut config: Config = serde_json::from_value(bver_config.clone()).ok()?;
43
44 if config.current_version.is_none() {
45 config.current_version = value
46 .get("version")
47 .and_then(|v| v.as_str())
48 .map(String::from);
49 }
50
51 Some(config)
52}
53
54fn load_from_cargo_toml() -> Option<Config> {
55 let path = find_cargo_toml()?;
56 let content = fs::read_to_string(&path).ok()?;
57 let value: toml::Value = toml::from_str(&content).ok()?;
58 let bver_config = value.get("package")?.get("metadata")?.get("bver")?;
59 let mut config: Config = toml::Value::try_into(bver_config.clone()).ok()?;
60
61 if config.current_version.is_none() {
62 config.current_version = value
63 .get("package")
64 .and_then(|p| p.get("version"))
65 .and_then(|v| v.as_str())
66 .map(String::from);
67 }
68
69 Some(config)
70}
71
72fn load_toml_config(path: &Path) -> Option<Config> {
73 let content = fs::read_to_string(path).ok()?;
74 toml::from_str(&content).ok()
75}