pub const EDGAR_BASE: &str = "https://www.sec.gov/";
pub const DATA_SEC_BASE: &str = "https://data.sec.gov/";
pub const RATE_LIMIT_PER_SEC: u32 = 10;
pub fn quarterly_master_idx_url(year: u16, quarter: u8) -> String {
debug_assert!((1..=4).contains(&quarter));
debug_assert!(year >= 1993);
format!("{EDGAR_BASE}Archives/edgar/full-index/{year}/QTR{quarter}/master.idx")
}
pub fn daily_company_idx_url(year: u16, quarter: u8, date_yyyymmdd: u32) -> String {
debug_assert!((1..=4).contains(&quarter));
format!(
"{EDGAR_BASE}Archives/edgar/daily-index/{year}/QTR{quarter}/company.{date_yyyymmdd}.idx"
)
}
pub fn submissions_bulk_url() -> &'static str {
"https://www.sec.gov/Archives/edgar/daily-index/bulkdata/submissions.zip"
}
pub fn submissions_cik_url(cik: u64) -> String {
format!("{DATA_SEC_BASE}submissions/CIK{cik:010}.json")
}
pub fn companyfacts_url(cik: u64) -> String {
format!("{DATA_SEC_BASE}api/xbrl/companyfacts/CIK{cik:010}.json")
}
pub fn company_tickers_url() -> &'static str {
"https://www.sec.gov/files/company_tickers.json"
}
pub fn filing_index_url(cik: u64, accession_no_dashes: &str) -> String {
format!("{EDGAR_BASE}Archives/edgar/data/{cik}/{accession_no_dashes}/")
}
pub fn accession_no_dashes(accession: &str) -> String {
accession.replace('-', "")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn quarterly_idx_url_well_formed() {
let url = quarterly_master_idx_url(2024, 4);
assert_eq!(
url,
"https://www.sec.gov/Archives/edgar/full-index/2024/QTR4/master.idx"
);
}
#[test]
fn daily_idx_url_well_formed() {
let url = daily_company_idx_url(2024, 4, 20241115);
assert_eq!(
url,
"https://www.sec.gov/Archives/edgar/daily-index/2024/QTR4/company.20241115.idx"
);
}
#[test]
fn submissions_cik_url_zero_pads() {
assert_eq!(
submissions_cik_url(320193),
"https://data.sec.gov/submissions/CIK0000320193.json"
);
}
#[test]
fn companyfacts_url_zero_pads() {
assert_eq!(
companyfacts_url(789019),
"https://data.sec.gov/api/xbrl/companyfacts/CIK0000789019.json"
);
}
#[test]
fn accession_dashes_stripped() {
assert_eq!(
accession_no_dashes("0000320193-24-000123"),
"000032019324000123"
);
}
}