From 0e768ae6db754b995daa946a0dd90048b9d17fc9 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Fri, 17 Jul 2026 00:29:06 +0200 Subject: [PATCH] feat: law-source-eurlex 0.1.0 (source.eu-recht) Fetch one EU legal act from EUR-Lex by CELEX number and return its FORMEX-4 XML content-addressed (SHA-256), so a flow's audit trail pins the exact Gesetzesstand it processed. - CELLAR content negotiation (application/xml;type=fmx4) on publications.europa.eu; 303 multiple-choice item selection - host-pinned redirect handling (max 3 hops), 64 MB body cap - consolidated CELEX (0...-YYYYMMDD) yields consolidation_date - net permission pinned to publications.europa.eu; no auth - 10 unit tests (no network), wasm32-wasip2 build green Signed-off-by: flemming-it --- .forgejo/workflows/ci.yml | 66 ++++ .gitignore | 3 + Cargo.lock | 709 ++++++++++++++++++++++++++++++++++++ Cargo.toml | 48 +++ LICENSE | 73 ++++ MODULE.de.md | 46 +++ MODULE.md | 46 +++ NOTICE | 28 ++ STORE.yaml | 28 ++ assets/icon.svg | 18 + law-source-eurlex.io.de.svg | 36 ++ law-source-eurlex.io.svg | 36 ++ module.wasm | Bin 0 -> 281342 bytes module.yaml | 77 ++++ rust-toolchain.toml | 4 + src/lib.rs | 508 ++++++++++++++++++++++++++ 16 files changed, 1726 insertions(+) create mode 100644 .forgejo/workflows/ci.yml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 MODULE.de.md create mode 100644 MODULE.md create mode 100644 NOTICE create mode 100644 STORE.yaml create mode 100644 assets/icon.svg create mode 100644 law-source-eurlex.io.de.svg create mode 100644 law-source-eurlex.io.svg create mode 100644 module.wasm create mode 100644 module.yaml create mode 100644 rust-toolchain.toml create mode 100644 src/lib.rs diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml new file mode 100644 index 0000000..3a0ad04 --- /dev/null +++ b/.forgejo/workflows/ci.yml @@ -0,0 +1,66 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: "-D warnings" + RUST_TOOLCHAIN: "1.86" + CARGO_NET_GIT_FETCH_WITH_CLI: "true" + +jobs: + ci: + name: Linux x86_64 (Forgejo) + runs-on: ubuntu-latest + steps: + - name: Checkout law-source-eurlex via external URL + run: | + set -eu + mkdir -p "$GITHUB_WORKSPACE" + cd "$GITHUB_WORKSPACE" + git init -q + git remote add origin \ + "https://x-access-token:${GITHUB_TOKEN}@git.flemming.ai/${GITHUB_REPOSITORY}.git" + git fetch --depth=1 origin "$GITHUB_SHA" + git checkout -q FETCH_HEAD + + - name: Configure git URL rewrite for SDK fetch + env: + SDK_PAT: ${{ secrets.MODULE_SDK_PAT }} + run: | + git config --global \ + "url.https://x-access-token:${SDK_PAT}@git.flemming.ai/.insteadOf" \ + "https://git.flemming.ai/" + + - name: Install system dependencies + run: | + apt-get update -qq + apt-get install -y --no-install-recommends \ + curl ca-certificates build-essential pkg-config libssl-dev git + + - name: Install Rust toolchain + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ + | sh -s -- -y --profile minimal \ + --default-toolchain "$RUST_TOOLCHAIN" \ + --target wasm32-wasip2 --component rustfmt --component clippy + echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + + - name: Cargo fmt --check + run: cargo fmt --all -- --check + + - name: Cargo clippy + run: cargo clippy --all-targets -- -D warnings + + - name: Cargo build (host) + run: cargo build --all-targets + + - name: Cargo test (host) + run: cargo test --all-targets + + - name: Cargo build (wasm32-wasip2) + run: cargo build --release --target wasm32-wasip2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e66a2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +target/ +**/*.rs.bk +.DS_Store diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..4634242 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,709 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "anyhow" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chain-module-sdk" +version = "0.3.0" +source = "git+https://git.flemming.ai/fai/chain-module-sdk-rust.git?tag=v0.3.0#a4415ada7e76aac5e3aabf3e4c4311ffc348d8d0" +dependencies = [ + "chain-module-sdk-macros", + "serde", + "serde_json", + "thiserror", + "wit-bindgen 0.36.0", +] + +[[package]] +name = "chain-module-sdk-macros" +version = "0.3.0" +source = "git+https://git.flemming.ai/fai/chain-module-sdk-rust.git?tag=v0.3.0#a4415ada7e76aac5e3aabf3e4c4311ffc348d8d0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "http" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "law_source_eurlex" +version = "0.1.0" +dependencies = [ + "chain-module-sdk", + "serde", + "serde_json", + "sha2", + "waki", +] + +[[package]] +name = "leb128" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52" + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "spdx" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" +dependencies = [ + "smallvec", +] + +[[package]] +name = "syn" +version = "2.0.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +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 = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "waki" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2db2daf1dfbadf228fd8b3c22b96a359135fd673b3d2c203274ee6a0df9c77" +dependencies = [ + "anyhow", + "form_urlencoded", + "http", + "serde", + "waki-macros", + "wit-bindgen 0.34.0", +] + +[[package]] +name = "waki-macros" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a061143f321cc5eeb523f60bdbcd45cfc3ee8851f8cf24f7a4b963bddc5642eb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "wasm-encoder" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8aa79bcd666a043b58f5fa62b221b0b914dd901e6f620e8ab7371057a797f3e1" +dependencies = [ + "leb128", + "wasmparser 0.219.2", +] + +[[package]] +name = "wasm-encoder" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1" +dependencies = [ + "leb128", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasm-metadata" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1ef51bd442042a2a7b562dddb6016ead52c4abab254c376dcffc83add2c9c34" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.219.2", + "wasmparser 0.219.2", +] + +[[package]] +name = "wasm-metadata" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.220.1", + "wasmparser 0.220.1", +] + +[[package]] +name = "wasmparser" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5220ee4c6ffcc0cb9d7c47398052203bc902c8ef3985b0c8134118440c0b2921" +dependencies = [ + "ahash", + "bitflags", + "hashbrown 0.14.5", + "indexmap", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25" +dependencies = [ + "ahash", + "bitflags", + "hashbrown 0.14.5", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e11ad55616555605a60a8b2d1d89e006c2076f46c465c892cc2c153b20d4b30" +dependencies = [ + "wit-bindgen-rt 0.34.0", + "wit-bindgen-rust-macro 0.34.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3" +dependencies = [ + "wit-bindgen-rt 0.36.0", + "wit-bindgen-rust-macro 0.36.0", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163cee59d3d5ceec0b256735f3ab0dccac434afb0ec38c406276de9c5a11e906" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.219.2", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744845cde309b8fa32408d6fb67456449278c66ea4dcd96de29797b302721f02" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6919521fc7807f927a739181db93100ca7ed03c29509b84d5f96b27b2e49a9a" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata 0.219.2", + "wit-bindgen-core 0.34.0", + "wit-component 0.219.2", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata 0.220.1", + "wit-bindgen-core 0.36.0", + "wit-component 0.220.1", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c967731fc5d50244d7241ecfc9302a8929db508eea3c601fbc5371b196ba38a5" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core 0.34.0", + "wit-bindgen-rust 0.34.0", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core 0.36.0", + "wit-bindgen-rust 0.36.0", +] + +[[package]] +name = "wit-component" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8479a29d81c063264c3ab89d496787ef78f8345317a2dcf6dece0f129e5fcd" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.219.2", + "wasm-metadata 0.219.2", + "wasmparser 0.219.2", + "wit-parser 0.219.2", +] + +[[package]] +name = "wit-component" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.220.1", + "wasm-metadata 0.220.1", + "wasmparser 0.220.1", + "wit-parser 0.220.1", +] + +[[package]] +name = "wit-parser" +version = "0.219.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca004bb251010fe956f4a5b9d4bf86b4e415064160dd6669569939e8cbf2504f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.219.2", +] + +[[package]] +name = "wit-parser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.220.1", +] + +[[package]] +name = "zerocopy" +version = "0.8.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..01dc945 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,48 @@ +# Standalone Cargo.toml — targets wasm32-wasip2. +# +# Build with: +# cargo build --release --target wasm32-wasip2 + +[package] +name = "law_source_eurlex" +version = "0.1.0" +edition = "2024" +authors = ["Dr. Stefan Flemming "] +license = "Apache-2.0" +publish = false +description = "F∆I module — fetch EU legal acts from EUR-Lex by CELEX number (FORMEX-4 XML, content-addressed)" +repository = "https://git.flemming.ai/chain-modules/law-source-eurlex" +rust-version = "1.85" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +chain-module-sdk = { git = "https://git.flemming.ai/fai/chain-module-sdk-rust.git", tag = "v0.3.0" } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +sha2 = "0.10" + +# WASI-0.2 HTTP client — same one http-request / llm-chat use. +# Only compiled into the wasm32-wasip2 build. +[target.'cfg(target_arch = "wasm32")'.dependencies] +waki = "0.5" + +[profile.release] +opt-level = "s" +lto = true +codegen-units = 1 +strip = "symbols" + +[lints.rust] +unsafe_op_in_unsafe_fn = "warn" + +[lints.clippy] +unwrap_used = "deny" +expect_used = "deny" +panic = "deny" +print_stdout = "deny" +print_stderr = "deny" + +[workspace] +# Empty workspace table so this package is NOT picked up by a parent. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cdde5b2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,73 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright 2026 Flemming.AI + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/MODULE.de.md b/MODULE.de.md new file mode 100644 index 0000000..a6574c0 --- /dev/null +++ b/MODULE.de.md @@ -0,0 +1,46 @@ +# source.eu-recht + + + +![law-source-eurlex inputs and outputs](law-source-eurlex.io.de.svg) + + +EU-Rechtsakte per CELEX-Nummer von EUR-Lex holen + +## Was es tut + +Löst eine CELEX-Nummer auf (z. B. `32016R0679` für die DSGVO oder +konsolidiert `02016R0679-20160504`), ruft den Rechtsakt vom +öffentlichen EUR-Lex-Endpunkt ab und liefert das FORMEX-4-XML plus +einen Metadaten-Datensatz. Die geholten Bytes sind inhaltsadressiert +(SHA-256) — das Prüfprotokoll des Flows hält damit den exakten +Gesetzesstand fest; ein späterer Abruf „derselben" CELEX-Nummer, den +EUR-Lex anders rendert, wird sichtbar statt still. + +Ausschließlich öffentliche EUR-Lex-Daten; die Netzwerk-Berechtigung +ist auf `publications.europa.eu` festgelegt (CELLAR, der Speicher des +EU-Amts für Veröffentlichungen hinter EUR-Lex). + +## Verwendung + +```yaml +steps: + - id: fetch + use: source.eu-recht@^0 + with: + celex: "32016R0679" + language: "DE" # optional, Standard DE + - id: normalize + use: text.akoma-normalize@^0 # ab 0.2 mit FORMEX-4-Adapter + with: + content: "{{ fetch.formex }}" + mime: "application/x-formex+xml" +``` + +Ausgaben: `formex` (Bytes, `application/xml`) und `meta` (JSON mit +`celex`, `language`, `url`, `source_sha256`, `byte_len` sowie +`consolidation_date` bei konsolidierten CELEX-Nummern). + +## Lizenz + +Apache-2.0 — ein Ch∆In-Plattform-Modul (Flemming.AI). diff --git a/MODULE.md b/MODULE.md new file mode 100644 index 0000000..6886e4a --- /dev/null +++ b/MODULE.md @@ -0,0 +1,46 @@ +# source.eu-recht + + + +![law-source-eurlex inputs and outputs](law-source-eurlex.io.svg) + + +Fetch EU legal acts from EUR-Lex by CELEX number + +## What it does + +Resolves a CELEX identifier (e.g. `32016R0679` for the GDPR, or the +consolidated form `02016R0679-20160504`) against the public EUR-Lex +CELLAR endpoint and returns the act's FORMEX-4 XML plus a +metadata record. The fetched bytes are content-addressed (SHA-256), +so the flow's audit trail pins the exact Gesetzesstand that was +processed — a later re-fetch of "the same" CELEX that renders +differently upstream becomes visible instead of silent. + +Public EUR-Lex data only; network permission is pinned to +`publications.europa.eu` (CELLAR, the EU Publications Office store +behind EUR-Lex). + +## How to use + +```yaml +steps: + - id: fetch + use: source.eu-recht@^0 + with: + celex: "32016R0679" + language: "DE" # optional, default DE + - id: normalize + use: text.akoma-normalize@^0 # 0.2+ understands FORMEX-4 + with: + content: "{{ fetch.formex }}" + mime: "application/x-formex+xml" +``` + +Outputs: `formex` (bytes, `application/xml`) and `meta` (JSON with +`celex`, `language`, `url`, `source_sha256`, `byte_len`, and +`consolidation_date` for consolidated CELEX numbers). + +## License + +Apache-2.0 — a Ch∆In platform module (Flemming.AI). diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..86eef87 --- /dev/null +++ b/NOTICE @@ -0,0 +1,28 @@ +law-source-eurlex +Copyright 2026 Flemming.AI + +This product includes software developed by Dr. Stefan Flemming +and contributors (https://flemming.ai/). + +------------------------------------------------------------------ +Third-party acknowledgments + +XML parsing uses the `quick-xml` crate +(https://github.com/tafia/quick-xml), MIT licensed. + +SHA-256 hashing uses the `sha2` crate +(https://github.com/RustCrypto/hashes), Apache-2.0 / MIT licensed. + +Module SDK glue is provided by `chain-module-sdk` +(https://git.flemming.ai/fai/chain-module-sdk-rust), Apache-2.0. + +------------------------------------------------------------------ +Methodological lineage + +The output schema is aligned with Akoma Ntoso 1.0 (OASIS +LegalDocML), the XML format the European Parliament has used +since 2016 for legislative texts. + +ELI synthesis in v0.1.0 is a deterministic fallback because +Germany lacks an upstream Bund-level ELI registrar. Replace once +BMJ publishes ELI URIs upstream. diff --git a/STORE.yaml b/STORE.yaml new file mode 100644 index 0000000..aa1cd36 --- /dev/null +++ b/STORE.yaml @@ -0,0 +1,28 @@ +schema_version: 1 + +author: + name: "Flemming.AI" + email: chain@flemming.ai + url: https://flemming.ai + +license: Apache-2.0 + +tagline: + en: "Fetch EU legal acts from EUR-Lex by CELEX" + de: "EU-Rechtsakte per CELEX von EUR-Lex holen" + +description: + en: "Resolves a CELEX number against the public EUR-Lex endpoint and returns the act's FORMEX-4 XML, content-addressed (SHA-256) so the audit trail pins the exact legal state processed." + de: "Löst eine CELEX-Nummer gegen den öffentlichen EUR-Lex-Endpunkt auf und liefert das FORMEX-4-XML des Rechtsakts, inhaltsadressiert (SHA-256) — das Prüfprotokoll hält den exakten Gesetzesstand fest." + +category: data +tags: [legal, eu, eur-lex, formex, source] + +assets: + icon: assets/icon.svg + +documentation: + long_description: MODULE.md + +links: + repository: https://git.flemming.ai/chain-modules/law-source-eurlex diff --git a/assets/icon.svg b/assets/icon.svg new file mode 100644 index 0000000..86d387c --- /dev/null +++ b/assets/icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/law-source-eurlex.io.de.svg b/law-source-eurlex.io.de.svg new file mode 100644 index 0000000..639e552 --- /dev/null +++ b/law-source-eurlex.io.de.svg @@ -0,0 +1,36 @@ +law-source-eurlexv0.1.0source.eu-recht@0.1.0EINGÄNGEAUSGÄNGElaw-source-eurlexcelex · textCELEX-Nummer des Rechtsakts, z. B.32016R0679 (DSGVO) oder konsolidiert02016R0679-20160504. Optionaleslanguage · textZwei-Buchstaben-Sprachcode von EUR-Lex(Standard DE; EN, FR, …). Wird gegendie 24 Amtssprachen-Codes geprüft.formex · bytesFORMEX-4-XML wie von EUR-Lex geliefert(application/xml). Für diestrukturierte Akoma-Ntoso-Darstellung anmeta · jsonJSON-codiertes SourceMeta (Felder s.EN). source_sha256 ist derVersionsanker: derselbe CELEX kannBerechtigungen: net: publications.europa.eu \ No newline at end of file diff --git a/law-source-eurlex.io.svg b/law-source-eurlex.io.svg new file mode 100644 index 0000000..e43ccab --- /dev/null +++ b/law-source-eurlex.io.svg @@ -0,0 +1,36 @@ +law-source-eurlexv0.1.0source.eu-recht@0.1.0INPUTSOUTPUTSlaw-source-eurlexcelex · textCELEX identifier of the act, e.g.32016R0679 (GDPR) or the consolidatedform 02016R0679-20160504. An optionallanguage · textTwo-letter EUR-Lex language code (DEdefault; EN, FR, …). Validated againstthe 24 official-language codes.formex · bytesFORMEX-4 XML body as served by EUR-Lex(application/xml). Feed intotext.akoma-normalize (0.2+) for themeta · jsonJSON-encoded SourceMeta: {schema_version: "0.1", celex:"32016R0679", language: "DE", url:Permissions: net: publications.europa.eu \ No newline at end of file diff --git a/module.wasm b/module.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d600458835afd8eb2f5663fcec279886d0cdcc9c GIT binary patch literal 281342 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�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

