wave-api 0.1.0

Typed Rust client for the Wave Accounting GraphQL API
Documentation
use serde::Serialize;

use super::AddressInput;
use crate::enums::CurrencyCode;

/// Shipping details input for customer creation.
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CustomerShippingDetailsInput {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address: Option<AddressInput>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub instructions: Option<String>,
}

/// Input for creating a customer.
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CustomerCreateInput {
    pub business_id: String,
    pub name: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub first_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub mobile: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub fax: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub toll_free: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub website: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub display_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub internal_notes: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address: Option<AddressInput>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub currency: Option<CurrencyCode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub shipping_details: Option<CustomerShippingDetailsInput>,
}

impl CustomerCreateInput {
    /// Create with required fields.
    pub fn new(business_id: impl Into<String>, name: impl Into<String>) -> Self {
        Self {
            business_id: business_id.into(),
            name: name.into(),
            first_name: None,
            last_name: None,
            email: None,
            phone: None,
            mobile: None,
            fax: None,
            toll_free: None,
            website: None,
            display_id: None,
            internal_notes: None,
            address: None,
            currency: None,
            shipping_details: None,
        }
    }

    pub fn first_name(mut self, v: impl Into<String>) -> Self {
        self.first_name = Some(v.into());
        self
    }
    pub fn last_name(mut self, v: impl Into<String>) -> Self {
        self.last_name = Some(v.into());
        self
    }
    pub fn email(mut self, v: impl Into<String>) -> Self {
        self.email = Some(v.into());
        self
    }
    pub fn phone(mut self, v: impl Into<String>) -> Self {
        self.phone = Some(v.into());
        self
    }
    pub fn address(mut self, v: AddressInput) -> Self {
        self.address = Some(v);
        self
    }
    pub fn currency(mut self, v: CurrencyCode) -> Self {
        self.currency = Some(v);
        self
    }
}

/// Input for patching a customer.
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CustomerPatchInput {
    pub id: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub first_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub mobile: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub fax: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub toll_free: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub website: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub display_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub internal_notes: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address: Option<AddressInput>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub currency: Option<CurrencyCode>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub shipping_details: Option<CustomerShippingDetailsInput>,
}

impl CustomerPatchInput {
    /// Create with required ID.
    pub fn new(id: impl Into<String>) -> Self {
        Self {
            id: id.into(),
            name: None,
            first_name: None,
            last_name: None,
            email: None,
            phone: None,
            mobile: None,
            fax: None,
            toll_free: None,
            website: None,
            display_id: None,
            internal_notes: None,
            address: None,
            currency: None,
            shipping_details: None,
        }
    }

    pub fn name(mut self, v: impl Into<String>) -> Self {
        self.name = Some(v.into());
        self
    }
    pub fn email(mut self, v: impl Into<String>) -> Self {
        self.email = Some(v.into());
        self
    }
}

/// Input for deleting a customer.
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CustomerDeleteInput {
    pub id: String,
}

impl CustomerDeleteInput {
    pub fn new(id: impl Into<String>) -> Self {
        Self { id: id.into() }
    }
}