Add module src/free_api_v25/current/sys.rs

This commit is contained in:
Candifloss 2025-10-10 01:01:47 +05:30
parent 6ae6fb57cb
commit 3a6ddc199c
2 changed files with 55 additions and 0 deletions

View File

@ -21,5 +21,6 @@ pub mod clouds;
pub mod coord; pub mod coord;
pub mod main; pub mod main;
pub mod precipitation; pub mod precipitation;
pub mod sys;
pub mod weather; pub mod weather;
pub mod wind; pub mod wind;

View File

@ -0,0 +1,54 @@
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
/// System and location information
///
/// Contains country, sunrise/sunset times, and internal API parameters.
#[derive(Debug, Clone, Deserialize, Serialize, Default, PartialEq)]
pub struct Sys {
/// Internal parameter
#[serde(default)]
pub r#type: Option<u8>,
/// Internal parameter
#[serde(default)]
pub id: Option<u32>,
/// Country code (ISO 3166-1 alpha-2, e.g. "GB", "JP")
#[serde(default)]
pub country: Option<String>,
/// Sunrise time (UTC Unix timestamp)
#[serde(with = "chrono::serde::ts_seconds_option")]
pub sunrise: Option<DateTime<Utc>>,
/// Sunset time (UTC Unix timestamp)
#[serde(with = "chrono::serde::ts_seconds_option")]
pub sunset: Option<DateTime<Utc>>,
/// Internal parameter (often used for error messages)
#[serde(default)]
pub message: Option<f64>,
}
impl Sys {
/// Returns true if it's currently daytime at the location
///
/// Compares current UTC time with sunrise and sunset times.
#[must_use]
pub fn is_daytime(&self) -> Option<bool> {
let now = Utc::now();
match (self.sunrise, self.sunset) {
(Some(sunrise), Some(sunset)) => Some(now >= sunrise && now <= sunset),
_ => None,
}
}
/// Returns the duration of daylight (sunset - sunrise)
///
/// Returns `None` if either sunrise or sunset data is missing.
#[must_use]
pub fn daylight_duration(&self) -> Option<chrono::Duration> {
Some(self.sunset? - self.sunrise?)
}
}