Skip to main content

weatherkit/
availability_kind.rs

1use core::ffi::c_void;
2
3use serde::{Deserialize, Deserializer};
4
5use crate::error::WeatherKitError;
6use crate::ffi;
7use crate::private::{parse_json_from_handle, parse_json_from_static};
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10#[non_exhaustive]
11pub enum AvailabilityKind {
12    Available,
13    TemporarilyUnavailable,
14    Unsupported,
15    Unknown(String),
16}
17
18impl AvailabilityKind {
19    pub(crate) fn from_raw(value: String) -> Self {
20        match value.as_str() {
21            "available" => Self::Available,
22            "temporarilyUnavailable" => Self::TemporarilyUnavailable,
23            "unsupported" => Self::Unsupported,
24            "unknown" => Self::Unknown(value),
25            other => Self::Unknown(other.to_owned()),
26        }
27    }
28
29    pub fn raw_value(&self) -> &str {
30        match self {
31            Self::Available => "available",
32            Self::TemporarilyUnavailable => "temporarilyUnavailable",
33            Self::Unsupported => "unsupported",
34            Self::Unknown(value) => value.as_str(),
35        }
36    }
37
38    pub fn descriptors() -> Result<Vec<AvailabilityKindDescriptor>, WeatherKitError> {
39        parse_json_from_static(
40            ffi::availability_kind::wk_availability_kind_copy_descriptors_json,
41            "availability kind descriptors",
42        )
43    }
44}
45
46#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
47#[serde(rename_all = "camelCase")]
48pub struct AvailabilityKindDescriptor {
49    pub raw_value: String,
50}
51
52#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct WeatherAvailability {
55    #[serde(deserialize_with = "deserialize_availability_kind")]
56    pub minute_availability: AvailabilityKind,
57    #[serde(deserialize_with = "deserialize_availability_kind")]
58    pub alert_availability: AvailabilityKind,
59}
60
61impl WeatherAvailability {
62    pub(crate) fn from_owned_ptr(ptr: *mut c_void) -> Result<Self, WeatherKitError> {
63        parse_json_from_handle(
64            ptr,
65            ffi::availability_kind::wk_weather_availability_release,
66            ffi::availability_kind::wk_weather_availability_copy_json,
67            "weather availability",
68        )
69    }
70}
71
72pub(crate) fn deserialize_availability_kind<'de, D>(
73    deserializer: D,
74) -> Result<AvailabilityKind, D::Error>
75where
76    D: Deserializer<'de>,
77{
78    let raw = String::deserialize(deserializer)?;
79    Ok(AvailabilityKind::from_raw(raw))
80}