diff --git a/agents.md b/agents.md index 47a762a..b672244 100644 --- a/agents.md +++ b/agents.md @@ -4,6 +4,7 @@ - All of `bun fmt`, `bun lint`, and `bun typecheck` must pass before considering tasks completed. - NEVER run `bun test`. Always use `bun run test` (runs Vitest). +- Always use the tea CLI for repository actions. ## Project Snapshot diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 476d1c6..ee85984 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -41,9 +41,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -56,15 +56,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -95,6 +95,28 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -137,6 +159,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" version = "1.2.56" @@ -168,6 +199,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -201,9 +233,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -211,9 +243,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -223,9 +255,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", @@ -235,15 +267,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "colored" @@ -252,7 +284,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "compact_str" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "serde", + "static_assertions", ] [[package]] @@ -267,11 +314,15 @@ version = "0.1.0" dependencies = [ "ahash", "anyhow", + "async-stream", "bitflags", + "bumpalo", "chrono", "clap", "colored", + "compact_str", "criterion", + "memchr", "memmap2", "mimalloc", "parking_lot", @@ -280,8 +331,10 @@ dependencies = [ "rayon", "serde", "serde_json", + "string-interner", "tempfile", "thiserror", + "tokio", ] [[package]] @@ -374,12 +427,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - [[package]] name = "errno" version = "0.3.14" @@ -417,8 +464,10 @@ name = "fiscal-xbrl-core" version = "0.1.0" dependencies = [ "anyhow", + "compact_str", "crabrl", "once_cell", + "quick-xml", "regex", "reqwest", "serde", @@ -511,24 +560,11 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi 5.3.0", + "r-efi", "wasip2", "wasm-bindgen", ] -[[package]] -name = "getrandom" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", - "wasip2", - "wasip3", -] - [[package]] name = "half" version = "2.7.1" @@ -549,12 +585,6 @@ dependencies = [ "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - [[package]] name = "heck" version = "0.5.0" @@ -772,12 +802,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "idna" version = "1.1.0" @@ -799,18 +823,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - [[package]] name = "ipnet" version = "2.12.0" @@ -875,12 +887,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" version = "0.2.183" @@ -1089,16 +1095,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -1187,12 +1183,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - [[package]] name = "rand" version = "0.9.2" @@ -1415,12 +1405,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - [[package]] name = "serde" version = "1.0.228" @@ -1510,6 +1494,22 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string-interner" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a3275464d7a9f2d4cac57c89c2ef96a8524dba2864c8d6f82e3980baf136f9b" +dependencies = [ + "hashbrown", + "serde", +] + [[package]] name = "strsim" version = "0.11.1" @@ -1560,7 +1560,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.3.4", "once_cell", "rustix", "windows-sys 0.61.2", @@ -1721,12 +1721,6 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "untrusted" version = "0.9.0" @@ -1797,15 +1791,6 @@ dependencies = [ "wit-bindgen", ] -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen", -] - [[package]] name = "wasm-bindgen" version = "0.2.114" @@ -1865,40 +1850,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap", - "semver", -] - [[package]] name = "web-sys" version = "0.3.91" @@ -2005,15 +1956,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" @@ -2166,88 +2108,6 @@ name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] [[package]] name = "writeable" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index a7b9ac5..999af60 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + "crabrl-fork", "fiscal-xbrl-core", "fiscal-xbrl-cli" ] @@ -12,7 +13,9 @@ version = "0.1.0" [workspace.dependencies] anyhow = "1.0" +compact_str = "0.8" once_cell = "1.21" +quick-xml = "0.36" regex = "1.11" reqwest = { version = "0.12", default-features = false, features = ["blocking", "json", "rustls-tls"] } serde = { version = "1.0", features = ["derive"] } diff --git a/rust/crabrl-fork b/rust/crabrl-fork new file mode 160000 index 0000000..d1cf177 --- /dev/null +++ b/rust/crabrl-fork @@ -0,0 +1 @@ +Subproject commit d1cf177ee946093771e8bd161aa7a4d69cd0c171 diff --git a/rust/fiscal-xbrl-core/Cargo.toml b/rust/fiscal-xbrl-core/Cargo.toml index 5781ca4..a9ed3a5 100644 --- a/rust/fiscal-xbrl-core/Cargo.toml +++ b/rust/fiscal-xbrl-core/Cargo.toml @@ -4,15 +4,14 @@ version.workspace = true edition.workspace = true license.workspace = true -[features] -default = [] -with-crabrl = ["dep:crabrl"] - [dependencies] anyhow.workspace = true +compact_str.workspace = true once_cell.workspace = true +quick-xml.workspace = true regex.workspace = true reqwest.workspace = true serde.workspace = true serde_json.workspace = true -crabrl = { path = "../vendor/crabrl", default-features = false, optional = true } + +crabrl = { path = "../crabrl-fork" } diff --git a/rust/fiscal-xbrl-core/src/lib.rs b/rust/fiscal-xbrl-core/src/lib.rs index f163946..65473cf 100644 --- a/rust/fiscal-xbrl-core/src/lib.rs +++ b/rust/fiscal-xbrl-core/src/lib.rs @@ -1,5 +1,7 @@ use anyhow::{anyhow, Context, Result}; use once_cell::sync::Lazy; +use quick_xml::events::Event; +use quick_xml::Reader; use regex::Regex; use reqwest::blocking::Client; use serde::{Deserialize, Serialize}; @@ -16,9 +18,6 @@ mod universal_income; use taxonomy_loader::{ComputationSpec, ComputedDefinition}; -#[cfg(feature = "with-crabrl")] -use crabrl as _; - pub const PARSER_ENGINE: &str = "fiscal-xbrl"; pub const PARSER_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -1062,24 +1061,79 @@ fn validate_xbrl_structure(xml: &str, source_file: Option<&str>) -> XbrlValidati }; } - if !xml.contains(" = Vec::new(); + let mut buf = Vec::new(); + + loop { + match reader.read_event_into(&mut buf) { + Ok(Event::Start(e)) | Ok(Event::Empty(e)) => { + let name = String::from_utf8_lossy(e.name().as_ref()).to_string(); + + // Check for XBRL root element + if depth == 0 && (name == "xbrl" || name.ends_with(":xbrl")) { + has_xbrl_root = true; + } + + if matches!(reader.read_event_into(&mut buf), Ok(Event::Start(_))) { + depth += 1; + tag_stack.push(name); + } + } + Ok(Event::End(e)) => { + if depth > 0 { + depth -= 1; + let name = String::from_utf8_lossy(e.name().as_ref()).to_string(); + if let Some(expected) = tag_stack.pop() { + if expected != name { + return XbrlValidationResult { + status: "warning".to_string(), + message: Some(format!( + "Mismatched tags in {:?}: expected , found ", + source_file.unwrap_or("unknown"), + expected, + name + )), + }; + } + } + } + } + Ok(Event::Eof) => break, + Err(e) => { + return XbrlValidationResult { + status: "warning".to_string(), + message: Some(format!( + "XML parse error in {:?} at byte {}: {}", + source_file.unwrap_or("unknown"), + reader.error_position(), + e + )), + }; + } + _ => {} + } + buf.clear(); + } + + if !has_xbrl_root { return XbrlValidationResult { status: "error".to_string(), message: Some("Invalid XBRL: missing root element".to_string()), }; } - let open_count = xml.matches('<').count(); - let close_count = xml.matches('>').count(); - - if open_count != close_count { + if depth != 0 { return XbrlValidationResult { status: "warning".to_string(), message: Some(format!( - "Malformed XML detected in {:?} ({} open, {} close tags)", + "Unclosed tags in {:?}: {} unclosed element(s)", source_file.unwrap_or("unknown"), - open_count, - close_count + depth )), }; } diff --git a/rust/fiscal-xbrl-core/src/surface_mapper.rs b/rust/fiscal-xbrl-core/src/surface_mapper.rs index bf31af7..1f1c5eb 100644 --- a/rust/fiscal-xbrl-core/src/surface_mapper.rs +++ b/rust/fiscal-xbrl-core/src/surface_mapper.rs @@ -571,6 +571,7 @@ fn evaluate_formula_for_period( match formula.op { SurfaceFormulaOp::Sum => sum_formula_values(&values, formula.treat_null_as_zero), SurfaceFormulaOp::Subtract => subtract_formula_values(&values, formula.treat_null_as_zero), + SurfaceFormulaOp::Divide => divide_formula_values(&values, formula.treat_null_as_zero), } } @@ -612,6 +613,33 @@ fn subtract_formula_values(values: &[Option], treat_null_as_zero: bool) -> Some(left - right) } +fn divide_formula_values(values: &[Option], treat_null_as_zero: bool) -> Option { + if values.len() != 2 { + return None; + } + + let left = if treat_null_as_zero { + values[0].unwrap_or(0.0) + } else { + values[0]? + }; + let right = if treat_null_as_zero { + values[1].unwrap_or(0.0) + } else { + values[1]? + }; + + if right == 0.0 { + return None; + } + + if !treat_null_as_zero && values.iter().all(|value| value.is_none()) { + return None; + } + + Some(left / right) +} + pub fn merge_mapping_assignments( primary: &mut HashMap, secondary: HashMap, @@ -831,6 +859,7 @@ fn transform_values( period_id.clone(), match sign_transform { Some(SurfaceSignTransform::Invert) => value.map(|amount| -amount), + Some(SurfaceSignTransform::Absolute) => value.map(|amount| amount.abs()), None => *value, }, ) diff --git a/rust/fiscal-xbrl-core/src/taxonomy_loader.rs b/rust/fiscal-xbrl-core/src/taxonomy_loader.rs index e2dc92c..d747ff6 100644 --- a/rust/fiscal-xbrl-core/src/taxonomy_loader.rs +++ b/rust/fiscal-xbrl-core/src/taxonomy_loader.rs @@ -15,6 +15,7 @@ fn default_include_in_output() -> bool { #[serde(rename_all = "snake_case")] pub enum SurfaceSignTransform { Invert, + Absolute, } #[derive(Debug, Deserialize, Clone)] @@ -73,6 +74,7 @@ pub struct SurfaceFormula { pub enum SurfaceFormulaOp { Sum, Subtract, + Divide, } #[derive(Debug, Deserialize, Clone)]