♻️ refactor: config to its own module

main
_ 2022-04-05 23:11:47 +00:00
parent fc61de612a
commit 0a73740b16
3 changed files with 71 additions and 48 deletions

46
src/config.rs Normal file
View File

@ -0,0 +1,46 @@
use std::{
str::FromStr,
};
type Result <T> = std::result::Result <T, crate::error::Error>;
pub struct Config {
pub interval_secs: u64,
pub prompt: String,
}
impl Default for Config {
fn default () -> Self {
Self {
interval_secs: 2225,
prompt: "Write a journal entry, then hit Tab, Enter to submit it.".into (),
}
}
}
impl Config {
pub fn from_args <I: Iterator <Item=String>> (mut args: I) -> Result <Self> {
use crate::error::Error::{
CannotParseArg,
ParamNeedsArg,
};
let mut that = Self::default ();
// Finally found the difference: https://stackoverflow.com/questions/1788923/parameter-vs-argument
while let Some (arg) = args.next () {
if arg == "--interval-secs" {
let val = args.next ().ok_or (ParamNeedsArg ("--interval-secs"))?;
let val = u64::from_str (&val).map_err (|_| CannotParseArg ("--interval-secs <u64>"))?;
that.interval_secs = val;
}
else if arg == "--prompt" {
let val = args.next ().ok_or (ParamNeedsArg ("--prompt"))?;
that.prompt = val;
}
}
Ok (that)
}
}

17
src/error.rs Normal file
View File

@ -0,0 +1,17 @@
use fltk::prelude::*;
#[derive (thiserror::Error, Debug)]
pub enum Error {
#[error ("46MVLSEL Cannot parse argument: {0}")]
CannotParseArg (&'static str),
#[error ("4JZ5B2FN Editor has no buffer, this should be impossible")]
EditorHasNoBuffer,
#[error ("OKE7Z5O6 FLTK: {0}")]
Fltk (#[from] FltkError),
#[error ("4BQPBIAJ IO")]
Io (#[from] std::io::Error),
#[error ("KDP4DNOP JSON serialization failed")]
JsonSerialization (#[from] serde_json::Error),
#[error ("3MYHBQWV Parameter {0} needs an argument")]
ParamNeedsArg (&'static str),
}

View File

@ -1,5 +1,5 @@
use std::{ use std::{
str::FromStr, env,
}; };
use chrono::{ use chrono::{
@ -25,25 +25,15 @@ use tokio::{
}, },
}; };
mod config;
mod error;
use config::Config;
use error::Error;
#[tokio::main] #[tokio::main]
async fn main () -> Result <(), Error> { async fn main () -> Result <(), Error> {
let mut config = Config::default (); let config = Config::from_args (env::args ())?;
let mut args = std::env::args ();
// Finally found the difference: https://stackoverflow.com/questions/1788923/parameter-vs-argument
while let Some (arg) = args.next () {
if arg == "--interval-secs" {
let val = args.next ().ok_or (Error::ParamNeedsArg ("--interval-secs"))?;
let val = u64::from_str (&val).map_err (|_| Error::CannotParseArg ("--interval-secs <u64>"))?;
config.interval_secs = val;
}
else if arg == "--prompt" {
let val = args.next ().ok_or (Error::ParamNeedsArg ("--prompt"))?;
config.prompt = val;
}
}
let (fltk_tx, fltk_rx) = app::channel::<Message> (); let (fltk_tx, fltk_rx) = app::channel::<Message> ();
@ -85,42 +75,12 @@ async fn main () -> Result <(), Error> {
Ok (()) Ok (())
} }
struct Config {
interval_secs: u64,
prompt: String,
}
impl Default for Config {
fn default () -> Self {
Self {
interval_secs: 2225,
prompt: "Write a journal entry, then hit Tab, Enter to submit it.".into (),
}
}
}
#[derive (Clone, Copy)] #[derive (Clone, Copy)]
enum Message { enum Message {
PopUp, PopUp,
Submit, Submit,
} }
#[derive (thiserror::Error, Debug)]
enum Error {
#[error ("46MVLSEL Cannot parse argument: {0}")]
CannotParseArg (&'static str),
#[error ("4JZ5B2FN Editor has no buffer, this should be impossible")]
EditorHasNoBuffer,
#[error ("OKE7Z5O6 FLTK: {0}")]
Fltk (#[from] FltkError),
#[error ("4BQPBIAJ IO")]
Io (#[from] std::io::Error),
#[error ("KDP4DNOP JSON serialization failed")]
JsonSerialization (#[from] serde_json::Error),
#[error ("3MYHBQWV Parameter {0} needs an argument")]
ParamNeedsArg (&'static str),
}
#[derive (serde::Serialize)] #[derive (serde::Serialize)]
struct JournalLine { struct JournalLine {
text: String, text: String,