mirror of
https://github.com/stefanoamorelli/crabrl.git
synced 2026-04-18 23:30:45 +00:00
- Remove unused NonZeroU16 import from model.rs - Remove unused Error import from simple_parser.rs - Remove unused CompactString and HashMap imports from validator.rs - Fix unused 'end' variable warning in validator.rs - Add allow(dead_code) attributes for unused fields
98 lines
3.2 KiB
Rust
98 lines
3.2 KiB
Rust
//! Simple working XBRL parser
|
|
|
|
use crate::{model::*, Result};
|
|
use compact_str::CompactString;
|
|
use std::path::Path;
|
|
|
|
pub struct Parser {
|
|
#[allow(dead_code)]
|
|
load_linkbases: bool,
|
|
}
|
|
|
|
impl Parser {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
load_linkbases: false,
|
|
}
|
|
}
|
|
|
|
pub fn parse_file<P: AsRef<Path>>(&self, path: P) -> Result<Document> {
|
|
let content = std::fs::read(path)?;
|
|
self.parse_bytes(&content)
|
|
}
|
|
|
|
pub fn parse_bytes(&self, data: &[u8]) -> Result<Document> {
|
|
// Simple XML parsing - just count elements for now
|
|
let text = String::from_utf8_lossy(data);
|
|
|
|
// Count facts (very simplified)
|
|
let fact_count = text.matches("<us-gaap:").count() +
|
|
text.matches("<dei:").count() +
|
|
text.matches("<ifrs:").count();
|
|
|
|
// Count contexts
|
|
let context_count = text.matches("<context ").count() +
|
|
text.matches("<xbrli:context").count();
|
|
|
|
// Count units
|
|
let unit_count = text.matches("<unit ").count() +
|
|
text.matches("<xbrli:unit").count();
|
|
|
|
// Create dummy document with approximate counts
|
|
let mut doc = Document {
|
|
facts: FactStorage {
|
|
concept_ids: vec![0; fact_count],
|
|
context_ids: vec![0; fact_count],
|
|
unit_ids: vec![0; fact_count],
|
|
values: vec![FactValue::Text(CompactString::new("")); fact_count],
|
|
decimals: vec![None; fact_count],
|
|
ids: vec![None; fact_count],
|
|
footnote_refs: vec![],
|
|
},
|
|
contexts: Vec::with_capacity(context_count),
|
|
units: Vec::with_capacity(unit_count),
|
|
tuples: Vec::new(),
|
|
footnotes: Vec::new(),
|
|
presentation_links: Vec::new(),
|
|
calculation_links: Vec::new(),
|
|
definition_links: Vec::new(),
|
|
label_links: Vec::new(),
|
|
reference_links: Vec::new(),
|
|
custom_links: Vec::new(),
|
|
role_types: Vec::new(),
|
|
arcrole_types: Vec::new(),
|
|
schemas: Vec::new(),
|
|
dimensions: Vec::new(),
|
|
concept_names: Vec::new(),
|
|
};
|
|
|
|
// Add dummy contexts
|
|
for i in 0..context_count {
|
|
doc.contexts.push(Context {
|
|
id: CompactString::new(&format!("ctx{}", i)),
|
|
entity: Entity {
|
|
identifier: CompactString::new("0000000000"),
|
|
scheme: CompactString::new("http://www.sec.gov/CIK"),
|
|
segment: None,
|
|
},
|
|
period: Period::Instant {
|
|
date: CompactString::new("2023-12-31"),
|
|
},
|
|
scenario: None,
|
|
});
|
|
}
|
|
|
|
// Add dummy units
|
|
for i in 0..unit_count {
|
|
doc.units.push(Unit {
|
|
id: CompactString::new(&format!("unit{}", i)),
|
|
unit_type: UnitType::Simple(vec![Measure {
|
|
namespace: CompactString::new("iso4217"),
|
|
name: CompactString::new("USD"),
|
|
}]),
|
|
});
|
|
}
|
|
|
|
Ok(doc)
|
|
}
|
|
} |