use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum DocumentType {
AccountStatement,
TradeConfirm,
#[serde(rename = "1099")]
#[cfg_attr(feature = "clap", value(name = "1099"))]
Tax1099,
}
impl fmt::Display for DocumentType {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::AccountStatement => formatter.write_str("account_statement"),
Self::TradeConfirm => formatter.write_str("trade_confirm"),
Self::Tax1099 => formatter.write_str("1099"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Document {
pub id: Option<String>,
#[serde(rename = "type")]
pub document_type: Option<String>,
pub date: Option<String>,
pub download_url: Option<String>,
pub created_at: Option<String>,
pub updated_at: Option<String>,
pub url: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn document_type_serializes_to_wire_form() {
assert_eq!(
serde_json::to_string(&DocumentType::AccountStatement).unwrap(),
"\"account_statement\""
);
assert_eq!(
serde_json::to_string(&DocumentType::TradeConfirm).unwrap(),
"\"trade_confirm\""
);
assert_eq!(
serde_json::to_string(&DocumentType::Tax1099).unwrap(),
"\"1099\""
);
}
#[test]
fn document_type_roundtrips_all_variants() {
for variant in [
DocumentType::AccountStatement,
DocumentType::TradeConfirm,
DocumentType::Tax1099,
] {
let wire = serde_json::to_string(&variant).unwrap();
let back: DocumentType = serde_json::from_str(&wire).unwrap();
assert_eq!(back, variant);
}
}
#[test]
fn document_type_display_matches_wire() {
assert_eq!(
DocumentType::AccountStatement.to_string(),
"account_statement"
);
assert_eq!(DocumentType::TradeConfirm.to_string(), "trade_confirm");
assert_eq!(DocumentType::Tax1099.to_string(), "1099");
}
}