src/tools.rs: file_get_json() - add new default parameter

This commit is contained in:
Dietmar Maurer 2019-04-04 12:24:18 +02:00
parent 79ad7b7ec2
commit 49cf9f3d0b
3 changed files with 20 additions and 7 deletions

View File

@ -43,7 +43,7 @@ fn record_repository(repo: &BackupRepository) {
_ => return, _ => return,
}; };
let mut data = tools::file_get_json(&path).unwrap_or(json!({})); let mut data = tools::file_get_json(&path, None).unwrap_or(json!({}));
let repo = repo.to_string(); let repo = repo.to_string();
@ -93,7 +93,7 @@ fn complete_repository(_arg: &str, _param: &HashMap<String, String>) -> Vec<Stri
_ => return result, _ => return result,
}; };
let data = tools::file_get_json(&path).unwrap_or(json!({})); let data = tools::file_get_json(&path, None).unwrap_or(json!({}));
if let Some(map) = data.as_object() { if let Some(map) = data.as_object() {
for (repo, _count) in map { for (repo, _count) in map {

View File

@ -33,7 +33,7 @@ fn store_ticket_info(server: &str, username: &str, ticket: &str, token: &str) ->
let mode = nix::sys::stat::Mode::from_bits_truncate(0o0600); let mode = nix::sys::stat::Mode::from_bits_truncate(0o0600);
let mut data = tools::file_get_json(&path).unwrap_or(json!({})); let mut data = tools::file_get_json(&path, Some(json!({})))?;
let now = Utc::now().timestamp(); let now = Utc::now().timestamp();
@ -72,7 +72,10 @@ fn load_ticket_info(server: &str, username: &str) -> Option<(String, String)> {
_ => return None, _ => return None,
}; };
let data = tools::file_get_json(&path).unwrap_or(json!({})); let data = match tools::file_get_json(&path, None) {
Ok(v) => v,
_ => return None,
};
let now = Utc::now().timestamp(); let now = Utc::now().timestamp();

View File

@ -126,17 +126,27 @@ pub fn file_get_contents<P: AsRef<Path>>(path: P) -> Result<Vec<u8>, Error> {
}).map_err(|err| format_err!("unable to read {:?} - {}", path, err)) }).map_err(|err| format_err!("unable to read {:?} - {}", path, err))
} }
pub fn file_get_json<P: AsRef<Path>>(path: P) -> Result<Value, Error> { pub fn file_get_json<P: AsRef<Path>>(path: P, default: Option<Value>) -> Result<Value, Error> {
let path = path.as_ref(); let path = path.as_ref();
let raw = file_get_contents(path)?; let raw = match std::fs::read(path) {
Ok(v) => v,
Err(err) => {
if err.kind() == std::io::ErrorKind::NotFound {
if let Some(v) = default {
return Ok(v);
}
}
bail!("unable to read json {:?} - {}", path, err);
}
};
try_block!({ try_block!({
let data = String::from_utf8(raw)?; let data = String::from_utf8(raw)?;
let json = serde_json::from_str(&data)?; let json = serde_json::from_str(&data)?;
Ok(json) Ok(json)
}).map_err(|err: Error| format_err!("unable to read json from {:?} - {}", path, err)) }).map_err(|err: Error| format_err!("unable to parse json from {:?} - {}", path, err))
} }
/// Atomically write a file. We first create a temporary file, which /// Atomically write a file. We first create a temporary file, which