wthrr 0.4.2

Weather companion for the terminal
use anyhow::Result;
use dialoguer::{theme::ColorfulTheme, Confirm};

use crate::{location::Geolocation, translation::translate};

pub async fn get(args_address: &str, config_address: &str, lang: &str) -> Result<String> {
	let address = if (args_address.is_empty() && config_address.is_empty())
		|| args_address == "auto"
		|| (args_address.is_empty() && config_address == "auto")
	{
		if (args_address.is_empty() && config_address.is_empty())
			&& !Confirm::with_theme(&ColorfulTheme::default())
				.with_prompt(
					translate(
						lang,
						"You didn't specify a city. Should I check for a weather station close to your location?",
					)
					.await?,
				)
				.interact()?
		{
			std::process::exit(1);
		}
		let auto_loc = Geolocation::get().await?;
		format!("{},{}", auto_loc.city_name, auto_loc.country_code)
	} else if args_address.is_empty() && !config_address.is_empty() {
		config_address.to_string()
	} else {
		args_address.to_string()
	};

	Ok(address)
}

#[cfg(test)]
mod tests {
	use super::*;
	use crate::config::Config;

	#[tokio::test]
	async fn address_from_arg() -> Result<()> {
		let arg_address = "new york";
		let config = Config {
			address: Some("Berlin, DE".to_string()),
			..Default::default()
		};

		let res = get(arg_address, config.address.as_deref().unwrap_or_default(), "en").await?;

		assert!(res.contains("new york"));

		Ok(())
	}

	#[tokio::test]
	async fn address_from_cfg() -> Result<()> {
		let arg_address = "";
		let config = Config {
			address: Some("Berlin, DE".to_string()),
			..Default::default()
		};

		let res = get(arg_address, config.address.as_deref().unwrap_or_default(), "en").await?;

		assert!(res.contains("Berlin"));

		Ok(())
	}
}