xbrl_rs/validation/
mod.rs1mod calculation;
4mod dimension;
5mod schema;
6mod value;
7
8use crate::{InstanceDocument, TaxonomySet};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum Severity {
13 Error,
15 Warning,
18}
19
20#[derive(Debug, Clone)]
22pub struct ValidationMessage {
23 pub severity: Severity,
25 pub code: String,
27 pub message: String,
29 pub concept_name: Option<String>,
31 pub context_ref: Option<String>,
33}
34
35#[derive(Debug, Default)]
37pub struct ValidationResult {
38 pub messages: Vec<ValidationMessage>,
39}
40
41impl ValidationResult {
42 pub fn new() -> Self {
43 Self::default()
44 }
45
46 pub fn errors(&self) -> Vec<&ValidationMessage> {
48 self.messages
49 .iter()
50 .filter(|m| m.severity == Severity::Error)
51 .collect()
52 }
53
54 pub fn warnings(&self) -> Vec<&ValidationMessage> {
56 self.messages
57 .iter()
58 .filter(|m| m.severity == Severity::Warning)
59 .collect()
60 }
61
62 pub fn is_valid(&self) -> bool {
64 !self.messages.iter().any(|m| m.severity == Severity::Error)
65 }
66
67 fn add(
68 &mut self,
69 severity: Severity,
70 code: &str,
71 message: String,
72 concept_name: Option<String>,
73 context_ref: Option<String>,
74 ) {
75 self.messages.push(ValidationMessage {
76 severity,
77 code: code.to_string(),
78 message,
79 concept_name,
80 context_ref,
81 });
82 }
83}
84
85pub fn validate_all(instance: &InstanceDocument, taxonomy: &TaxonomySet) -> ValidationResult {
88 let mut result = ValidationResult::new();
89 let prepared = value::prepare_fact_values(instance, taxonomy, &mut result);
90 schema::validate_schema(instance, taxonomy, &prepared, &mut result);
91 calculation::validate_calculations(instance, taxonomy, &prepared, &mut result);
92 dimension::validate_dimensions(instance, taxonomy, &mut result);
93 result
94}