XXsp}`=Nz(eXU=qwdN=<6tusY_?6 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 Option<&'static str> { + LANGUAGES + .iter() + .find(|(code, _)| *code == two) + .map(|(_, three)| *three) +} + +/// Cap on how many manifestation items the module downloads while +/// looking for the act body — CELLAR lists cover pages and annex +/// volumes as separate DOC_n items. +const MAX_ITEMS: usize = 10; + +/// Cap on any single response body. waki buffers the response in +/// memory before we see it, so this cannot stop the transfer — but +/// it turns an absurd body into a clean module error instead of a +/// memory-exhaustion trap further down (the WASM memory ceiling +/// backstops the transfer itself). +const MAX_BODY_BYTES: usize = 64 * 1024 * 1024; + +/// Redirect hops the module follows (CELLAR answers `303 See +/// Other` for some content negotiations). Targets must stay on +/// publications.europa.eu — anything else fails loudly instead of +/// silently leaving the permission's intent. +const MAX_REDIRECTS: usize = 3; + +/// The only host this module talks to; mirrors the `net:` grant in +/// module.yaml. Redirects and listing items are pinned to it as +/// defense-in-depth — the hub enforces the permission either way. +const ALLOWED_URL_PREFIX: &str = "https://publications.europa.eu/"; + +#[derive(Debug, Serialize)] +struct SourceMeta { + schema_version: &'static str, + celex: String, + /// The REQUESTED language (Accept-Language negotiation). CELLAR + /// does not guarantee delivery in this language for acts that + /// were never published in it; the authoritative record of what + /// was actually delivered is `source_sha256` + `url`. Verifying + /// the delivered language from FORMEX internals is future work. + language: String, + url: String, + source_sha256: String, + byte_len: usize, + /// `YYYY-MM-DD` when the CELEX names a consolidated version + /// (sector-0 CELEX with `-YYYYMMDD` suffix); absent otherwise. + #[serde(skip_serializing_if = "Option::is_none")] + consolidation_date: Option, +} + +#[chain_module] +pub fn invoke(_ctx: Context, inputs: Inputs) -> Result { + let celex_raw = inputs.require_text("celex")?; + let celex = normalize_celex(celex_raw)?; + + let language = match inputs.get("language") { + Some(Payload::Text(s)) if !s.trim().is_empty() => { + let lang = s.trim().to_ascii_uppercase(); + if lang3_for(&lang).is_none() { + return Err(ModuleError::invalid_input(format!( + "unsupported EUR-Lex language '{lang}' \ + (two-letter code expected, e.g. DE, EN, FR)" + ))); + } + lang + } + _ => DEFAULT_LANGUAGE.to_string(), + }; + + let (body, url) = fetch_formex(&celex, &language)?; + + let meta = SourceMeta { + schema_version: "0.1", + celex: celex.clone(), + language, + url, + source_sha256: hex_sha256(&body), + byte_len: body.len(), + consolidation_date: consolidation_date(&celex), + }; + + Outputs::new() + .with_bytes("formex", "application/xml", body) + .with_json("meta", &meta) +} + +/// Validate + canonicalise a CELEX identifier. Accepts the plain +/// form (`32016R0679`) and the consolidated form +/// (`02016R0679-20160504`); strips surrounding whitespace and an +/// optional `CELEX:` prefix, upper-cases. Anything else is refused +/// with a hint rather than URL-encoded into a mystery 404. +fn normalize_celex(raw: &str) -> Result { + let upper = raw.trim().to_ascii_uppercase(); + let s = upper.strip_prefix("CELEX:").unwrap_or(&upper); + let s = s.trim().to_string(); + let valid_len = (8..=24).contains(&s.len()); + let valid_chars = s + .chars() + .all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '(' || c == ')'); + let starts_with_sector = s.chars().next().is_some_and(|c| c.is_ascii_alphanumeric()); + if !(valid_len && valid_chars && starts_with_sector) { + return Err(ModuleError::invalid_input(format!( + "'{raw}' is not a CELEX number \ + (expected e.g. 32016R0679, or consolidated 02016R0679-20160504)" + ))); + } + Ok(s) +} + +/// CELLAR resource URL for a CELEX identifier. Content negotiation +/// (`Accept: application/xml;type=fmx4` + `Accept-Language`) selects +/// the FORMEX-4 manifestation in the requested language. +fn cellar_url(celex: &str) -> String { + format!("https://publications.europa.eu/resource/celex/{celex}") +} + +/// Item URLs out of CELLAR's `300 Multiple-Choice` XHTML listing — +/// one `…/cellar/./DOC_n` link per manifestation item. +/// Plain string scan on the href attributes; the listing is machine- +/// generated and flat, an HTML parser would be dead weight here. +fn parse_item_urls(listing: &[u8]) -> Vec { + let text = String::from_utf8_lossy(listing); + let mut out = Vec::new(); + for part in text.split("href=\"").skip(1) { + let Some(end) = part.find('"') else { continue }; + let url = part[..end].replace("http://", "https://"); + // Host-pinned: a manipulated listing must not be able to + // point the module anywhere but CELLAR itself. + if url.starts_with(ALLOWED_URL_PREFIX) + && url.contains("/resource/cellar/") + && url.contains("/DOC_") + && !out.contains(&url) + { + out.push(url); + } + } + out +} + +/// True for the manifestation item that carries the act body (the +/// others are cover pages / tables of contents). +fn is_act_body(body: &[u8]) -> bool { + looks_like_formex(body) && { + let text = String::from_utf8_lossy(body); + text.contains(" Option { + let (_, tail) = celex.rsplit_once('-')?; + if tail.len() != 8 || !tail.chars().all(|c| c.is_ascii_digit()) { + return None; + } + Some(format!("{}-{}-{}", &tail[..4], &tail[4..6], &tail[6..8])) +} + +/// Cheap shape check: XML declaration or an XML root tag within the +/// leading bytes. EUR-Lex error pages are HTML (``). +fn looks_like_formex(body: &[u8]) -> bool { + let head = body.get(..512.min(body.len())).unwrap_or_default(); + let head = String::from_utf8_lossy(head); + let head = head.trim_start(); + if head.starts_with(" String { + let mut hasher = Sha256::new(); + hasher.update(data); + let digest = hasher.finalize(); + let mut s = String::with_capacity(64); + for byte in digest { + s.push(nibble_to_hex(byte >> 4)); + s.push(nibble_to_hex(byte & 0x0f)); + } + s +} + +fn nibble_to_hex(n: u8) -> char { + match n { + 0..=9 => (b'0' + n) as char, + 10..=15 => (b'a' + n - 10) as char, + _ => '?', + } +} + +/// Resolve a CELEX to its FORMEX-4 act body via CELLAR content +/// negotiation. The celex resource URL answers either 200 (single +/// manifestation item — the body itself) or 300 with an XHTML +/// listing of `DOC_n` items; in the latter case the items are +/// fetched in order until the one carrying the enacting terms is +/// found (cover pages and TOCs come first and are tiny). +fn fetch_formex(celex: &str, language: &str) -> Result<(Vec, String), ModuleError> { + let lang3 = lang3_for(language).unwrap_or("deu"); + let url = cellar_url(celex); + let (status, body, url) = fetch_redirected(&url, lang3)?; + + if status == 200 && is_act_body(&body) { + return Ok((body, url)); + } + if status == 300 || status == 200 { + let items = parse_item_urls(&body); + if items.is_empty() { + // A direct 200 that is FORMEX but carries no enacting + // terms IS the document — corrigenda and information + // notices have no ENACTING.TERMS, and CELLAR may serve + // them as a single manifestation without a listing. + if status == 200 && looks_like_formex(&body) { + return Ok((body, url)); + } + return Err(ModuleError::invalid_input(format!( + "EUR-Lex/CELLAR listed no FORMEX documents for CELEX {celex} \ + ({language}) — check the CELEX number" + ))); + } + let mut fallback: Option<(Vec, String)> = None; + for item in items.into_iter().take(MAX_ITEMS) { + let (s, b, item) = fetch_redirected(&item, lang3)?; + if s != 200 { + continue; + } + if is_act_body(&b) { + return Ok((b, item)); + } + // Remember the largest plain-FORMEX item as a fallback + // for document types without ENACTING.TERMS (corrigenda, + // information notices). + if looks_like_formex(&b) && fallback.as_ref().is_none_or(|(fb, _)| b.len() > fb.len()) { + fallback = Some((b, item)); + } + } + return fallback.ok_or_else(|| { + ModuleError::internal(format!( + "none of the CELLAR items for CELEX {celex} ({language}) \ + contained FORMEX XML" + )) + }); + } + Err(ModuleError::internal(format!( + "EUR-Lex/CELLAR answered HTTP {status} for {url}" + ))) +} + +/// One GET following up to [`MAX_REDIRECTS`] redirect hops (CELLAR +/// answers `303 See Other` for some content negotiations). Every +/// hop must stay on publications.europa.eu; each body is bounded by +/// [`MAX_BODY_BYTES`]. Returns the final URL alongside status and +/// body so `meta.url` names what was actually fetched. +fn fetch_redirected(url: &str, lang3: &str) -> Result<(u16, Vec, String), ModuleError> { + let mut url = url.to_string(); + for _ in 0..=MAX_REDIRECTS { + let (status, body, location) = fetch(&url, lang3)?; + if body.len() > MAX_BODY_BYTES { + return Err(ModuleError::internal(format!( + "EUR-Lex/CELLAR answered {} bytes for {url} — over the \ + {MAX_BODY_BYTES}-byte safety cap", + body.len() + ))); + } + if matches!(status, 301 | 302 | 303 | 307 | 308) { + let Some(target) = location else { + return Err(ModuleError::internal(format!( + "EUR-Lex/CELLAR answered HTTP {status} for {url} \ + without a Location header" + ))); + }; + // Resolve a relative Location against the CELLAR host. + let target = if target.starts_with('/') { + format!("https://publications.europa.eu{target}") + } else { + target.replace("http://", "https://") + }; + if !target.starts_with(ALLOWED_URL_PREFIX) { + return Err(ModuleError::internal(format!( + "EUR-Lex/CELLAR redirected {url} off-host to {target} — \ + refusing (module talks to publications.europa.eu only)" + ))); + } + url = target; + continue; + } + return Ok((status, body, url)); + } + Err(ModuleError::internal(format!( + "EUR-Lex/CELLAR redirect chain for {url} exceeded \ + {MAX_REDIRECTS} hops" + ))) +} + +/// WASM path: one GET with FORMEX content negotiation. Returns +/// status, body and the Location header (redirects are NOT +/// auto-followed under wasi-http — `fetch_redirected` handles +/// them). The hub's sandbox enforces the +/// `net: publications.europa.eu` permission. +#[cfg(target_arch = "wasm32")] +fn fetch(url: &str, lang3: &str) -> Result<(u16, Vec, Option), ModuleError> { + let lang_value = waki::header::HeaderValue::from_str(lang3) + .map_err(|e| ModuleError::internal(format!("invalid language header: {e}")))?; + let response = waki::Client::new() + .get(url) + .header( + waki::header::HeaderName::from_static("accept"), + waki::header::HeaderValue::from_static("application/xml;type=fmx4"), + ) + .header( + waki::header::HeaderName::from_static("accept-language"), + lang_value, + ) + .send() + .map_err(|e| ModuleError::internal(format!("EUR-Lex request failed: {e}")))?; + let status = response.status_code(); + let location = response + .headers() + .get("location") + .and_then(|v| v.to_str().ok()) + .map(str::to_string); + let body = response + .body() + .map_err(|e| ModuleError::internal(format!("EUR-Lex body read failed: {e}")))?; + Ok((status, body, location)) +} + +/// Host-side stub. Lets `cargo test` (no wasm target) link the rlib +/// without pulling waki; the real path is the wasm32 variant above. +#[cfg(not(target_arch = "wasm32"))] +fn fetch(_url: &str, _lang3: &str) -> Result<(u16, Vec, Option), ModuleError> { + Err(ModuleError::internal( + "source.eu-recht can only fetch under the WASM runtime", + )) +} + +#[cfg(test)] +mod tests { + #![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] + use super::*; + + #[test] + fn accepts_plain_celex() { + assert_eq!(normalize_celex("32016R0679").unwrap(), "32016R0679"); + assert_eq!(normalize_celex(" celex:32016r0679 ").unwrap(), "32016R0679"); + } + + #[test] + fn accepts_consolidated_celex_and_extracts_date() { + let c = normalize_celex("02016R0679-20160504").unwrap(); + assert_eq!(c, "02016R0679-20160504"); + assert_eq!(consolidation_date(&c).as_deref(), Some("2016-05-04")); + assert_eq!(consolidation_date("32016R0679"), None); + } + + #[test] + fn rejects_garbage_celex() { + assert!(normalize_celex("").is_err()); + assert!(normalize_celex("not a celex!").is_err()); + assert!(normalize_celex("https://eur-lex.europa.eu/x").is_err()); + } + + #[test] + fn builds_the_cellar_url() { + assert_eq!( + cellar_url("32016R0679"), + "https://publications.europa.eu/resource/celex/32016R0679" + ); + } + + #[test] + fn maps_two_letter_language_to_iso639_3() { + assert_eq!(lang3_for("DE"), Some("deu")); + assert_eq!(lang3_for("EN"), Some("eng")); + assert_eq!(lang3_for("XX"), None); + } + + /// Trimmed copy of CELLAR's real `300 Multiple-Choice` XHTML + /// (as served for CELEX 32016R0679, 2026-07). + const SAMPLE_LISTING: &str = r#"300 Multiple-Choice Response List of URI's:

