From 26266d70fcd7255fbafded9020437eb17bff5457 Mon Sep 17 00:00:00 2001 From: Namilskyy Date: Tue, 18 Nov 2025 21:56:51 +0300 Subject: Specified no subcommand help text --- src/parser.rs | 103 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 55 insertions(+), 48 deletions(-) (limited to 'src/parser.rs') diff --git a/src/parser.rs b/src/parser.rs index daa9059..ab1db94 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,93 +1,98 @@ +use std::{ + fs::{self, File}, + io::Read, +}; + use reqwest::Client; -use std::fs::{self, File}; -use std::io::Read; -use toml; +use toml; use serde::{Deserialize, Serialize}; use serde_json; use serde_yml; // use crate::configmanager::Config; -use crate::shared::*; +use crate::shared::*; fn get_config_path() -> Result> { let home = std::env::var("HOME")?; Ok(format!("{}/.config/WeatherFetch/Config.toml", home)) } - pub async fn parse_weather() -> Result> { let config = get_config()?; let client = Client::new(); - let response = client.get("https://api.open-meteo.com/v1/forecast") + let response = client + .get("https://api.open-meteo.com/v1/forecast") .query(&[ ("latitude", config.lat.to_string()), ("longitude", config.lon.to_string()), ("current", "temperature_2m,wind_speed_10m".to_string()), - ("hourly", "temperature_2m,relative_humidity_2m,wind_speed_10m".to_string()), + ( + "hourly", + "temperature_2m,relative_humidity_2m,wind_speed_10m".to_string(), + ), ]) .send() .await?; - + let response_text = response.text().await?; let weather_data: WeatherData = serde_json::from_str(&response_text)?; - + let home = std::env::var("HOME")?; let cache_dir = format!("{}/.cache/WeatherFetch", home); fs::create_dir_all(&cache_dir)?; - + let cache_path = format!("{}/weather.json", cache_dir); let json_data = serde_json::to_string_pretty(&weather_data)?; fs::write(&cache_path, json_data)?; - + Ok(weather_data) } - -// TODO: Add exclude processing +// TODO: Add exclude processing #[derive(Debug, Deserialize)] pub struct Config { lat: f64, lon: f64, - exclude: String + exclude: String, } pub fn get_config() -> Result> { let config_path = get_config_path()?; - + if File::open(&config_path).is_err() { - generate_config()?; + generate_config()?; } - + let mut file = File::open(&config_path)?; let mut content = String::new(); file.read_to_string(&mut content)?; - let config: Config = toml::from_str(&content)?; + let config: Config = toml::from_str(&content)?; Ok(config) } -/* +/* pub fn generate_cachedir() -> Result<(), Box> { let home = std::env::var("HOME")?; let cache_path = format!("{}/.cache/WeatherFetch/", home); - - let _ = fs::create_dir(cache_path); + + let _ = fs::create_dir(cache_path); Ok(()) } -*/ - -/// Just writing example config to ~/.config/WeatherFetch/Config.toml -/// let _ = generate_config() -/// Result: ~/.config/WeatherFetch/Config.toml: -/// lat = 55.75 -/// lon = 37.62 -/// exclude = "" -pub fn generate_config() -> Result<(), Box> { +*/ + +/// Just writing example config to ~/.config/WeatherFetch/Config.toml +/// let _ = generate_config() +/// Result: ~/.config/WeatherFetch/Config.toml: +/// lat = 55.75 +/// lon = 37.62 +/// exclude = "" +pub fn generate_config() -> Result<(), Box> { let config_path = get_config_path()?; - let config = "lat = 55.75\nlon = 37.62\nexclude = \"\""; + let config = "lat = 55.75\nlon = 37.62\nexclude = \"\""; let path = std::path::Path::new(&config_path); if let Some(parent) = path.parent() { fs::create_dir_all(parent)?; @@ -97,14 +102,14 @@ pub fn generate_config() -> Result<(), Box> { Ok(()) } -/// For usage like type in `let` +/// For usage like type in `let` #[derive(Serialize, Deserialize, Debug)] struct Arts { #[serde(rename = "Arts")] arts: ArtsData, } -/// Strings with arts from arts.yaml +/// Strings with arts from arts.yaml #[derive(Serialize, Deserialize, Debug)] struct ArtsData { sun: String, @@ -117,7 +122,7 @@ pub fn determine_weather_type(temp: f32, humidity: Option) -> &'static str if temp < 0.0 { return "snow"; } - + if let Some(hum) = humidity { if hum > 70 && temp < 25.0 { return "rain"; @@ -127,23 +132,26 @@ pub fn determine_weather_type(temp: f32, humidity: Option) -> &'static str "sun" } -/// Arts loader with exception wrappers +/// Arts loader with exception wrappers fn load_arts() -> Result> { let home = std::env::var("HOME")?; let arts_path = format!("{}/.config/WeatherFetch/arts.yaml", home); - + let content = match fs::read_to_string(&arts_path) { Ok(c) => c, Err(_) => { // if arts.yaml not found return Ok(ArtsData { - sun: "☀️ - ts emoji means program cant found ~/.config/WeatherFetch/arts.yaml".to_string(), - snow: "❄️ - ts emoji means program cant found ~/.config/WeatherFetch/arts.yaml".to_string(), - rain: "🌧️ - ts emoji means program cant found ~/.config/WeatherFetch/arts.yaml".to_string(), + sun: "☀️ - ts emoji means program cant found ~/.config/WeatherFetch/arts.yaml" + .to_string(), + snow: "❄️ - ts emoji means program cant found ~/.config/WeatherFetch/arts.yaml" + .to_string(), + rain: "🌧️ - ts emoji means program cant found ~/.config/WeatherFetch/arts.yaml" + .to_string(), }); } }; - + let arts: Arts = serde_yml::from_str(&content)?; Ok(arts.arts) } @@ -152,27 +160,26 @@ fn process_placeholders(art: &str) -> String { art.replace("{0}", "") } -/// Choosing and retuns art (String) -/// Usage: +/// Choosing and retuns art (String) +/// Usage: /// let data: WeatherData = parse_cached()?; -/// prepare_art(&data); +/// prepare_art(&data); pub fn prepare_art(weather_data: &WeatherData) -> Result> { let arts = load_arts()?; - + let weather_type = determine_weather_type( weather_data.current.temperature_2m, weather_data.hourly.relative_humidity_2m.first().copied(), ); - + let selected_art = match weather_type { "snow" => &arts.snow, "rain" => &arts.rain, "sun" => &arts.sun, _ => &arts.sun, }; - + let processed_art = process_placeholders(selected_art); - + Ok(processed_art) } - -- cgit v1.2.3