♻️ refactor: config to its own module
							parent
							
								
									fc61de612a
								
							
						
					
					
						commit
						0a73740b16
					
				|  | @ -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) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -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), | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								src/main.rs
								
								
								
								
							
							
						
						
									
										56
									
								
								src/main.rs
								
								
								
								
							|  | @ -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, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 _
						_