"#; + + #[test] + fn parses_doc_items_from_multiple_choice_listing() { + let items = parse_item_urls(SAMPLE_LISTING.as_bytes()); + assert_eq!(items.len(), 2); + assert!(items[0].starts_with("https://publications.europa.eu/resource/cellar/")); + assert!(items[0].ends_with("/DOC_1")); + assert!(items[1].ends_with("/DOC_2")); + assert!(parse_item_urls(b"no links").is_empty()); + } + + #[test] + fn off_host_listing_items_are_filtered() { + // A manipulated listing must not steer the module anywhere + // but CELLAR itself, even before the hub's net permission + // would refuse the request. + let evil = br#"x +y +ok"#; + let items = parse_item_urls(evil); + assert_eq!(items.len(), 1); + assert!(items[0].starts_with("https://publications.europa.eu/")); + } + + #[test] + fn act_body_detection_tells_act_from_toc() { + let act = b"
"; + let toc = + b""; + assert!(is_act_body(act)); + assert!(!is_act_body(toc)); + } + + #[test] + fn formex_shape_check_accepts_xml_rejects_html() { + assert!(looks_like_formex(b"...")); + assert!(looks_like_formex(b"")); + assert!(!looks_like_formex( + b"Not found" + )); + assert!(!looks_like_formex( + b"" + )); + assert!(!looks_like_formex(b"")); + } + + #[test] + fn hashes_are_hex_and_deterministic() { + let a = hex_sha256(b"abc"); + assert_eq!(a.len(), 64); + assert_eq!(a, hex_sha256(b"abc")); + } +}