rhood_core/models/
document.rs1use std::fmt;
4
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
10#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
11#[serde(rename_all = "snake_case")]
12pub enum DocumentType {
13 AccountStatement,
15 TradeConfirm,
17 #[serde(rename = "1099")]
23 #[cfg_attr(feature = "clap", value(name = "1099"))]
24 Tax1099,
25}
26
27impl fmt::Display for DocumentType {
28 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
29 match self {
30 Self::AccountStatement => formatter.write_str("account_statement"),
31 Self::TradeConfirm => formatter.write_str("trade_confirm"),
32 Self::Tax1099 => formatter.write_str("1099"),
33 }
34 }
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct Document {
40 pub id: Option<String>,
42 #[serde(rename = "type")]
44 pub document_type: Option<String>,
45 pub date: Option<String>,
47 pub download_url: Option<String>,
49 pub created_at: Option<String>,
51 pub updated_at: Option<String>,
53 pub url: Option<String>,
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn document_type_serializes_to_wire_form() {
63 assert_eq!(
64 serde_json::to_string(&DocumentType::AccountStatement).unwrap(),
65 "\"account_statement\""
66 );
67 assert_eq!(
68 serde_json::to_string(&DocumentType::TradeConfirm).unwrap(),
69 "\"trade_confirm\""
70 );
71 assert_eq!(
72 serde_json::to_string(&DocumentType::Tax1099).unwrap(),
73 "\"1099\""
74 );
75 }
76
77 #[test]
78 fn document_type_roundtrips_all_variants() {
79 for variant in [
80 DocumentType::AccountStatement,
81 DocumentType::TradeConfirm,
82 DocumentType::Tax1099,
83 ] {
84 let wire = serde_json::to_string(&variant).unwrap();
85 let back: DocumentType = serde_json::from_str(&wire).unwrap();
86 assert_eq!(back, variant);
87 }
88 }
89
90 #[test]
91 fn document_type_display_matches_wire() {
92 assert_eq!(
93 DocumentType::AccountStatement.to_string(),
94 "account_statement"
95 );
96 assert_eq!(DocumentType::TradeConfirm.to_string(), "trade_confirm");
97 assert_eq!(DocumentType::Tax1099.to_string(), "1099");
98 }
99}