Compare commits
4 Commits
247c06dd9e
...
b26a594cc8
| Author | SHA1 | Date | |
|---|---|---|---|
| b26a594cc8 | |||
| 246987fa68 | |||
| 551297f46b | |||
| 912a7283fd |
130
src/config.rs
130
src/config.rs
@@ -8,6 +8,7 @@ pub enum Error {
|
||||
BadFormat,
|
||||
NoSuchProperty,
|
||||
NoSuchTable,
|
||||
CouldntReadFile,
|
||||
TomlWrap(toml::de::Error),
|
||||
}
|
||||
|
||||
@@ -71,6 +72,17 @@ struct WholeFile {
|
||||
project_overrides: Vec<PartialConfig>,
|
||||
}
|
||||
|
||||
fn load_from_file(path: &str) -> Result<WholeFile> {
|
||||
let res = std::fs::read_to_string(path);
|
||||
match res {
|
||||
Ok(s) => read_conf_str(s.as_str()),
|
||||
Err(e) => {
|
||||
eprintln!("->> file io err: {:?}", e);
|
||||
Err(Error::CouldntReadFile)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn read_conf_str(text: &str) -> Result<WholeFile> {
|
||||
let mut whole = WholeFile::default();
|
||||
|
||||
@@ -98,7 +110,6 @@ fn read_conf_str(text: &str) -> Result<WholeFile> {
|
||||
.project_path(path.clone());
|
||||
whole.project_overrides.push(part_cfg);
|
||||
}
|
||||
println!(" ->> lconf - keys {:?}", cfg_table.keys().collect::<Vec<&String>>());
|
||||
Ok(whole)
|
||||
}
|
||||
|
||||
@@ -145,6 +156,43 @@ mod tests {
|
||||
|
||||
use super::*;
|
||||
|
||||
// Util for generating a reference struct
|
||||
fn gen_expected_struct() -> WholeFile {
|
||||
WholeFile {
|
||||
all: PartialConfig {
|
||||
project_path: None,
|
||||
gitea_url: Some(String::from("http://localhost:3000")),
|
||||
owner: None,
|
||||
repo: None,
|
||||
token: Some(String::from("fake-token"))
|
||||
},
|
||||
project_overrides: vec![
|
||||
PartialConfig {
|
||||
project_path: Some(String::from("/home/robert/projects/gt-tool")),
|
||||
gitea_url: None,
|
||||
owner: Some(String::from("robert")),
|
||||
repo: Some(String::from("gt-tool")),
|
||||
token: None,
|
||||
},
|
||||
PartialConfig {
|
||||
project_path: Some(String::from("/home/robert/projects/rcalc")),
|
||||
gitea_url: None,
|
||||
owner: Some(String::from("jamis")),
|
||||
repo: Some(String::from("rcalc")),
|
||||
token: None,
|
||||
},
|
||||
PartialConfig {
|
||||
project_path: Some(String::from("/home/robert/projects/rcalc-builders")),
|
||||
gitea_url: None,
|
||||
owner: Some(String::from("jamis")),
|
||||
repo: Some(String::from("rcalc")),
|
||||
token: None,
|
||||
},
|
||||
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn read_single_prop() -> Result<()> {
|
||||
let fx_input_str = "owner = \"dingus\"";
|
||||
@@ -185,59 +233,9 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn read_config_string_ok() -> Result<()> {
|
||||
let fx_sample_config_string = "
|
||||
[all]
|
||||
gitea_url = \"http://localhost:3000\"
|
||||
token = \"fake-token\"
|
||||
|
||||
[\"/home/robert/projects/gt-tool\"]
|
||||
owner = \"robert\"
|
||||
repo = \"gt-tool\"
|
||||
|
||||
[\"/home/robert/projects/rcalc\"]
|
||||
owner = \"jamis\"
|
||||
repo = \"rcalc\"
|
||||
|
||||
[\"/home/robert/projects/rcalc-builders\"]
|
||||
owner = \"jamis\"
|
||||
repo = \"rcalc\"
|
||||
";
|
||||
let fx_expected_struct = WholeFile {
|
||||
all: PartialConfig {
|
||||
project_path: None,
|
||||
gitea_url: Some(String::from("http://localhost:3000")),
|
||||
owner: None,
|
||||
repo: None,
|
||||
token: Some(String::from("fake-token"))
|
||||
},
|
||||
project_overrides: vec![
|
||||
PartialConfig {
|
||||
project_path: Some(String::from("/home/robert/projects/gt-tool")),
|
||||
gitea_url: None,
|
||||
owner: Some(String::from("robert")),
|
||||
repo: Some(String::from("gt-tool")),
|
||||
token: None,
|
||||
},
|
||||
PartialConfig {
|
||||
project_path: Some(String::from("/home/robert/projects/rcalc")),
|
||||
gitea_url: None,
|
||||
owner: Some(String::from("jamis")),
|
||||
repo: Some(String::from("rcalc")),
|
||||
token: None,
|
||||
},
|
||||
PartialConfig {
|
||||
project_path: Some(String::from("/home/robert/projects/rcalc-builders")),
|
||||
gitea_url: None,
|
||||
owner: Some(String::from("jamis")),
|
||||
repo: Some(String::from("rcalc")),
|
||||
token: None,
|
||||
},
|
||||
|
||||
],
|
||||
};
|
||||
let fx_sample_config_string = include_str!("../test_data/sample_config.toml");
|
||||
let fx_expected_struct = gen_expected_struct();
|
||||
let conf = read_conf_str(fx_sample_config_string)?;
|
||||
println!(" ->> Test conf: {:?}", conf);
|
||||
println!(" ->> Ref conf: {:?}", fx_expected_struct);
|
||||
|
||||
assert_eq!(conf, fx_expected_struct);
|
||||
Ok(())
|
||||
@@ -256,4 +254,30 @@ repo = \"rcalc\"
|
||||
let conf = read_conf_str(fx_sample_cfg);
|
||||
assert!(conf.is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
// File exists and has valid configuration.
|
||||
fn load_from_file_ok() -> Result<()> {
|
||||
let conf = load_from_file("test_data/sample_config.toml")?;
|
||||
assert_eq!(conf, gen_expected_struct());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
// File does not exist.
|
||||
fn load_from_file_missing() -> Result<()> {
|
||||
let res = load_from_file("test_data/doesnt_exist.toml");
|
||||
let err = res.unwrap_err();
|
||||
assert_eq!(err, Error::CouldntReadFile);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
// File exists but has garbage inside.
|
||||
// TODO: This bumps against the same semantic issue as the todo note on
|
||||
// the 'read_config_string_empty' test
|
||||
fn load_from_file_bad() {
|
||||
let res = load_from_file("test_data/missing_all_table.toml");
|
||||
assert!(res.is_err());
|
||||
}
|
||||
}
|
||||
|
||||
5
test_data/missing_all_table.toml
Normal file
5
test_data/missing_all_table.toml
Normal file
@@ -0,0 +1,5 @@
|
||||
# There must be an "[all]" table or the loader will reject the config file.
|
||||
|
||||
["/some/other/path"]
|
||||
gitea_url = "fake-url"
|
||||
|
||||
15
test_data/sample_config.toml
Normal file
15
test_data/sample_config.toml
Normal file
@@ -0,0 +1,15 @@
|
||||
[all]
|
||||
gitea_url = "http://localhost:3000"
|
||||
token = "fake-token"
|
||||
|
||||
["/home/robert/projects/gt-tool"]
|
||||
owner = "robert"
|
||||
repo = "gt-tool"
|
||||
|
||||
["/home/robert/projects/rcalc"]
|
||||
owner = "jamis"
|
||||
repo = "rcalc"
|
||||
|
||||
["/home/robert/projects/rcalc-builders"]
|
||||
owner = "jamis"
|
||||
repo = "rcalc"
|
||||
Reference in New Issue
Block a user