aboutsummaryrefslogtreecommitdiffstats
path: root/src/paths.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-08-18 23:45:33 -0400
committerJesse Luehrs <doy@tozt.net>2019-08-18 23:45:33 -0400
commit3539ceb20f5383a332a8ad1fcab816cf083f277e (patch)
tree5cea964a052c7c0bd967ede1d4283b75eba58ea5 /src/paths.rs
parentca8b49db6c369bc9b5c71a43ca7eb31140223cf1 (diff)
downloadynab-api-3539ceb20f5383a332a8ad1fcab816cf083f277e.tar.gz
ynab-api-3539ceb20f5383a332a8ad1fcab816cf083f277e.zip
better error handling
Diffstat (limited to 'src/paths.rs')
-rw-r--r--src/paths.rs58
1 files changed, 54 insertions, 4 deletions
diff --git a/src/paths.rs b/src/paths.rs
index 31c07d0..f53bef5 100644
--- a/src/paths.rs
+++ b/src/paths.rs
@@ -1,6 +1,56 @@
-pub fn api_key() -> std::path::PathBuf {
- directories::ProjectDirs::from("", "", "ynab")
- .unwrap()
+use snafu::{OptionExt, ResultExt};
+use std::io::Read;
+
+#[derive(Debug, snafu::Snafu)]
+pub enum Error {
+ #[snafu(display("couldn't find config path for project {}", name))]
+ FindConfigDir { name: String },
+
+ #[snafu(display(
+ "couldn't open file {}: {}",
+ file.to_string_lossy(),
+ source
+ ))]
+ OpenFile {
+ file: std::path::PathBuf,
+ source: std::io::Error,
+ },
+
+ #[snafu(display(
+ "couldn't read file {}: {}",
+ file.to_string_lossy(),
+ source
+ ))]
+ ReadFile {
+ file: std::path::PathBuf,
+ source: std::io::Error,
+ },
+}
+
+pub type Result<T> = std::result::Result<T, Error>;
+
+const PROJECT_NAME: &str = "ynab";
+
+pub fn api_key() -> Result<std::path::PathBuf> {
+ Ok(directories::ProjectDirs::from("", "", PROJECT_NAME)
+ .with_context(|| FindConfigDir {
+ name: PROJECT_NAME.to_string(),
+ })?
.config_dir()
- .join("api-key")
+ .join("api-key"))
+}
+
+pub fn read_api_key() -> Result<String> {
+ let mut key = String::new();
+ let key_file = api_key()?;
+ std::fs::File::open(key_file.clone())
+ .with_context(|| OpenFile {
+ file: key_file.clone(),
+ })?
+ .read_to_string(&mut key)
+ .with_context(|| ReadFile {
+ file: key_file.clone(),
+ })?;
+ let key = key.trim();
+ Ok(key.to_string())
}