wave-api 0.1.0

Typed Rust client for the Wave Accounting GraphQL API
Documentation
use rust_decimal::Decimal;
use serde::Deserialize;

use crate::enums::{CountryCode, CurrencyCode};

/// Monetary value with currency.
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Money {
    /// Value as a string representation (e.g. "100.00").
    pub value: String,
    /// Currency.
    pub currency: Currency,
}

impl Money {
    /// Parse the value as a Decimal.
    pub fn decimal(&self) -> Result<Decimal, rust_decimal::Error> {
        self.value.parse()
    }
}

/// A currency.
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Currency {
    pub code: CurrencyCode,
    pub symbol: String,
    pub name: String,
    pub plural: Option<String>,
    pub exponent: Option<i32>,
}

/// A country.
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Country {
    pub code: CountryCode,
    pub name: String,
    pub name_with_article: Option<String>,
    pub currency: Option<Currency>,
    pub provinces: Option<Vec<Province>>,
}

/// A state/province/region.
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Province {
    pub code: String,
    pub name: String,
}

/// An address.
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Address {
    pub address_line1: Option<String>,
    pub address_line2: Option<String>,
    pub city: Option<String>,
    pub province: Option<Province>,
    pub country: Option<Country>,
    pub postal_code: Option<String>,
}

/// Shipping details for customers and vendors.
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ShippingDetails {
    pub name: Option<String>,
    pub address: Option<Address>,
    pub phone: Option<String>,
    pub instructions: Option<String>,
}