weatherkit/
availability_kind.rs1use 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}