Skip to main content

finance_query/models/corporate/
summary_profile.rs

1/// Summary Profile module data
2///
3/// Contains company profile information including address, sector, industry, and business summary.
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7/// Company profile information
8///
9/// Contains address, contact information, sector, industry, and business description.
10#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12#[non_exhaustive]
13pub struct SummaryProfile {
14    /// Street address line 1
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub address1: Option<String>,
17
18    /// City
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub city: Option<String>,
21
22    /// Company officers (typically populated in assetProfile instead)
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub company_officers: Option<Vec<Value>>,
25
26    /// Country
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub country: Option<String>,
29
30    /// Executive team (typically populated in assetProfile instead)
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub executive_team: Option<Vec<Value>>,
33
34    /// Number of full-time employees
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub full_time_employees: Option<i64>,
37
38    /// Industry name (legacy)
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub industry: Option<String>,
41
42    /// Industry display name
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub industry_disp: Option<String>,
45
46    /// Industry key/slug
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub industry_key: Option<String>,
49
50    /// Investor relations website URL
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub ir_website: Option<String>,
53
54    /// Detailed business summary/description
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub long_business_summary: Option<String>,
57
58    /// Maximum age of data in seconds
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub max_age: Option<i64>,
61
62    /// Company phone number
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub phone: Option<String>,
65
66    /// Sector name (legacy)
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub sector: Option<String>,
69
70    /// Sector display name
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub sector_disp: Option<String>,
73
74    /// Sector key/slug
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub sector_key: Option<String>,
77
78    /// State/province code
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub state: Option<String>,
81
82    /// Company website URL
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub website: Option<String>,
85
86    /// ZIP/postal code
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub zip: Option<String>,
89}
90
91#[cfg(test)]
92mod tests {
93    use super::*;
94
95    #[test]
96    fn test_deserialize_summary_profile() {
97        let json = r#"{
98            "address1": "One Apple Park Way",
99            "city": "Cupertino",
100            "companyOfficers": [],
101            "country": "United States",
102            "fullTimeEmployees": 166000,
103            "industry": "Consumer Electronics",
104            "industryDisp": "Consumer Electronics",
105            "industryKey": "consumer-electronics",
106            "phone": "(408) 996-1010",
107            "sector": "Technology",
108            "sectorDisp": "Technology",
109            "sectorKey": "technology",
110            "state": "CA",
111            "website": "https://www.apple.com",
112            "zip": "95014"
113        }"#;
114
115        let profile: SummaryProfile = serde_json::from_str(json).unwrap();
116        assert_eq!(profile.city.as_deref(), Some("Cupertino"));
117        assert_eq!(profile.sector_disp.as_deref(), Some("Technology"));
118        assert_eq!(profile.full_time_employees, Some(166000));
119    }
120}