wthrr 0.7.0

Weather companion for the terminal
pub mod gui;
pub mod units;

mod address;

use anyhow::Result;
use optional_struct::*;
use serde::{Deserialize, Serialize};

use crate::modules::args::{Cli, Forecast};

use self::{
	gui::{ConfigFileGui, Gui},
	units::{ConfigFileUnits, Units},
};

#[optional_struct(ConfigFile)]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Params {
	pub address: String,
	pub language: String,
	pub forecast: Vec<Forecast>,
	#[optional_rename(ConfigFileUnits)]
	pub units: Units,
	#[optional_rename(ConfigFileGui)]
	pub gui: Gui,
}

impl Default for Params {
	fn default() -> Self {
		Self {
			address: "".to_string(),
			forecast: vec![],
			language: "en_US".to_string(),
			units: Units::default(),
			gui: Gui::default(),
		}
	}
}

impl Params {
	pub async fn merge(mut self, args: &Cli) -> Result<Self> {
		if let Some(language) = &args.language {
			self.language = language.to_string()
		}

		if args.reset {
			Self::reset(&self.language).await?;
			std::process::exit(1);
		}

		if !args.forecast.is_empty() {
			self.forecast = args.forecast.to_vec()
		}

		self.units = Units::get(&args.units, &self.units);

		self.resolve_address(args.address.as_deref().unwrap_or_default())
			.await?;

		Ok(self)
	}
}