apple 0.2.0

A Rust library for Apple Sign-In authentication, CloudKit Web Services, and App Store Server API
Documentation
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fmt;

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum Environment {
    Development,
    Production,
}

impl fmt::Display for Environment {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Environment::Development => write!(f, "development"),
            Environment::Production => write!(f, "production"),
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DatabaseType {
    Public,
    Private,
    Shared,
}

impl fmt::Display for DatabaseType {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            DatabaseType::Public => write!(f, "public"),
            DatabaseType::Private => write!(f, "private"),
            DatabaseType::Shared => write!(f, "shared"),
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ZoneID {
    #[serde(rename = "zoneName")]
    pub zone_name: String,
    #[serde(rename = "ownerRecordName", skip_serializing_if = "Option::is_none")]
    pub owner_record_name: Option<String>,
}

impl ZoneID {
    pub fn new(zone_name: &str) -> Self {
        ZoneID {
            zone_name: zone_name.to_string(),
            owner_record_name: None,
        }
    }

    pub fn default_zone() -> Self {
        ZoneID {
            zone_name: "_defaultZone".to_string(),
            owner_record_name: None,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Zone {
    #[serde(rename = "zoneID")]
    pub zone_id: ZoneID,
    #[serde(rename = "syncToken", skip_serializing_if = "Option::is_none")]
    pub sync_token: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub atomic: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Record {
    #[serde(rename = "recordName", skip_serializing_if = "Option::is_none")]
    pub record_name: Option<String>,
    #[serde(rename = "recordType")]
    pub record_type: String,
    #[serde(rename = "recordChangeTag", skip_serializing_if = "Option::is_none")]
    pub record_change_tag: Option<String>,
    #[serde(default)]
    pub fields: HashMap<String, FieldValue>,
    #[serde(rename = "zoneID", skip_serializing_if = "Option::is_none")]
    pub zone_id: Option<ZoneID>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created: Option<RecordTimestamp>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub modified: Option<RecordTimestamp>,
}

impl Record {
    pub fn new(record_type: &str) -> Self {
        Record {
            record_name: None,
            record_type: record_type.to_string(),
            record_change_tag: None,
            fields: HashMap::new(),
            zone_id: None,
            created: None,
            modified: None,
        }
    }

    pub fn with_name(mut self, name: &str) -> Self {
        self.record_name = Some(name.to_string());
        self
    }

    pub fn with_zone(mut self, zone_id: ZoneID) -> Self {
        self.zone_id = Some(zone_id);
        self
    }

    pub fn with_field(mut self, name: &str, value: FieldValue) -> Self {
        self.fields.insert(name.to_string(), value);
        self
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "value")]
pub enum FieldValue {
    #[serde(rename = "STRING")]
    String(String),
    #[serde(rename = "INT64")]
    Int64(i64),
    #[serde(rename = "DOUBLE")]
    Double(f64),
    #[serde(rename = "TIMESTAMP")]
    Timestamp(i64),
    #[serde(rename = "REFERENCE")]
    Reference(ReferenceValue),
    #[serde(rename = "ASSET")]
    Asset(AssetValue),
    #[serde(rename = "LOCATION")]
    Location(LocationValue),
    #[serde(rename = "BYTES")]
    Bytes(String),
    #[serde(rename = "STRING_LIST")]
    StringList(Vec<String>),
    #[serde(rename = "INT64_LIST")]
    Int64List(Vec<i64>),
    #[serde(rename = "DOUBLE_LIST")]
    DoubleList(Vec<f64>),
    #[serde(rename = "TIMESTAMP_LIST")]
    TimestampList(Vec<i64>),
    #[serde(rename = "REFERENCE_LIST")]
    ReferenceList(Vec<ReferenceValue>),
    #[serde(rename = "LOCATION_LIST")]
    LocationList(Vec<LocationValue>),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReferenceValue {
    #[serde(rename = "recordName")]
    pub record_name: String,
    #[serde(rename = "zoneID", skip_serializing_if = "Option::is_none")]
    pub zone_id: Option<ZoneID>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub action: Option<ReferenceAction>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ReferenceAction {
    #[serde(rename = "NONE")]
    None,
    #[serde(rename = "DELETE_SELF")]
    DeleteSelf,
    #[serde(rename = "VALIDATE")]
    Validate,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetValue {
    #[serde(rename = "fileChecksum", skip_serializing_if = "Option::is_none")]
    pub file_checksum: Option<String>,
    #[serde(rename = "size", skip_serializing_if = "Option::is_none")]
    pub size: Option<u64>,
    #[serde(rename = "downloadURL", skip_serializing_if = "Option::is_none")]
    pub download_url: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LocationValue {
    pub latitude: f64,
    pub longitude: f64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub altitude: Option<f64>,
    #[serde(rename = "horizontalAccuracy", skip_serializing_if = "Option::is_none")]
    pub horizontal_accuracy: Option<f64>,
    #[serde(rename = "verticalAccuracy", skip_serializing_if = "Option::is_none")]
    pub vertical_accuracy: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub course: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub speed: Option<f64>,
    #[serde(rename = "timestamp", skip_serializing_if = "Option::is_none")]
    pub timestamp: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RecordTimestamp {
    pub timestamp: i64,
    #[serde(rename = "userRecordName", skip_serializing_if = "Option::is_none")]
    pub user_record_name: Option<String>,
    #[serde(rename = "deviceID", skip_serializing_if = "Option::is_none")]
    pub device_id: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OperationType {
    #[serde(rename = "create")]
    Create,
    #[serde(rename = "update")]
    Update,
    #[serde(rename = "forceUpdate")]
    ForceUpdate,
    #[serde(rename = "replace")]
    Replace,
    #[serde(rename = "forceReplace")]
    ForceReplace,
    #[serde(rename = "delete")]
    Delete,
    #[serde(rename = "forceDelete")]
    ForceDelete,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Subscription {
    #[serde(rename = "subscriptionID", skip_serializing_if = "Option::is_none")]
    pub subscription_id: Option<String>,
    #[serde(rename = "subscriptionType")]
    pub subscription_type: SubscriptionType,
    #[serde(rename = "query", skip_serializing_if = "Option::is_none")]
    pub query: Option<super::query::Query>,
    #[serde(rename = "firesOn", skip_serializing_if = "Option::is_none")]
    pub fires_on: Option<Vec<FiresOn>>,
    #[serde(
        rename = "firesOnRecordCreation",
        skip_serializing_if = "Option::is_none"
    )]
    pub fires_on_record_creation: Option<bool>,
    #[serde(
        rename = "firesOnRecordUpdate",
        skip_serializing_if = "Option::is_none"
    )]
    pub fires_on_record_update: Option<bool>,
    #[serde(
        rename = "firesOnRecordDeletion",
        skip_serializing_if = "Option::is_none"
    )]
    pub fires_on_record_deletion: Option<bool>,
    #[serde(rename = "notificationInfo", skip_serializing_if = "Option::is_none")]
    pub notification_info: Option<NotificationInfo>,
    #[serde(rename = "zoneID", skip_serializing_if = "Option::is_none")]
    pub zone_id: Option<ZoneID>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SubscriptionType {
    #[serde(rename = "query")]
    Query,
    #[serde(rename = "zone")]
    Zone,
    #[serde(rename = "database")]
    Database,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FiresOn {
    #[serde(rename = "create")]
    Create,
    #[serde(rename = "update")]
    Update,
    #[serde(rename = "delete")]
    Delete,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationInfo {
    #[serde(rename = "alertBody", skip_serializing_if = "Option::is_none")]
    pub alert_body: Option<String>,
    #[serde(
        rename = "alertLocalizationKey",
        skip_serializing_if = "Option::is_none"
    )]
    pub alert_localization_key: Option<String>,
    #[serde(
        rename = "alertLocalizationArgs",
        skip_serializing_if = "Option::is_none"
    )]
    pub alert_localization_args: Option<Vec<String>>,
    #[serde(
        rename = "alertActionLocalizationKey",
        skip_serializing_if = "Option::is_none"
    )]
    pub alert_action_localization_key: Option<String>,
    #[serde(rename = "alertLaunchImage", skip_serializing_if = "Option::is_none")]
    pub alert_launch_image: Option<String>,
    #[serde(rename = "soundName", skip_serializing_if = "Option::is_none")]
    pub sound_name: Option<String>,
    #[serde(rename = "shouldBadge", skip_serializing_if = "Option::is_none")]
    pub should_badge: Option<bool>,
    #[serde(
        rename = "shouldSendContentAvailable",
        skip_serializing_if = "Option::is_none"
    )]
    pub should_send_content_available: Option<bool>,
    #[serde(
        rename = "shouldSendMutableContent",
        skip_serializing_if = "Option::is_none"
    )]
    pub should_send_mutable_content: Option<bool>,
    #[serde(rename = "collapseIdKey", skip_serializing_if = "Option::is_none")]
    pub collapse_id_key: Option<String>,
    #[serde(rename = "desiredKeys", skip_serializing_if = "Option::is_none")]
    pub desired_keys: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub category: Option<String>,
    #[serde(
        rename = "titleLocalizationKey",
        skip_serializing_if = "Option::is_none"
    )]
    pub title_localization_key: Option<String>,
    #[serde(
        rename = "titleLocalizationArgs",
        skip_serializing_if = "Option::is_none"
    )]
    pub title_localization_args: Option<Vec<String>>,
    #[serde(
        rename = "subtitleLocalizationKey",
        skip_serializing_if = "Option::is_none"
    )]
    pub subtitle_localization_key: Option<String>,
    #[serde(
        rename = "subtitleLocalizationArgs",
        skip_serializing_if = "Option::is_none"
    )]
    pub subtitle_localization_args: Option<Vec<String>>,
}