apple 0.2.0

A Rust library for Apple Sign-In authentication, CloudKit Web Services, and App Store Server API
Documentation
use crate::cloudkit::types::FieldValue;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Query {
    #[serde(rename = "recordType")]
    pub record_type: String,
    #[serde(rename = "filterBy", skip_serializing_if = "Option::is_none")]
    pub filter_by: Option<Vec<Filter>>,
    #[serde(rename = "sortBy", skip_serializing_if = "Option::is_none")]
    pub sort_by: Option<Vec<SortDescriptor>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Filter {
    #[serde(rename = "fieldName")]
    pub field_name: String,
    pub comparator: Comparator,
    #[serde(rename = "fieldValue")]
    pub field_value: FieldValue,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Comparator {
    #[serde(rename = "EQUALS")]
    Equals,
    #[serde(rename = "NOT_EQUALS")]
    NotEquals,
    #[serde(rename = "GREATER_THAN")]
    GreaterThan,
    #[serde(rename = "GREATER_THAN_OR_EQUALS")]
    GreaterThanOrEquals,
    #[serde(rename = "LESS_THAN")]
    LessThan,
    #[serde(rename = "LESS_THAN_OR_EQUALS")]
    LessThanOrEquals,
    #[serde(rename = "IN")]
    In,
    #[serde(rename = "NOT_IN")]
    NotIn,
    #[serde(rename = "NEAR")]
    Near,
    #[serde(rename = "BEGINS_WITH")]
    BeginsWith,
    #[serde(rename = "CONTAINS_ALL_TOKENS")]
    ContainsAllTokens,
    #[serde(rename = "CONTAINS_ANY_TOKENS")]
    ContainsAnyTokens,
    #[serde(rename = "LIST_CONTAINS")]
    ListContains,
    #[serde(rename = "LIST_NOT_CONTAINS")]
    ListNotContains,
    #[serde(rename = "LIST_CONTAINS_ALL")]
    ListContainsAll,
    #[serde(rename = "LIST_CONTAINS_ANY")]
    ListContainsAny,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SortDescriptor {
    #[serde(rename = "fieldName")]
    pub field_name: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ascending: Option<bool>,
}

pub struct QueryBuilder {
    record_type: String,
    filters: Vec<Filter>,
    sorts: Vec<SortDescriptor>,
}

impl QueryBuilder {
    pub fn new(record_type: &str) -> Self {
        QueryBuilder {
            record_type: record_type.to_string(),
            filters: Vec::new(),
            sorts: Vec::new(),
        }
    }

    pub fn filter(mut self, field_name: &str, comparator: Comparator, value: FieldValue) -> Self {
        self.filters.push(Filter {
            field_name: field_name.to_string(),
            comparator,
            field_value: value,
        });
        self
    }

    pub fn sort(mut self, field_name: &str, ascending: bool) -> Self {
        self.sorts.push(SortDescriptor {
            field_name: field_name.to_string(),
            ascending: Some(ascending),
        });
        self
    }

    pub fn build(self) -> Query {
        Query {
            record_type: self.record_type,
            filter_by: if self.filters.is_empty() {
                None
            } else {
                Some(self.filters)
            },
            sort_by: if self.sorts.is_empty() {
                None
            } else {
                Some(self.sorts)
            },
        }
    }
}