finance_query/adapters/polygon/stocks/
filings.rs1use serde::{Deserialize, Serialize};
4
5use crate::adapters::common::encode_path_segment;
6use crate::error::{FinanceError, Result};
7
8use super::super::build_client;
9use super::super::models::PaginatedResponse;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13#[non_exhaustive]
14pub struct FilingEntry {
15 pub accession_number: Option<String>,
17 pub filing_date: Option<String>,
19 pub filing_type: Option<String>,
21 pub filing_url: Option<String>,
23 pub company_name: Option<String>,
25 pub cik: Option<String>,
27 pub tickers: Option<Vec<String>>,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33#[non_exhaustive]
34pub struct FilingSection {
35 pub section: Option<String>,
37 pub content: Option<String>,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
43#[non_exhaustive]
44pub struct RiskFactor {
45 pub title: Option<String>,
47 pub text: Option<String>,
49 pub category: Option<String>,
51 pub filing_date: Option<String>,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
57#[non_exhaustive]
58pub struct RiskCategory {
59 pub name: Option<String>,
61 pub description: Option<String>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
67#[non_exhaustive]
68pub struct FilingSectionsResponse {
69 pub request_id: Option<String>,
71 pub status: Option<String>,
73 pub results: Option<Vec<FilingSection>>,
75}
76
77pub async fn sec_edgar_index(params: &[(&str, &str)]) -> Result<PaginatedResponse<FilingEntry>> {
79 let client = build_client()?;
80 client.get("/v1/reference/sec/filings", params).await
81}
82
83pub async fn filing_10k_sections(
85 accession_number: &str,
86 params: &[(&str, &str)],
87) -> Result<FilingSectionsResponse> {
88 let client = build_client()?;
89 let path = format!(
90 "/v1/reference/sec/filings/{}/sections",
91 encode_path_segment(accession_number)
92 );
93 let json = client.get_raw(&path, params).await?;
94 serde_json::from_value(json).map_err(|e| FinanceError::ResponseStructureError {
95 field: "10k_sections".to_string(),
96 context: format!("Failed to parse 10-K sections: {e}"),
97 })
98}
99
100pub async fn filing_8k_text(
102 accession_number: &str,
103 params: &[(&str, &str)],
104) -> Result<FilingSectionsResponse> {
105 let client = build_client()?;
106 let path = format!(
107 "/v1/reference/sec/filings/{}/8k",
108 encode_path_segment(accession_number)
109 );
110 let json = client.get_raw(&path, params).await?;
111 serde_json::from_value(json).map_err(|e| FinanceError::ResponseStructureError {
112 field: "8k_text".to_string(),
113 context: format!("Failed to parse 8-K text: {e}"),
114 })
115}
116
117pub async fn risk_factors(params: &[(&str, &str)]) -> Result<PaginatedResponse<RiskFactor>> {
119 let client = build_client()?;
120 client.get("/v1/reference/sec/risk-factors", params).await
121}
122
123pub async fn risk_categories() -> Result<PaginatedResponse<RiskCategory>> {
125 let client = build_client()?;
126 client.get("/v1/reference/sec/risk-categories", &[]).await
127}