Skip to main content

_bver/
loader.rs

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}