From d3976650569381f5d110d276081456be2434e0d0 Mon Sep 17 00:00:00 2001 From: Randall Nortman Date: Thu, 6 Aug 2026 10:49:30 -0400 Subject: [PATCH] Add CST<->AST conversion This adds a new `.fltkast` sidecar DSL, which allows fltk to generate higher-level, more ergonomic AST classes from CST parse results, and also convert AST back to CST for unparsing/formatting. Applications that need complete fidelity with the original grammar (like refactoring tools and formatters) should stick with CST, while most applications that just want to get at the semantic content will be better served by the AST. --- CHANGELOG.md | 34 +- CLAUDE.md | 4 + Cargo.lock | 588 +++ Cargo.toml | 20 +- MODULE.bazel | 16 +- MODULE.bazel.lock | 847 +++- Makefile | 75 +- TODO.md | 93 + crates/fegen-rust/src/unparser.rs | 95 +- crates/fltk-ast-core/BUILD.bazel | 32 + crates/fltk-ast-core/Cargo.toml | 54 + crates/fltk-ast-core/src/children.rs | 191 + crates/fltk-ast-core/src/convert.rs | 66 + crates/fltk-ast-core/src/error.rs | 168 + crates/fltk-ast-core/src/fold.rs | 321 ++ crates/fltk-ast-core/src/lib.rs | 98 + crates/fltk-ast-core/src/scalar.rs | 576 +++ crates/fltk-ast-core/src/synth.rs | 620 +++ crates/fltk-ast-core/src/terminal.rs | 242 + crates/fltk-parser-core/Cargo.toml | 12 +- fltk/_stubs/rust_parser_fixture/unparser.pyi | 10 + fltk/fegen/ast_config.py | 1583 ++++++ fltk/fegen/ast_model.py | 3652 ++++++++++++++ fltk/fegen/ast_test_grammars.py | 243 + fltk/fegen/cst_ergonomics.py | 17 +- fltk/fegen/fltkast.fltkg | 37 + fltk/fegen/fltkast_cst.py | 4238 +++++++++++++++++ fltk/fegen/fltkast_cst_protocol.py | 1846 +++++++ fltk/fegen/fltkast_parser.py | 2332 +++++++++ fltk/fegen/fltkast_trivia_parser.py | 2404 ++++++++++ fltk/fegen/genparser.py | 312 +- fltk/fegen/grammar_shape.py | 285 ++ fltk/fegen/gsm2ast.py | 1427 ++++++ fltk/fegen/gsm2ast_rs.py | 2818 +++++++++++ fltk/fegen/gsm2parser_rs.py | 21 +- fltk/fegen/gsm2tree_rs.py | 2 + fltk/fegen/pyrt/astrt.py | 937 ++++ fltk/fegen/pyrt/errors.py | 18 + fltk/fegen/test_ast_config.py | 1146 +++++ fltk/fegen/test_ast_model.py | 3234 +++++++++++++ .../fegen/test_data/rust_parser_fixture.fltkg | 21 + fltk/fegen/test_genparser.py | 564 ++- fltk/fegen/test_gsm2ast.py | 3072 ++++++++++++ fltk/plumbing.py | 247 +- fltk/plumbing_types.py | 14 + fltk/test_plumbing.py | 230 + fltk/unparse/gsm2unparser.py | 18 + fltk/unparse/gsm2unparser_rs.py | 40 +- fltk/unparse/literal_labels.py | 128 + fltk/unparse/pyrt.py | 21 + fltk/unparse/test_labeled_literal_text.py | 246 + fltk/unparse/test_omit_functionality.py | 16 +- fltk/unparse/test_pyrt.py | 28 +- pyproject.toml | 3 + tests/bazel_consumer/BUILD.bazel | 54 + tests/bazel_consumer/MODULE.bazel | 5 + tests/bazel_consumer/MODULE.bazel.lock | 846 +++- tests/bazel_consumer/consumer_ast.fltkast | 6 + tests/bazel_consumer/consumer_ast.fltkg | 13 + tests/bazel_consumer/consumer_ast_lib.rs | 22 + tests/generated_rust_gate.py | 158 + tests/rust_parser_fixture/Cargo.lock | 604 ++- tests/rust_parser_fixture/Cargo.toml | 3 + .../rust_parser_fixture.fltkast | 11 + tests/rust_parser_fixture/src/ast.rs | 3331 +++++++++++++ tests/rust_parser_fixture/src/ast_tests.rs | 371 ++ tests/rust_parser_fixture/src/cst.rs | 3924 +++++++++++++++ tests/rust_parser_fixture/src/lib.rs | 2 + tests/rust_parser_fixture/src/parser.rs | 280 +- tests/rust_parser_fixture/src/unparser.rs | 423 ++ .../src/unparser_default.rs | 423 ++ tests/rust_parser_fixture_cst_protocol.py | 258 + tests/test_ast_core_manifest.py | 45 + tests/test_ast_error_message_parity.py | 256 + tests/test_check_step_order.py | 50 + tests/test_generated_rust_gate.py | 1667 +++++++ tests/test_gsm2ast_rs.py | 1740 +++++++ tests/test_pyrt_errors.py | 33 +- tests/test_rust_parser_parity_fixture.py | 17 + tests/test_rust_unparser_generator.py | 17 +- tests/test_rust_unparser_parity_fixture.py | 11 + tests/test_tracked_ast_artifact.py | 58 + uv.lock | 2 + 83 files changed, 49854 insertions(+), 138 deletions(-) create mode 100644 crates/fltk-ast-core/BUILD.bazel create mode 100644 crates/fltk-ast-core/Cargo.toml create mode 100644 crates/fltk-ast-core/src/children.rs create mode 100644 crates/fltk-ast-core/src/convert.rs create mode 100644 crates/fltk-ast-core/src/error.rs create mode 100644 crates/fltk-ast-core/src/fold.rs create mode 100644 crates/fltk-ast-core/src/lib.rs create mode 100644 crates/fltk-ast-core/src/scalar.rs create mode 100644 crates/fltk-ast-core/src/synth.rs create mode 100644 crates/fltk-ast-core/src/terminal.rs create mode 100644 fltk/fegen/ast_config.py create mode 100644 fltk/fegen/ast_model.py create mode 100644 fltk/fegen/ast_test_grammars.py create mode 100644 fltk/fegen/fltkast.fltkg create mode 100644 fltk/fegen/fltkast_cst.py create mode 100644 fltk/fegen/fltkast_cst_protocol.py create mode 100644 fltk/fegen/fltkast_parser.py create mode 100644 fltk/fegen/fltkast_trivia_parser.py create mode 100644 fltk/fegen/grammar_shape.py create mode 100644 fltk/fegen/gsm2ast.py create mode 100644 fltk/fegen/gsm2ast_rs.py create mode 100644 fltk/fegen/pyrt/astrt.py create mode 100644 fltk/fegen/test_ast_config.py create mode 100644 fltk/fegen/test_ast_model.py create mode 100644 fltk/fegen/test_gsm2ast.py create mode 100644 fltk/unparse/literal_labels.py create mode 100644 fltk/unparse/test_labeled_literal_text.py create mode 100644 tests/bazel_consumer/consumer_ast.fltkast create mode 100644 tests/bazel_consumer/consumer_ast.fltkg create mode 100644 tests/bazel_consumer/consumer_ast_lib.rs create mode 100644 tests/generated_rust_gate.py create mode 100644 tests/rust_parser_fixture/rust_parser_fixture.fltkast create mode 100644 tests/rust_parser_fixture/src/ast.rs create mode 100644 tests/rust_parser_fixture/src/ast_tests.rs create mode 100644 tests/test_ast_core_manifest.py create mode 100644 tests/test_ast_error_message_parity.py create mode 100644 tests/test_check_step_order.py create mode 100644 tests/test_generated_rust_gate.py create mode 100644 tests/test_gsm2ast_rs.py create mode 100644 tests/test_tracked_ast_artifact.py diff --git a/CHANGELOG.md b/CHANGELOG.md index cd2d95f..80b71cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,37 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [0.5.0] - 2026-08-06 + +### Added + +- Generated AST layer. A grammar can now be given a `.fltkast` sidecar and generate typed AST + node classes beside its CST: plain owned data (dataclasses on Python, structs and enums on + Rust), one type per rule, with converters in both directions (`from_cst` / `to_cst`) and + one-call entry points (`parse`/`unparse` on Python, `parse_str`/`unparse_str` on Rust) that + carry text in and out. Spans never take part in equality, so values converted from identical + text at different offsets compare equal. The sidecar shapes the result: `transparent;` erases a + rule to its payload, `flatten;` splices a wrapper's fields into its parents, `type:` coerces a + terminal to a scalar (integers, floats, `uuid`, `decimal`, or a `custom(...)` type of your own), + `key:` turns a collection into an insertion-ordered map, `fold_left:`/`fold_right:` folds a + repetition into a binary chain, and `name:`/`field`/`variant` rename anything generated. + Details will land with the AST documentation. + +### Changed + +- The formatter's labeled-literal trial matching is now text-aware. A CST child whose text one + spelling of a label cannot produce is declined by that spelling instead of being rendered + through it, so trees that previously rendered *wrongly* now render the branch that matches, or + fail loudly. +- Unparser generation now rejects an always-present labeled literal with more than one spelling + under one label: the unparser cannot know which spelling a value came from. The error message + names the rule, the label and the spellings, and is the migration path. +- AST generation rejects two indistinguishable branches of one alternation (values of the two + cannot be told apart at runtime, so one branch would render every one of them) and a capture + group named more than once in the pattern that rebuilds a terminal-only rule's text. Both were + previously silent corruption or a panic at the first serialize. +- Python generated converters raise `AstError` on a child of the wrong kind, where they + previously failed incidentally further down. ## [0.4.0] - 2026-08-03 @@ -263,4 +293,4 @@ cleanups and modernization. [0.2.0]: https://github.com/rnortman/fltk/compare/v0.1.1...v0.2.0 [0.1.1]: https://github.com/rnortman/fltk/compare/v0.1.0...v0.1.1 [0.1.0]: https://github.com/rnortman/fltk/releases/tag/v0.1.0 -[0.0.1]: https://github.com/rnortman/fltk/releases/tag/v0.0.1 \ No newline at end of file +[0.0.1]: https://github.com/rnortman/fltk/releases/tag/v0.0.1 diff --git a/CLAUDE.md b/CLAUDE.md index 1bdc115..9d09207 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,6 +74,10 @@ The exact toolchain version is pinned in `rust-toolchain.toml` (rustup installs **Lockfile workflow (single writer per file).** `uv.lock` and `requirements_lock.txt` (the Bazel pip lockfile) both have exactly one writer: `make regen-locks` (`uv lock` + the pinned `uv export`). `make check-locks` regenerates that pair and then diffs it together with every tracked `Cargo.lock`, failing on any difference. It does not regenerate a `Cargo.lock` itself: in full `make check` order the maturin builds under `test` rewrite a stale one in place and the `check-locks` diff catches that rewrite, while a cargo step run on its own fails immediately on `--locked` — the only gate for `crates/fltkfmt/Cargo.lock`, which no maturin target builds. So `make check-locks` alone is not sufficient to clear Cargo.lock drift after editing a `Cargo.toml`; run `make check`. A Dependabot `uv` PR bumps `pyproject.toml`/`uv.lock` only and fails `check-locks` by construction; complete it by running `make regen-locks` on the branch and pushing the regenerated `requirements_lock.txt`. Never hand-edit these files or add a second generator (a pip updater, a Bazel `lock` rule) — its edits would be silently clobbered on the next regeneration. +The two `MODULE.bazel.lock` files (repo root and `tests/bazel_consumer/`) are tracked, Bazel-written locks, and bzlmod's default `lockfile_mode` is `update`: a Bazel run repairs a stale one in place and still reports green, so a manifest edit can leave the committed lock wrong indefinitely. `make check-bazel-locks` is the diff that forces the repair to be committed, and it runs last in `CHECK_STEPS` — after `bazel-check` and `bazel-consumer-check`, which are the lanes that do the repairing. Same caveat as above: the diff step alone passes vacuously with no prior Bazel run, so `make check` is the gate that clears them. + +**`CARGO_BAZEL_REPIN=1` after editing a `Cargo.toml`.** With an already-populated Bazel output base, a Bazel lane can fail with `no such target '@fltk_crates//:'` — the crate_universe repos were resolved from the previous manifests. One run with `CARGO_BAZEL_REPIN=1` (e.g. `CARGO_BAZEL_REPIN=1 bazel test //...`) re-resolves them and clears it. A fresh cache, including CI, never sees this. + **Version pins for uv and Bazel.** uv is pinned exactly via `[tool.uv] required-version` in `pyproject.toml` (CI installs the same version through setup-uv's `version-file`); every `uv` invocation self-enforces it, so a mismatch is a loud error, not silent drift. Bazel is pinned via `.bazelversion` (bazelisk honors it in CI). Neither is Dependabot-managed; bump each manually — edit the pin, run `make check`, commit. **Build and test workflow**: diff --git a/Cargo.lock b/Cargo.lock index 777171d..9217377 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,17 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -61,6 +72,100 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "borsh" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" +dependencies = [ + "borsh-derive", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f347189c62a579b8cd5f80714efa178f52e461dc2e6d701d264f5ff22e566c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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 = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + [[package]] name = "clap" version = "4.6.4" @@ -107,6 +212,23 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fltk-ast-core" +version = "0.4.0" +dependencies = [ + "fltk-cst-core", + "indexmap", + "regex-automata", + "rust_decimal", + "uuid", +] + [[package]] name = "fltk-cst-core" version = "0.4.0" @@ -142,18 +264,101 @@ dependencies = [ name = "fltk-unparser-core" version = "0.4.0" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +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 = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.186" @@ -166,6 +371,15 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -178,12 +392,36 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + [[package]] name = "portable-atomic" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -193,6 +431,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pyo3" version = "0.29.0" @@ -259,6 +517,42 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "regex-automata" version = "0.4.16" @@ -276,12 +570,144 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rust_decimal" +version = "1.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand", + "rkyv", + "serde", + "serde_json", + "wasm-bindgen", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.117" @@ -304,12 +730,63 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow", +] + [[package]] name = "unicode-ident" version = "1.0.24" @@ -322,6 +799,73 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + [[package]] name = "windows-link" version = "0.2.1" @@ -336,3 +880,47 @@ checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 index 5b812d3..24a6f57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,25 @@ [workspace] -members = [".", "crates/fltk-cst-core", "crates/fltk-parser-core", "crates/fltk-unparser-core", "crates/fltk-fmt-cli"] +members = [".", "crates/fltk-cst-core", "crates/fltk-parser-core", "crates/fltk-unparser-core", "crates/fltk-ast-core", "crates/fltk-fmt-cli"] resolver = "2" +# Single writer for the regex engine. fltk-parser-core compiles a grammar's terminals for +# anchored prefix matching and fltk-ast-core compiles the same terminals for full-match +# validation, so the two must agree on version *and* feature set: a pattern the generated +# parser accepts has to compile in the AST layer too. Two hand-maintained copies of the pin +# would drift with no diagnostic, so members inherit it with `workspace = true`. +[workspace.dependencies] +regex-automata = { version = "0.4", default-features = false, features = [ + "std", + "syntax", + "perf", + "unicode", + "meta", + "nfa-backtrack", + "nfa-pikevm", + "hybrid", + "dfa-onepass", +] } + [package] name = "fltk-native" version = "0.4.0" diff --git a/MODULE.bazel b/MODULE.bazel index a002900..dfa4d9b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -38,21 +38,19 @@ pip.parse( ) use_repo(pip, "pypi") -# Third-party Rust dependencies (pyo3, regex-automata, and transitive graph). +# Third-party Rust dependencies (pyo3, regex-automata, indexmap, and transitive graph). # This hub is module-private: FLTK's macros reference it as internal labels. # Clockwork and other consumers do NOT need a use_repo for this hub. # -# Membership note: `from_cargo` seeds from the workspace root Cargo.toml, whose -# [workspace] members include ".", "crates/fltk-cst-core", and "crates/fltk-parser-core". -# The tests/* fixture crates have their own [workspace] declarations and are excluded. +# Membership note: only the workspace root Cargo.toml belongs in `manifests` — from_cargo +# reads its [workspace] members (".", "crates/fltk-cst-core", "crates/fltk-parser-core", +# "crates/fltk-unparser-core", "crates/fltk-ast-core", "crates/fltk-fmt-cli") itself, and +# rules_rust reports listing them again as removable. The tests/* fixture crates have their +# own [workspace] declarations and are excluded from this hub. crate = use_extension("@rules_rust//crate_universe:extensions.bzl", "crate") crate.from_cargo( name = "fltk_crates", cargo_lockfile = "//:Cargo.lock", - manifests = [ - "//:Cargo.toml", - "//crates/fltk-cst-core:Cargo.toml", - "//crates/fltk-parser-core:Cargo.toml", - ], + manifests = ["//:Cargo.toml"], ) use_repo(crate, "fltk_crates") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 59170cb..59e999e 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -474,7 +474,7 @@ "@@rules_rust+//crate_universe:extensions.bzl%crate": { "general": { "bzlTransitiveDigest": "Jjy8RR8WOiggS0A6yvYQ10gGHtEEqEIeLQqYA0wuOwc=", - "usagesDigest": "qwXQ5vMv2+xx6ub0pL1Ob1IJRbwRtASDYjmaIjssqN8=", + "usagesDigest": "PXJvcznjWWhPGcuF94fizLzvsOvgFza3SlumcUKhOYg=", "recordedInputs": [ "ENV:CARGO_BAZEL_DEBUG \\0", "ENV:CARGO_BAZEL_GENERATOR_SHA256 \\0", @@ -497,11 +497,12 @@ "REPO_MAPPING:rules_rust+,bazel_tools bazel_tools", "REPO_MAPPING:rules_rust+,rules_cc rules_cc+", "REPO_MAPPING:rules_rust+,rules_rust rules_rust+", - "FILE:@@//Cargo.lock 1d47313e421faaa3f7ef9574d66fbbe4d512487fa297ec8b9802e47ba0513b53", - "FILE:@@//Cargo.toml eabf9e14b2f3e8bdcf08b0a869479638da9fc158b98c63e90556787ffc2e7925", + "FILE:@@//Cargo.lock 8964be40e28ed88237819e32023e01598e08b2649665440adc71e154615cd44a", + "FILE:@@//Cargo.toml 55db008f979ffb3ba54b255fc7aa2f94fdf981485e7a0d5ea304a45b1e85bdbe", "FILE:@@//crates/fltk-cst-core/Cargo.toml 19f9cd151a3e7f5e866a6ebe1b1cc9790767f4da8b4a777166c2fed0843dd1c8", - "FILE:@@//crates/fltk-parser-core/Cargo.toml fca359b01e474f2947c8c6a86ab2dabaf6e7f43f00c381e26bd4dbb3122002d7", + "FILE:@@//crates/fltk-parser-core/Cargo.toml 4990a2501a741322f9ae87154146c2b11e101254bd4e87fbbc1dde1e64b5d05d", "FILE:@@//crates/fltk-unparser-core/Cargo.toml 170b58fbca036fcbc13f9bceb2e134765c6c1da986a8443a85621e8e1ed04b71", + "FILE:@@//crates/fltk-ast-core/Cargo.toml 9e091b9d414ca9b5051f054b6712145f5095bdf1856e1694fc4813f6fbea3be0", "FILE:@@//crates/fltk-fmt-cli/Cargo.toml f1f46fd2bc2bd433a130732c5fb8cfffd2cf2eb071f6873bcdb9e2cfaa043c96" ], "generatedRepoSpecs": { @@ -509,12 +510,25 @@ "repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo", "attributes": { "contents": { - "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"clap-4.6.4\",\n actual = \"@fltk_crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@fltk_crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pyo3-0.29.0\",\n actual = \"@fltk_crates__pyo3-0.29.0//:pyo3\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pyo3\",\n actual = \"@fltk_crates__pyo3-0.29.0//:pyo3\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-automata-0.4.16\",\n actual = \"@fltk_crates__regex-automata-0.4.16//:regex_automata\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-automata\",\n actual = \"@fltk_crates__regex-automata-0.4.16//:regex_automata\",\n tags = [\"manual\"],\n)\n", + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"clap-4.6.4\",\n actual = \"@fltk_crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@fltk_crates__clap-4.6.4//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indexmap-2.14.0\",\n actual = \"@fltk_crates__indexmap-2.14.0//:indexmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"indexmap\",\n actual = \"@fltk_crates__indexmap-2.14.0//:indexmap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pyo3-0.29.0\",\n actual = \"@fltk_crates__pyo3-0.29.0//:pyo3\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"pyo3\",\n actual = \"@fltk_crates__pyo3-0.29.0//:pyo3\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-automata-0.4.16\",\n actual = \"@fltk_crates__regex-automata-0.4.16//:regex_automata\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"regex-automata\",\n actual = \"@fltk_crates__regex-automata-0.4.16//:regex_automata\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust_decimal-1.42.1\",\n actual = \"@fltk_crates__rust_decimal-1.42.1//:rust_decimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust_decimal\",\n actual = \"@fltk_crates__rust_decimal-1.42.1//:rust_decimal\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.24.0\",\n actual = \"@fltk_crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@fltk_crates__uuid-1.24.0//:uuid\",\n tags = [\"manual\"],\n)\n", "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", - "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"crates/fltk-cst-core\": {\n _COMMON_CONDITION: {\n \"pyo3\": Label(\"@fltk_crates//:pyo3-0.29.0\"),\n },\n },\n \"crates/fltk-fmt-cli\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"@fltk_crates//:clap-4.6.4\"),\n },\n },\n \"\": {\n _COMMON_CONDITION: {\n \"pyo3\": Label(\"@fltk_crates//:pyo3-0.29.0\"),\n },\n },\n \"crates/fltk-parser-core\": {\n _COMMON_CONDITION: {\n \"regex-automata\": Label(\"@fltk_crates//:regex-automata-0.4.16\"),\n },\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"crates/fltk-cst-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-fmt-cli\": {\n _COMMON_CONDITION: {\n },\n },\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-parser-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(not(target_has_atomic = \\\"64\\\"))\": [],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"fltk_crates__aho-corasick-1.1.4\",\n sha256 = \"ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.4/download\"],\n strip_prefix = \"aho-corasick-1.1.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.aho-corasick-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap-4.6.4\",\n sha256 = \"d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.4/download\"],\n strip_prefix = \"clap-4.6.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap_builder-4.6.2\",\n sha256 = \"f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.2/download\"],\n strip_prefix = \"clap_builder-4.6.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap_builder-4.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap_derive-4.6.4\",\n sha256 = \"d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.4/download\"],\n strip_prefix = \"clap_derive-4.6.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap_derive-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__libc-0.2.186\",\n sha256 = \"68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.186/download\"],\n strip_prefix = \"libc-0.2.186\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.libc-0.2.186.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__memchr-2.8.1\",\n sha256 = \"6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.1/download\"],\n strip_prefix = \"memchr-2.8.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.memchr-2.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__portable-atomic-1.13.1\",\n sha256 = \"c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic/1.13.1/download\"],\n strip_prefix = \"portable-atomic-1.13.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.portable-atomic-1.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__proc-macro2-1.0.106\",\n sha256 = \"8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.106/download\"],\n strip_prefix = \"proc-macro2-1.0.106\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.proc-macro2-1.0.106.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-0.29.0\",\n sha256 = \"cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3/0.29.0/download\"],\n strip_prefix = \"pyo3-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-build-config-0.29.0\",\n sha256 = \"c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-build-config/0.29.0/download\"],\n strip_prefix = \"pyo3-build-config-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-build-config-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-ffi-0.29.0\",\n sha256 = \"ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-ffi/0.29.0/download\"],\n strip_prefix = \"pyo3-ffi-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-ffi-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-macros-0.29.0\",\n sha256 = \"9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-macros/0.29.0/download\"],\n strip_prefix = \"pyo3-macros-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-macros-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-macros-backend-0.29.0\",\n sha256 = \"4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-macros-backend/0.29.0/download\"],\n strip_prefix = \"pyo3-macros-backend-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-macros-backend-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__quote-1.0.45\",\n sha256 = \"41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.45/download\"],\n strip_prefix = \"quote-1.0.45\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.quote-1.0.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__regex-automata-0.4.16\",\n sha256 = \"8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.16/download\"],\n strip_prefix = \"regex-automata-0.4.16\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.regex-automata-0.4.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__regex-syntax-0.8.11\",\n sha256 = \"d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.11/download\"],\n strip_prefix = \"regex-syntax-0.8.11\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.regex-syntax-0.8.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__syn-2.0.117\",\n sha256 = \"e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.117/download\"],\n strip_prefix = \"syn-2.0.117\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.syn-2.0.117.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__syn-3.0.3\",\n sha256 = \"53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/3.0.3/download\"],\n strip_prefix = \"syn-3.0.3\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.syn-3.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__target-lexicon-0.13.5\",\n sha256 = \"adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/target-lexicon/0.13.5/download\"],\n strip_prefix = \"target-lexicon-0.13.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.target-lexicon-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n return [\n struct(repo=\"fltk_crates__clap-4.6.4\", is_dev_dep = False),\n struct(repo=\"fltk_crates__pyo3-0.29.0\", is_dev_dep = False),\n struct(repo=\"fltk_crates__regex-automata-0.4.16\", is_dev_dep = False),\n ]\n" + "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list.\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"crates/fltk-ast-core\": {\n _COMMON_CONDITION: {\n \"indexmap\": Label(\"@fltk_crates//:indexmap-2.14.0\"),\n \"regex-automata\": Label(\"@fltk_crates//:regex-automata-0.4.16\"),\n },\n },\n \"crates/fltk-cst-core\": {\n _COMMON_CONDITION: {\n \"pyo3\": Label(\"@fltk_crates//:pyo3-0.29.0\"),\n },\n },\n \"crates/fltk-fmt-cli\": {\n _COMMON_CONDITION: {\n \"clap\": Label(\"@fltk_crates//:clap-4.6.4\"),\n },\n },\n \"\": {\n _COMMON_CONDITION: {\n \"pyo3\": Label(\"@fltk_crates//:pyo3-0.29.0\"),\n },\n },\n \"crates/fltk-parser-core\": {\n _COMMON_CONDITION: {\n \"regex-automata\": Label(\"@fltk_crates//:regex-automata-0.4.16\"),\n },\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"crates/fltk-ast-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-cst-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-fmt-cli\": {\n _COMMON_CONDITION: {\n },\n },\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-parser-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"crates/fltk-ast-core\": {\n _COMMON_CONDITION: {\n \"rust_decimal\": Label(\"@fltk_crates//:rust_decimal-1.42.1\"),\n \"uuid\": Label(\"@fltk_crates//:uuid-1.24.0\"),\n },\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"crates/fltk-ast-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"crates/fltk-ast-core\": {\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"crates/fltk-ast-core\": {\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"crates/fltk-ast-core\": {\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"crates/fltk-ast-core\": {\n _COMMON_CONDITION: {\n },\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"crates/fltk-ast-core\": {\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"crates/fltk-ast-core\": {\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"crates/fltk-ast-core\": {\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"crates/fltk-ast-core\": {\n },\n \"crates/fltk-cst-core\": {\n },\n \"crates/fltk-fmt-cli\": {\n },\n \"\": {\n },\n \"crates/fltk-parser-core\": {\n },\n \"crates/fltk-unparser-core\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(any())\": [],\n \"cfg(any(target_os = \\\"linux\\\", target_os = \\\"android\\\", target_os = \\\"windows\\\", target_os = \\\"macos\\\", target_os = \\\"ios\\\", target_os = \\\"freebsd\\\", target_os = \\\"openbsd\\\", target_os = \\\"netbsd\\\", target_os = \\\"dragonfly\\\", target_os = \\\"solaris\\\", target_os = \\\"illumos\\\", target_os = \\\"fuchsia\\\", target_os = \\\"redox\\\", target_os = \\\"cloudabi\\\", target_os = \\\"haiku\\\", target_os = \\\"vxworks\\\", target_os = \\\"emscripten\\\", target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(target_has_atomic = \\\"64\\\"))\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"fltk_crates__ahash-0.7.8\",\n sha256 = \"891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.7.8/download\"],\n strip_prefix = \"ahash-0.7.8\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.ahash-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__aho-corasick-1.1.4\",\n sha256 = \"ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.4/download\"],\n strip_prefix = \"aho-corasick-1.1.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.aho-corasick-1.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstream-1.0.0\",\n sha256 = \"824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/1.0.0/download\"],\n strip_prefix = \"anstream-1.0.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstream-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-1.0.14\",\n sha256 = \"940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.14/download\"],\n strip_prefix = \"anstyle-1.0.14\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-1.0.14.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-parse-1.0.0\",\n sha256 = \"52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/1.0.0/download\"],\n strip_prefix = \"anstyle-parse-1.0.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-parse-1.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-query-1.1.5\",\n sha256 = \"40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.5/download\"],\n strip_prefix = \"anstyle-query-1.1.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-query-1.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__anstyle-wincon-3.0.11\",\n sha256 = \"291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.11/download\"],\n strip_prefix = \"anstyle-wincon-3.0.11\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.anstyle-wincon-3.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__arrayvec-0.7.8\",\n sha256 = \"d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/arrayvec/0.7.8/download\"],\n strip_prefix = \"arrayvec-0.7.8\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.arrayvec-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__autocfg-1.5.1\",\n sha256 = \"f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.1/download\"],\n strip_prefix = \"autocfg-1.5.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.autocfg-1.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__bitvec-1.1.1\",\n sha256 = \"ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitvec/1.1.1/download\"],\n strip_prefix = \"bitvec-1.1.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.bitvec-1.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__borsh-1.8.0\",\n sha256 = \"a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/borsh/1.8.0/download\"],\n strip_prefix = \"borsh-1.8.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.borsh-1.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__borsh-derive-1.8.0\",\n sha256 = \"d8f347189c62a579b8cd5f80714efa178f52e461dc2e6d701d264f5ff22e566c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/borsh-derive/1.8.0/download\"],\n strip_prefix = \"borsh-derive-1.8.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.borsh-derive-1.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__bumpalo-3.20.3\",\n sha256 = \"72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.20.3/download\"],\n strip_prefix = \"bumpalo-3.20.3\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.bumpalo-3.20.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__bytecheck-0.6.12\",\n sha256 = \"23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck/0.6.12/download\"],\n strip_prefix = \"bytecheck-0.6.12\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.bytecheck-0.6.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__bytecheck_derive-0.6.12\",\n sha256 = \"3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecheck_derive/0.6.12/download\"],\n strip_prefix = \"bytecheck_derive-0.6.12\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.bytecheck_derive-0.6.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__bytes-1.12.1\",\n sha256 = \"fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.12.1/download\"],\n strip_prefix = \"bytes-1.12.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.bytes-1.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__cfg-if-1.0.4\",\n sha256 = \"9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.4/download\"],\n strip_prefix = \"cfg-if-1.0.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.cfg-if-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__cfg_aliases-0.2.2\",\n sha256 = \"f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg_aliases/0.2.2/download\"],\n strip_prefix = \"cfg_aliases-0.2.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.cfg_aliases-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap-4.6.4\",\n sha256 = \"d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.6.4/download\"],\n strip_prefix = \"clap-4.6.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap_builder-4.6.2\",\n sha256 = \"f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.6.2/download\"],\n strip_prefix = \"clap_builder-4.6.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap_builder-4.6.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap_derive-4.6.4\",\n sha256 = \"d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.6.4/download\"],\n strip_prefix = \"clap_derive-4.6.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap_derive-4.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__clap_lex-1.1.0\",\n sha256 = \"c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/1.1.0/download\"],\n strip_prefix = \"clap_lex-1.1.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.clap_lex-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__colorchoice-1.0.5\",\n sha256 = \"1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.5/download\"],\n strip_prefix = \"colorchoice-1.0.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.colorchoice-1.0.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__funty-2.0.0\",\n sha256 = \"e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/funty/2.0.0/download\"],\n strip_prefix = \"funty-2.0.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.funty-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__futures-core-0.3.33\",\n sha256 = \"2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.33/download\"],\n strip_prefix = \"futures-core-0.3.33\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.futures-core-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__futures-task-0.3.33\",\n sha256 = \"b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.33/download\"],\n strip_prefix = \"futures-task-0.3.33\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.futures-task-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__futures-util-0.3.33\",\n sha256 = \"a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.33/download\"],\n strip_prefix = \"futures-util-0.3.33\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.futures-util-0.3.33.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__getrandom-0.2.17\",\n sha256 = \"ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.17/download\"],\n strip_prefix = \"getrandom-0.2.17\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.getrandom-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__hashbrown-0.12.3\",\n sha256 = \"8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.12.3/download\"],\n strip_prefix = \"hashbrown-0.12.3\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.hashbrown-0.12.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__hashbrown-0.17.1\",\n sha256 = \"ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.17.1/download\"],\n strip_prefix = \"hashbrown-0.17.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.hashbrown-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__indexmap-2.14.0\",\n sha256 = \"d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.14.0/download\"],\n strip_prefix = \"indexmap-2.14.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.indexmap-2.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__is_terminal_polyfill-1.70.2\",\n sha256 = \"a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.2/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.is_terminal_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__itoa-1.0.18\",\n sha256 = \"8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.18/download\"],\n strip_prefix = \"itoa-1.0.18\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.itoa-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__js-sys-0.3.103\",\n sha256 = \"53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.103/download\"],\n strip_prefix = \"js-sys-0.3.103\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.js-sys-0.3.103.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__libc-0.2.186\",\n sha256 = \"68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.186/download\"],\n strip_prefix = \"libc-0.2.186\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.libc-0.2.186.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__memchr-2.8.1\",\n sha256 = \"6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.8.1/download\"],\n strip_prefix = \"memchr-2.8.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.memchr-2.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__once_cell-1.21.4\",\n sha256 = \"9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.4/download\"],\n strip_prefix = \"once_cell-1.21.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.once_cell-1.21.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__once_cell_polyfill-1.70.2\",\n sha256 = \"384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.2/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.once_cell_polyfill-1.70.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pin-project-lite-0.2.17\",\n sha256 = \"a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.17/download\"],\n strip_prefix = \"pin-project-lite-0.2.17\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pin-project-lite-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__portable-atomic-1.13.1\",\n sha256 = \"c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/portable-atomic/1.13.1/download\"],\n strip_prefix = \"portable-atomic-1.13.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.portable-atomic-1.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__ppv-lite86-0.2.21\",\n sha256 = \"85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ppv-lite86/0.2.21/download\"],\n strip_prefix = \"ppv-lite86-0.2.21\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.ppv-lite86-0.2.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__proc-macro-crate-3.5.0\",\n sha256 = \"e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro-crate/3.5.0/download\"],\n strip_prefix = \"proc-macro-crate-3.5.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.proc-macro-crate-3.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__proc-macro2-1.0.106\",\n sha256 = \"8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.106/download\"],\n strip_prefix = \"proc-macro2-1.0.106\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.proc-macro2-1.0.106.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__ptr_meta-0.1.4\",\n sha256 = \"0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta/0.1.4/download\"],\n strip_prefix = \"ptr_meta-0.1.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.ptr_meta-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__ptr_meta_derive-0.1.4\",\n sha256 = \"16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ptr_meta_derive/0.1.4/download\"],\n strip_prefix = \"ptr_meta_derive-0.1.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.ptr_meta_derive-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-0.29.0\",\n sha256 = \"cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3/0.29.0/download\"],\n strip_prefix = \"pyo3-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-build-config-0.29.0\",\n sha256 = \"c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-build-config/0.29.0/download\"],\n strip_prefix = \"pyo3-build-config-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-build-config-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-ffi-0.29.0\",\n sha256 = \"ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-ffi/0.29.0/download\"],\n strip_prefix = \"pyo3-ffi-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-ffi-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-macros-0.29.0\",\n sha256 = \"9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-macros/0.29.0/download\"],\n strip_prefix = \"pyo3-macros-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-macros-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__pyo3-macros-backend-0.29.0\",\n sha256 = \"4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pyo3-macros-backend/0.29.0/download\"],\n strip_prefix = \"pyo3-macros-backend-0.29.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.pyo3-macros-backend-0.29.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__quote-1.0.45\",\n sha256 = \"41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.45/download\"],\n strip_prefix = \"quote-1.0.45\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.quote-1.0.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__radium-0.7.0\",\n sha256 = \"dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/radium/0.7.0/download\"],\n strip_prefix = \"radium-0.7.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.radium-0.7.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rand-0.8.7\",\n sha256 = \"22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand/0.8.7/download\"],\n strip_prefix = \"rand-0.8.7\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rand-0.8.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rand_chacha-0.3.1\",\n sha256 = \"e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_chacha/0.3.1/download\"],\n strip_prefix = \"rand_chacha-0.3.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rand_chacha-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rand_core-0.6.4\",\n sha256 = \"ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rand_core/0.6.4/download\"],\n strip_prefix = \"rand_core-0.6.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rand_core-0.6.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__regex-automata-0.4.16\",\n sha256 = \"8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.16/download\"],\n strip_prefix = \"regex-automata-0.4.16\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.regex-automata-0.4.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__regex-syntax-0.8.11\",\n sha256 = \"d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.11/download\"],\n strip_prefix = \"regex-syntax-0.8.11\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.regex-syntax-0.8.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rend-0.4.2\",\n sha256 = \"71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rend/0.4.2/download\"],\n strip_prefix = \"rend-0.4.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rend-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rkyv-0.7.46\",\n sha256 = \"2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv/0.7.46/download\"],\n strip_prefix = \"rkyv-0.7.46\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rkyv-0.7.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rkyv_derive-0.7.46\",\n sha256 = \"84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rkyv_derive/0.7.46/download\"],\n strip_prefix = \"rkyv_derive-0.7.46\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rkyv_derive-0.7.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rust_decimal-1.42.1\",\n sha256 = \"be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust_decimal/1.42.1/download\"],\n strip_prefix = \"rust_decimal-1.42.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rust_decimal-1.42.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__rustversion-1.0.23\",\n sha256 = \"cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.23/download\"],\n strip_prefix = \"rustversion-1.0.23\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.rustversion-1.0.23.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__seahash-4.1.0\",\n sha256 = \"1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/seahash/4.1.0/download\"],\n strip_prefix = \"seahash-4.1.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.seahash-4.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__serde-1.0.229\",\n sha256 = \"4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.229/download\"],\n strip_prefix = \"serde-1.0.229\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.serde-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__serde_core-1.0.229\",\n sha256 = \"67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_core/1.0.229/download\"],\n strip_prefix = \"serde_core-1.0.229\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.serde_core-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__serde_derive-1.0.229\",\n sha256 = \"e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.229/download\"],\n strip_prefix = \"serde_derive-1.0.229\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.serde_derive-1.0.229.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__serde_json-1.0.151\",\n sha256 = \"c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.151/download\"],\n strip_prefix = \"serde_json-1.0.151\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.serde_json-1.0.151.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__simdutf8-0.1.5\",\n sha256 = \"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simdutf8/0.1.5/download\"],\n strip_prefix = \"simdutf8-0.1.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.simdutf8-0.1.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__slab-0.4.12\",\n sha256 = \"0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.12/download\"],\n strip_prefix = \"slab-0.4.12\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.slab-0.4.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__syn-1.0.109\",\n sha256 = \"72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/1.0.109/download\"],\n strip_prefix = \"syn-1.0.109\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.syn-1.0.109.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__syn-2.0.117\",\n sha256 = \"e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.117/download\"],\n strip_prefix = \"syn-2.0.117\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.syn-2.0.117.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__syn-3.0.3\",\n sha256 = \"53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/3.0.3/download\"],\n strip_prefix = \"syn-3.0.3\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.syn-3.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__tap-1.0.1\",\n sha256 = \"55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tap/1.0.1/download\"],\n strip_prefix = \"tap-1.0.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.tap-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__target-lexicon-0.13.5\",\n sha256 = \"adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/target-lexicon/0.13.5/download\"],\n strip_prefix = \"target-lexicon-0.13.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.target-lexicon-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__tinyvec-1.12.0\",\n sha256 = \"bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec/1.12.0/download\"],\n strip_prefix = \"tinyvec-1.12.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.tinyvec-1.12.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__tinyvec_macros-0.1.1\",\n sha256 = \"1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinyvec_macros/0.1.1/download\"],\n strip_prefix = \"tinyvec_macros-0.1.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.tinyvec_macros-0.1.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__toml_datetime-1.1.1-spec-1.1.0\",\n sha256 = \"3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download\"],\n strip_prefix = \"toml_datetime-1.1.1+spec-1.1.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.toml_datetime-1.1.1+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__toml_edit-0.25.13-spec-1.1.0\",\n sha256 = \"6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_edit/0.25.13+spec-1.1.0/download\"],\n strip_prefix = \"toml_edit-0.25.13+spec-1.1.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.toml_edit-0.25.13+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__toml_parser-1.1.3-spec-1.1.0\",\n sha256 = \"1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download\"],\n strip_prefix = \"toml_parser-1.1.3+spec-1.1.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.toml_parser-1.1.3+spec-1.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__unicode-ident-1.0.24\",\n sha256 = \"e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.24/download\"],\n strip_prefix = \"unicode-ident-1.0.24\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.unicode-ident-1.0.24.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__uuid-1.24.0\",\n sha256 = \"bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.24.0/download\"],\n strip_prefix = \"uuid-1.24.0\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.uuid-1.24.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__wasm-bindgen-0.2.126\",\n sha256 = \"4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-0.2.126\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.wasm-bindgen-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__wasm-bindgen-macro-0.2.126\",\n sha256 = \"167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.126\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.wasm-bindgen-macro-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__wasm-bindgen-macro-support-0.2.126\",\n sha256 = \"f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.126\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.wasm-bindgen-macro-support-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__wasm-bindgen-shared-0.2.126\",\n sha256 = \"dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.126\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.wasm-bindgen-shared-0.2.126.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__windows-link-0.2.1\",\n sha256 = \"f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-link/0.2.1/download\"],\n strip_prefix = \"windows-link-0.2.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.windows-link-0.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__windows-sys-0.61.2\",\n sha256 = \"ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.61.2/download\"],\n strip_prefix = \"windows-sys-0.61.2\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.windows-sys-0.61.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__winnow-1.0.4\",\n sha256 = \"23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winnow/1.0.4/download\"],\n strip_prefix = \"winnow-1.0.4\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.winnow-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__wyz-0.5.1\",\n sha256 = \"05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wyz/0.5.1/download\"],\n strip_prefix = \"wyz-0.5.1\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.wyz-0.5.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__zerocopy-0.8.55\",\n sha256 = \"b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.55/download\"],\n strip_prefix = \"zerocopy-0.8.55\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.zerocopy-0.8.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__zerocopy-derive-0.8.55\",\n sha256 = \"0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.55/download\"],\n strip_prefix = \"zerocopy-derive-0.8.55\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.zerocopy-derive-0.8.55.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"fltk_crates__zmij-1.0.23\",\n sha256 = \"29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zmij/1.0.23/download\"],\n strip_prefix = \"zmij-1.0.23\",\n build_file = Label(\"@fltk_crates//fltk_crates:BUILD.zmij-1.0.23.bazel\"),\n )\n\n return [\n struct(repo=\"fltk_crates__clap-4.6.4\", is_dev_dep = False),\n struct(repo=\"fltk_crates__indexmap-2.14.0\", is_dev_dep = False),\n struct(repo=\"fltk_crates__pyo3-0.29.0\", is_dev_dep = False),\n struct(repo=\"fltk_crates__regex-automata-0.4.16\", is_dev_dep = False),\n struct(repo = \"fltk_crates__rust_decimal-1.42.1\", is_dev_dep = True),\n struct(repo = \"fltk_crates__uuid-1.24.0\", is_dev_dep = True),\n ]\n" } } }, + "fltk_crates__ahash-0.7.8": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ahash/0.7.8/download" + ], + "strip_prefix": "ahash-0.7.8", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"ahash\",\n deps = [\n \"@fltk_crates__ahash-0.7.8//:build_script_build\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"@fltk_crates__getrandom-0.2.17//:getrandom\", # cfg(any(target_os = \"linux\", target_os = \"android\", target_os = \"windows\", target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonfly\", target_os = \"solaris\", target_os = \"illumos\", target_os = \"fuchsia\", target_os = \"redox\", target_os = \"cloudabi\", target_os = \"haiku\", target_os = \"vxworks\", target_os = \"emscripten\", target_os = \"wasi\"))\n \"@fltk_crates__once_cell-1.21.4//:once_cell\", # cfg(not(all(target_arch = \"arm\", target_os = \"none\")))\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"@fltk_crates__getrandom-0.2.17//:getrandom\", # cfg(any(target_os = \"linux\", target_os = \"android\", target_os = \"windows\", target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonfly\", target_os = \"solaris\", target_os = \"illumos\", target_os = \"fuchsia\", target_os = \"redox\", target_os = \"cloudabi\", target_os = \"haiku\", target_os = \"vxworks\", target_os = \"emscripten\", target_os = \"wasi\"))\n \"@fltk_crates__once_cell-1.21.4//:once_cell\", # cfg(not(all(target_arch = \"arm\", target_os = \"none\")))\n ],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [\n \"@fltk_crates__once_cell-1.21.4//:once_cell\", # cfg(not(all(target_arch = \"arm\", target_os = \"none\")))\n ],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [\n \"@fltk_crates__getrandom-0.2.17//:getrandom\", # cfg(any(target_os = \"linux\", target_os = \"android\", target_os = \"windows\", target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonfly\", target_os = \"solaris\", target_os = \"illumos\", target_os = \"fuchsia\", target_os = \"redox\", target_os = \"cloudabi\", target_os = \"haiku\", target_os = \"vxworks\", target_os = \"emscripten\", target_os = \"wasi\"))\n \"@fltk_crates__once_cell-1.21.4//:once_cell\", # cfg(not(all(target_arch = \"arm\", target_os = \"none\")))\n ],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [\n \"@fltk_crates__getrandom-0.2.17//:getrandom\", # cfg(any(target_os = \"linux\", target_os = \"android\", target_os = \"windows\", target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonfly\", target_os = \"solaris\", target_os = \"illumos\", target_os = \"fuchsia\", target_os = \"redox\", target_os = \"cloudabi\", target_os = \"haiku\", target_os = \"vxworks\", target_os = \"emscripten\", target_os = \"wasi\"))\n \"@fltk_crates__once_cell-1.21.4//:once_cell\", # cfg(not(all(target_arch = \"arm\", target_os = \"none\")))\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [\n \"@fltk_crates__getrandom-0.2.17//:getrandom\", # cfg(any(target_os = \"linux\", target_os = \"android\", target_os = \"windows\", target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonfly\", target_os = \"solaris\", target_os = \"illumos\", target_os = \"fuchsia\", target_os = \"redox\", target_os = \"cloudabi\", target_os = \"haiku\", target_os = \"vxworks\", target_os = \"emscripten\", target_os = \"wasi\"))\n \"@fltk_crates__once_cell-1.21.4//:once_cell\", # cfg(not(all(target_arch = \"arm\", target_os = \"none\")))\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [\n \"@fltk_crates__getrandom-0.2.17//:getrandom\", # cfg(any(target_os = \"linux\", target_os = \"android\", target_os = \"windows\", target_os = \"macos\", target_os = \"ios\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"dragonfly\", target_os = \"solaris\", target_os = \"illumos\", target_os = \"fuchsia\", target_os = \"redox\", target_os = \"cloudabi\", target_os = \"haiku\", target_os = \"vxworks\", target_os = \"emscripten\", target_os = \"wasi\"))\n \"@fltk_crates__once_cell-1.21.4//:once_cell\", # cfg(not(all(target_arch = \"arm\", target_os = \"none\")))\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=ahash\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.7.8\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@fltk_crates__version_check-0.9.5//:version_check\",\n ],\n edition = \"2018\",\n pkg_name = \"ahash\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=ahash\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.7.8\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, "fltk_crates__aho-corasick-1.1.4": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -593,6 +607,149 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"anstyle_wincon\",\n deps = [\n \"@fltk_crates__anstyle-1.0.14//:anstyle\",\n ] + select({\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [\n \"@fltk_crates__once_cell_polyfill-1.70.2//:once_cell_polyfill\", # cfg(windows)\n \"@fltk_crates__windows-sys-0.61.2//:windows_sys\", # cfg(windows)\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=anstyle-wincon\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.0.11\",\n)\n" } }, + "fltk_crates__arrayvec-0.7.8": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/arrayvec/0.7.8/download" + ], + "strip_prefix": "arrayvec-0.7.8", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"arrayvec\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=arrayvec\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.7.8\",\n)\n" + } + }, + "fltk_crates__autocfg-1.5.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/autocfg/1.5.1/download" + ], + "strip_prefix": "autocfg-1.5.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"autocfg\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=autocfg\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.5.1\",\n)\n" + } + }, + "fltk_crates__bitvec-1.1.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitvec/1.1.1/download" + ], + "strip_prefix": "bitvec-1.1.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"bitvec\",\n deps = [\n \"@fltk_crates__funty-2.0.0//:funty\",\n \"@fltk_crates__radium-0.7.0//:radium\",\n \"@fltk_crates__tap-1.0.1//:tap\",\n \"@fltk_crates__wyz-0.5.1//:wyz\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=bitvec\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.1\",\n)\n" + } + }, + "fltk_crates__borsh-1.8.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/borsh/1.8.0/download" + ], + "strip_prefix": "borsh-1.8.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"borsh\",\n deps = [\n \"@fltk_crates__borsh-1.8.0//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=borsh\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.8.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@fltk_crates__cfg_aliases-0.2.2//:cfg_aliases\",\n ],\n edition = \"2018\",\n pkg_name = \"borsh\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=borsh\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.8.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__borsh-derive-1.8.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "d8f347189c62a579b8cd5f80714efa178f52e461dc2e6d701d264f5ff22e566c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/borsh-derive/1.8.0/download" + ], + "strip_prefix": "borsh-derive-1.8.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"borsh_derive\",\n deps = [\n \"@fltk_crates__once_cell-1.21.4//:once_cell\",\n \"@fltk_crates__proc-macro-crate-3.5.0//:proc_macro_crate\",\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-2.0.117//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=borsh-derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.8.0\",\n)\n" + } + }, + "fltk_crates__bumpalo-3.20.3": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bumpalo/3.20.3/download" + ], + "strip_prefix": "bumpalo-3.20.3", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"bumpalo\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=bumpalo\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.20.3\",\n)\n" + } + }, + "fltk_crates__bytecheck-0.6.12": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bytecheck/0.6.12/download" + ], + "strip_prefix": "bytecheck-0.6.12", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"bytecheck\",\n deps = [\n \"@fltk_crates__bytecheck-0.6.12//:build_script_build\",\n \"@fltk_crates__ptr_meta-0.1.4//:ptr_meta\",\n ],\n proc_macro_deps = [\n \"@fltk_crates__bytecheck_derive-0.6.12//:bytecheck_derive\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=bytecheck\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.6.12\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"bytecheck\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=bytecheck\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.6.12\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__bytecheck_derive-0.6.12": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bytecheck_derive/0.6.12/download" + ], + "strip_prefix": "bytecheck_derive-0.6.12", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"bytecheck_derive\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-1.0.109//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=bytecheck_derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.6.12\",\n)\n" + } + }, + "fltk_crates__bytes-1.12.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bytes/1.12.1/download" + ], + "strip_prefix": "bytes-1.12.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"bytes\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=bytes\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.12.1\",\n)\n" + } + }, + "fltk_crates__cfg-if-1.0.4": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-if/1.0.4/download" + ], + "strip_prefix": "cfg-if-1.0.4", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"cfg_if\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=cfg-if\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.4\",\n)\n" + } + }, + "fltk_crates__cfg_aliases-0.2.2": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg_aliases/0.2.2/download" + ], + "strip_prefix": "cfg_aliases-0.2.2", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"cfg_aliases\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=cfg_aliases\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.2\",\n)\n" + } + }, "fltk_crates__clap-4.6.4": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -658,6 +815,110 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"colorchoice\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=colorchoice\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.5\",\n)\n" } }, + "fltk_crates__equivalent-1.0.2": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/equivalent/1.0.2/download" + ], + "strip_prefix": "equivalent-1.0.2", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"equivalent\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=equivalent\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.2\",\n)\n" + } + }, + "fltk_crates__funty-2.0.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/funty/2.0.0/download" + ], + "strip_prefix": "funty-2.0.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"funty\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=funty\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.0.0\",\n)\n" + } + }, + "fltk_crates__futures-core-0.3.33": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-core/0.3.33/download" + ], + "strip_prefix": "futures-core-0.3.33", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"futures_core\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=futures-core\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.33\",\n)\n" + } + }, + "fltk_crates__futures-task-0.3.33": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-task/0.3.33/download" + ], + "strip_prefix": "futures-task-0.3.33", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"futures_task\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=futures-task\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.33\",\n)\n" + } + }, + "fltk_crates__futures-util-0.3.33": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-util/0.3.33/download" + ], + "strip_prefix": "futures-util-0.3.33", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"futures_util\",\n deps = [\n \"@fltk_crates__futures-core-0.3.33//:futures_core\",\n \"@fltk_crates__futures-task-0.3.33//:futures_task\",\n \"@fltk_crates__pin-project-lite-0.2.17//:pin_project_lite\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=futures-util\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.33\",\n)\n" + } + }, + "fltk_crates__getrandom-0.2.17": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/getrandom/0.2.17/download" + ], + "strip_prefix": "getrandom-0.2.17", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"getrandom\",\n deps = [\n \"@fltk_crates__cfg-if-1.0.4//:cfg_if\",\n ] + select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [\n \"@fltk_crates__libc-0.2.186//:libc\", # cfg(unix)\n ],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [\n \"@fltk_crates__libc-0.2.186//:libc\", # cfg(unix)\n ],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [\n \"@fltk_crates__wasi-0.11.1-wasi-snapshot-preview1//:wasi\", # cfg(target_os = \"wasi\")\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [\n \"@fltk_crates__libc-0.2.186//:libc\", # cfg(unix)\n ],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [\n \"@fltk_crates__libc-0.2.186//:libc\", # cfg(unix)\n ],\n \"//conditions:default\": [],\n }),\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=getrandom\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.17\",\n)\n" + } + }, + "fltk_crates__hashbrown-0.12.3": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hashbrown/0.12.3/download" + ], + "strip_prefix": "hashbrown-0.12.3", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"hashbrown\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=hashbrown\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.12.3\",\n)\n" + } + }, + "fltk_crates__hashbrown-0.17.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hashbrown/0.17.1/download" + ], + "strip_prefix": "hashbrown-0.17.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"hashbrown\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=hashbrown\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.17.1\",\n)\n" + } + }, "fltk_crates__heck-0.5.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -671,6 +932,19 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"heck\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=heck\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.5.0\",\n)\n" } }, + "fltk_crates__indexmap-2.14.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/indexmap/2.14.0/download" + ], + "strip_prefix": "indexmap-2.14.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"indexmap\",\n deps = [\n \"@fltk_crates__equivalent-1.0.2//:equivalent\",\n \"@fltk_crates__hashbrown-0.17.1//:hashbrown\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=indexmap\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.14.0\",\n)\n" + } + }, "fltk_crates__is_terminal_polyfill-1.70.2": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -684,6 +958,32 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"is_terminal_polyfill\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=is_terminal_polyfill\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.70.2\",\n)\n" } }, + "fltk_crates__itoa-1.0.18": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itoa/1.0.18/download" + ], + "strip_prefix": "itoa-1.0.18", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"itoa\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=itoa\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.18\",\n)\n" + } + }, + "fltk_crates__js-sys-0.3.103": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/js-sys/0.3.103/download" + ], + "strip_prefix": "js-sys-0.3.103", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"js_sys\",\n deps = [\n \"@fltk_crates__cfg-if-1.0.4//:cfg_if\",\n \"@fltk_crates__wasm-bindgen-0.2.126//:wasm_bindgen\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=js-sys\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.103\",\n)\n" + } + }, "fltk_crates__libc-0.2.186": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -710,6 +1010,19 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"memchr\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=memchr\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.8.1\",\n)\n" } }, + "fltk_crates__num-traits-0.2.19": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/num-traits/0.2.19/download" + ], + "strip_prefix": "num-traits-0.2.19", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"num_traits\",\n deps = [\n \"@fltk_crates__num-traits-0.2.19//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"i128\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=num-traits\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.19\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"i128\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n deps = [\n \"@fltk_crates__autocfg-1.5.1//:autocfg\",\n ],\n edition = \"2021\",\n pkg_name = \"num-traits\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=num-traits\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.2.19\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, "fltk_crates__once_cell-1.21.4": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -736,6 +1049,19 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"once_cell_polyfill\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=once_cell_polyfill\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.70.2\",\n)\n" } }, + "fltk_crates__pin-project-lite-0.2.17": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pin-project-lite/0.2.17/download" + ], + "strip_prefix": "pin-project-lite-0.2.17", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"pin_project_lite\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=pin-project-lite\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.17\",\n)\n" + } + }, "fltk_crates__portable-atomic-1.13.1": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -749,6 +1075,32 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"portable_atomic\",\n deps = [\n \"@fltk_crates__portable-atomic-1.13.1//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=portable-atomic\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.13.1\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"portable-atomic\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=portable-atomic\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.13.1\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, + "fltk_crates__ppv-lite86-0.2.21": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ppv-lite86/0.2.21/download" + ], + "strip_prefix": "ppv-lite86-0.2.21", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"ppv_lite86\",\n deps = [\n \"@fltk_crates__zerocopy-0.8.55//:zerocopy\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=ppv-lite86\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.21\",\n)\n" + } + }, + "fltk_crates__proc-macro-crate-3.5.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/proc-macro-crate/3.5.0/download" + ], + "strip_prefix": "proc-macro-crate-3.5.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"proc_macro_crate\",\n deps = [\n \"@fltk_crates__toml_edit-0.25.13-spec-1.1.0//:toml_edit\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=proc-macro-crate\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.5.0\",\n)\n" + } + }, "fltk_crates__proc-macro2-1.0.106": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -762,6 +1114,32 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"proc_macro2\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:build_script_build\",\n \"@fltk_crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=proc-macro2\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.106\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"proc-macro2\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=proc-macro2\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.106\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, + "fltk_crates__ptr_meta-0.1.4": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ptr_meta/0.1.4/download" + ], + "strip_prefix": "ptr_meta-0.1.4", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"ptr_meta\",\n proc_macro_deps = [\n \"@fltk_crates__ptr_meta_derive-0.1.4//:ptr_meta_derive\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=ptr_meta\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.1.4\",\n)\n" + } + }, + "fltk_crates__ptr_meta_derive-0.1.4": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ptr_meta_derive/0.1.4/download" + ], + "strip_prefix": "ptr_meta_derive-0.1.4", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"ptr_meta_derive\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-1.0.109//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=ptr_meta_derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.1.4\",\n)\n" + } + }, "fltk_crates__pyo3-0.29.0": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -840,6 +1218,58 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"quote\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=quote\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.45\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n \"proc-macro\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"quote\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=quote\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.45\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, + "fltk_crates__radium-0.7.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/radium/0.7.0/download" + ], + "strip_prefix": "radium-0.7.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"radium\",\n deps = [\n \"@fltk_crates__radium-0.7.0//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=radium\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.7.0\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"radium\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=radium\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.7.0\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__rand-0.8.7": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand/0.8.7/download" + ], + "strip_prefix": "rand-0.8.7", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rand\",\n deps = [\n \"@fltk_crates__rand_core-0.6.4//:rand_core\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rand\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.7\",\n)\n" + } + }, + "fltk_crates__rand_chacha-0.3.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand_chacha/0.3.1/download" + ], + "strip_prefix": "rand_chacha-0.3.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rand_chacha\",\n deps = [\n \"@fltk_crates__ppv-lite86-0.2.21//:ppv_lite86\",\n \"@fltk_crates__rand_core-0.6.4//:rand_core\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rand_chacha\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.3.1\",\n)\n" + } + }, + "fltk_crates__rand_core-0.6.4": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand_core/0.6.4/download" + ], + "strip_prefix": "rand_core-0.6.4", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rand_core\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rand_core\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.6.4\",\n)\n" + } + }, "fltk_crates__regex-automata-0.4.16": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -866,6 +1296,162 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"regex_syntax\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"std\",\n \"unicode\",\n \"unicode-age\",\n \"unicode-bool\",\n \"unicode-case\",\n \"unicode-gencat\",\n \"unicode-perl\",\n \"unicode-script\",\n \"unicode-segment\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=regex-syntax\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.11\",\n)\n" } }, + "fltk_crates__rend-0.4.2": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rend/0.4.2/download" + ], + "strip_prefix": "rend-0.4.2", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rend\",\n deps = [\n \"@fltk_crates__rend-0.4.2//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rend\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.4.2\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"rend\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rend\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.4.2\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__rkyv-0.7.46": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rkyv/0.7.46/download" + ], + "strip_prefix": "rkyv-0.7.46", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rkyv\",\n deps = [\n \"@fltk_crates__ptr_meta-0.1.4//:ptr_meta\",\n \"@fltk_crates__rkyv-0.7.46//:build_script_build\",\n \"@fltk_crates__seahash-4.1.0//:seahash\",\n ],\n proc_macro_deps = [\n \"@fltk_crates__rkyv_derive-0.7.46//:rkyv_derive\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rkyv\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.7.46\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"rkyv\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rkyv\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.7.46\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__rkyv_derive-0.7.46": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rkyv_derive/0.7.46/download" + ], + "strip_prefix": "rkyv_derive-0.7.46", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"rkyv_derive\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-1.0.109//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rkyv_derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.7.46\",\n)\n" + } + }, + "fltk_crates__rust_decimal-1.42.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rust_decimal/1.42.1/download" + ], + "strip_prefix": "rust_decimal-1.42.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"rust_decimal\",\n deps = [\n \"@fltk_crates__arrayvec-0.7.8//:arrayvec\",\n \"@fltk_crates__num-traits-0.2.19//:num_traits\",\n \"@fltk_crates__rust_decimal-1.42.1//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rust_decimal\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.42.1\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"std\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"rust_decimal\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rust_decimal\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.42.1\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__rustversion-1.0.23": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustversion/1.0.23/download" + ], + "strip_prefix": "rustversion-1.0.23", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"rustversion\",\n deps = [\n \"@fltk_crates__rustversion-1.0.23//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustversion\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.23\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build/build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"rustversion\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=rustversion\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.23\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__seahash-4.1.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/seahash/4.1.0/download" + ], + "strip_prefix": "seahash-4.1.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"seahash\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=seahash\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"4.1.0\",\n)\n" + } + }, + "fltk_crates__serde-1.0.229": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde/1.0.229/download" + ], + "strip_prefix": "serde-1.0.229", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"serde\",\n deps = [\n \"@fltk_crates__serde-1.0.229//:build_script_build\",\n \"@fltk_crates__serde_core-1.0.229//:serde_core\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=serde\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.229\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"serde\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=serde\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.229\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__serde_core-1.0.229": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_core/1.0.229/download" + ], + "strip_prefix": "serde_core-1.0.229", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"serde_core\",\n deps = [\n \"@fltk_crates__serde_core-1.0.229//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=serde_core\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.229\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"serde_core\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=serde_core\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.229\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__serde_derive-1.0.229": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_derive/1.0.229/download" + ], + "strip_prefix": "serde_derive-1.0.229", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"serde_derive\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-3.0.3//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=serde_derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.229\",\n)\n" + } + }, + "fltk_crates__serde_json-1.0.151": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_json/1.0.151/download" + ], + "strip_prefix": "serde_json-1.0.151", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"serde_json\",\n deps = [\n \"@fltk_crates__itoa-1.0.18//:itoa\",\n \"@fltk_crates__memchr-2.8.1//:memchr\",\n \"@fltk_crates__serde_core-1.0.229//:serde_core\",\n \"@fltk_crates__serde_json-1.0.151//:build_script_build\",\n \"@fltk_crates__zmij-1.0.23//:zmij\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=serde_json\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.151\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"serde_json\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=serde_json\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.151\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__simdutf8-0.1.5": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/simdutf8/0.1.5/download" + ], + "strip_prefix": "simdutf8-0.1.5", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"simdutf8\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=simdutf8\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.1.5\",\n)\n" + } + }, + "fltk_crates__slab-0.4.12": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/slab/0.4.12/download" + ], + "strip_prefix": "slab-0.4.12", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"slab\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=slab\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.4.12\",\n)\n" + } + }, "fltk_crates__strsim-0.11.1": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -879,6 +1465,19 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"strsim\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=strsim\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.11.1\",\n)\n" } }, + "fltk_crates__syn-1.0.109": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/syn/1.0.109/download" + ], + "strip_prefix": "syn-1.0.109", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"syn\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-1.0.109//:build_script_build\",\n \"@fltk_crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"full\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n \"quote\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.109\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"full\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n \"quote\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"syn\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.109\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, "fltk_crates__syn-2.0.117": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -889,7 +1488,7 @@ "https://static.crates.io/crates/syn/2.0.117/download" ], "strip_prefix": "syn-2.0.117", - "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"syn\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"extra-traits\",\n \"full\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n \"visit-mut\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.0.117\",\n)\n" + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"syn\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"extra-traits\",\n \"fold\",\n \"full\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n \"visit\",\n \"visit-mut\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"2.0.117\",\n)\n" } }, "fltk_crates__syn-3.0.3": { @@ -905,6 +1504,19 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"syn\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__unicode-ident-1.0.24//:unicode_ident\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"clone-impls\",\n \"default\",\n \"derive\",\n \"full\",\n \"parsing\",\n \"printing\",\n \"proc-macro\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=syn\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"3.0.3\",\n)\n" } }, + "fltk_crates__tap-1.0.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tap/1.0.1/download" + ], + "strip_prefix": "tap-1.0.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"tap\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=tap\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.1\",\n)\n" + } + }, "fltk_crates__target-lexicon-0.13.5": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -918,6 +1530,71 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"target_lexicon\",\n deps = [\n \"@fltk_crates__target-lexicon-0.13.5//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=target-lexicon\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.13.5\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2018\",\n pkg_name = \"target-lexicon\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=target-lexicon\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.13.5\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" } }, + "fltk_crates__tinyvec-1.12.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tinyvec/1.12.0/download" + ], + "strip_prefix": "tinyvec-1.12.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"tinyvec\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=tinyvec\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.12.0\",\n)\n" + } + }, + "fltk_crates__tinyvec_macros-0.1.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tinyvec_macros/0.1.1/download" + ], + "strip_prefix": "tinyvec_macros-0.1.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"tinyvec_macros\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=tinyvec_macros\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.1.1\",\n)\n" + } + }, + "fltk_crates__toml_datetime-1.1.1-spec-1.1.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/toml_datetime/1.1.1+spec-1.1.0/download" + ], + "strip_prefix": "toml_datetime-1.1.1+spec-1.1.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"toml_datetime\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=toml_datetime\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.1+spec-1.1.0\",\n)\n" + } + }, + "fltk_crates__toml_edit-0.25.13-spec-1.1.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/toml_edit/0.25.13+spec-1.1.0/download" + ], + "strip_prefix": "toml_edit-0.25.13+spec-1.1.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"toml_edit\",\n deps = [\n \"@fltk_crates__indexmap-2.14.0//:indexmap\",\n \"@fltk_crates__toml_datetime-1.1.1-spec-1.1.0//:toml_datetime\",\n \"@fltk_crates__toml_parser-1.1.3-spec-1.1.0//:toml_parser\",\n \"@fltk_crates__winnow-1.0.4//:winnow\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"parse\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=toml_edit\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.25.13+spec-1.1.0\",\n)\n" + } + }, + "fltk_crates__toml_parser-1.1.3-spec-1.1.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/toml_parser/1.1.3+spec-1.1.0/download" + ], + "strip_prefix": "toml_parser-1.1.3+spec-1.1.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"toml_parser\",\n deps = [\n \"@fltk_crates__winnow-1.0.4//:winnow\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"default\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2024\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=toml_parser\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.1.3+spec-1.1.0\",\n)\n" + } + }, "fltk_crates__unicode-ident-1.0.24": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -944,6 +1621,97 @@ "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"utf8parse\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=utf8parse\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.2\",\n)\n" } }, + "fltk_crates__uuid-1.24.0": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/uuid/1.24.0/download" + ], + "strip_prefix": "uuid-1.24.0", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"uuid\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=uuid\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.24.0\",\n)\n" + } + }, + "fltk_crates__version_check-0.9.5": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/version_check/0.9.5/download" + ], + "strip_prefix": "version_check-0.9.5", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"version_check\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2015\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=version_check\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.9.5\",\n)\n" + } + }, + "fltk_crates__wasi-0.11.1-wasi-snapshot-preview1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download" + ], + "strip_prefix": "wasi-0.11.1+wasi-snapshot-preview1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"wasi\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wasi\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.11.1+wasi-snapshot-preview1\",\n)\n" + } + }, + "fltk_crates__wasm-bindgen-0.2.126": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen/0.2.126/download" + ], + "strip_prefix": "wasm-bindgen-0.2.126", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"wasm_bindgen\",\n deps = [\n \"@fltk_crates__cfg-if-1.0.4//:cfg_if\",\n \"@fltk_crates__once_cell-1.21.4//:once_cell\",\n \"@fltk_crates__wasm-bindgen-0.2.126//:build_script_build\",\n \"@fltk_crates__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared\",\n ],\n proc_macro_deps = [\n \"@fltk_crates__wasm-bindgen-macro-0.2.126//:wasm_bindgen_macro\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wasm-bindgen\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.126\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n aliases = {\n \"@fltk_crates__rustversion-1.0.23//:rustversion\": \"rustversion_compat\",\n },\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n link_deps = [\n \"@fltk_crates__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared\",\n ],\n edition = \"2021\",\n pkg_name = \"wasm-bindgen\",\n proc_macro_deps = [\n \"@fltk_crates__rustversion-1.0.23//:rustversion\",\n ],\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wasm-bindgen\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.2.126\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__wasm-bindgen-macro-0.2.126": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-macro/0.2.126/download" + ], + "strip_prefix": "wasm-bindgen-macro-0.2.126", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"wasm_bindgen_macro\",\n deps = [\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__wasm-bindgen-macro-support-0.2.126//:wasm_bindgen_macro_support\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wasm-bindgen-macro\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.126\",\n)\n" + } + }, + "fltk_crates__wasm-bindgen-macro-support-0.2.126": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.126/download" + ], + "strip_prefix": "wasm-bindgen-macro-support-0.2.126", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"wasm_bindgen_macro_support\",\n deps = [\n \"@fltk_crates__bumpalo-3.20.3//:bumpalo\",\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-2.0.117//:syn\",\n \"@fltk_crates__wasm-bindgen-shared-0.2.126//:wasm_bindgen_shared\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wasm-bindgen-macro-support\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.126\",\n)\n" + } + }, + "fltk_crates__wasm-bindgen-shared-0.2.126": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-shared/0.2.126/download" + ], + "strip_prefix": "wasm-bindgen-shared-0.2.126", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"wasm_bindgen_shared\",\n deps = [\n \"@fltk_crates__unicode-ident-1.0.24//:unicode_ident\",\n \"@fltk_crates__wasm-bindgen-shared-0.2.126//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wasm-bindgen-shared\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.2.126\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n links = \"wasm_bindgen\",\n pkg_name = \"wasm-bindgen-shared\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wasm-bindgen-shared\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.2.126\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, "fltk_crates__windows-link-0.2.1": { "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", "attributes": { @@ -969,6 +1737,71 @@ "strip_prefix": "windows-sys-0.61.2", "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"windows_sys\",\n deps = [\n \"@fltk_crates__windows-link-0.2.1//:windows_link\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"Win32\",\n \"Win32_Foundation\",\n \"Win32_System\",\n \"Win32_System_Console\",\n \"default\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=windows-sys\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.61.2\",\n)\n" } + }, + "fltk_crates__winnow-1.0.4": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winnow/1.0.4/download" + ], + "strip_prefix": "winnow-1.0.4", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"winnow\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_features = [\n \"alloc\",\n \"ascii\",\n \"binary\",\n \"default\",\n \"parser\",\n \"std\",\n ],\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=winnow\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.4\",\n)\n" + } + }, + "fltk_crates__wyz-0.5.1": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wyz/0.5.1/download" + ], + "strip_prefix": "wyz-0.5.1", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"wyz\",\n deps = [\n \"@fltk_crates__tap-1.0.1//:tap\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2018\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=wyz\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.5.1\",\n)\n" + } + }, + "fltk_crates__zerocopy-0.8.55": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/zerocopy/0.8.55/download" + ], + "strip_prefix": "zerocopy-0.8.55", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"zerocopy\",\n deps = [\n \"@fltk_crates__zerocopy-0.8.55//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=zerocopy\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.55\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"zerocopy\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=zerocopy\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"0.8.55\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } + }, + "fltk_crates__zerocopy-derive-0.8.55": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/zerocopy-derive/0.8.55/download" + ], + "strip_prefix": "zerocopy-derive-0.8.55", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\"@rules_rust//cargo:defs.bzl\", \"cargo_toml_env_vars\")\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_proc_macro\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_proc_macro(\n name = \"zerocopy_derive\",\n deps = [\n \"@fltk_crates__proc-macro2-1.0.106//:proc_macro2\",\n \"@fltk_crates__quote-1.0.45//:quote\",\n \"@fltk_crates__syn-2.0.117//:syn\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=zerocopy-derive\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"0.8.55\",\n)\n" + } + }, + "fltk_crates__zmij-1.0.23": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "remote_patch_strip": 1, + "sha256": "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/zmij/1.0.23/download" + ], + "strip_prefix": "zmij-1.0.23", + "build_file_content": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'fltk'\n###############################################################################\n\nload(\n \"@rules_rust//cargo:defs.bzl\",\n \"cargo_build_script\",\n \"cargo_toml_env_vars\",\n)\n\nload(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\n# buildifier: disable=bzl-visibility\nload(\"@rules_rust//crate_universe/private:selects.bzl\", \"selects\")\n\npackage(default_visibility = [\"//visibility:public\"])\n\ncargo_toml_env_vars(\n name = \"cargo_toml_env_vars\",\n src = \"Cargo.toml\",\n)\n\nrust_library(\n name = \"zmij\",\n deps = [\n \"@fltk_crates__zmij-1.0.23//:build_script_build\",\n ],\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_root = \"src/lib.rs\",\n edition = \"2021\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=zmij\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n target_compatible_with = select({\n \"@rules_rust//rust/platform:aarch64-apple-darwin\": [],\n \"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:wasm32-unknown-unknown\": [],\n \"@rules_rust//rust/platform:wasm32-wasip1\": [],\n \"@rules_rust//rust/platform:x86_64-pc-windows-msvc\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\": [],\n \"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\": [],\n \"//conditions:default\": [\"@platforms//:incompatible\"],\n }),\n version = \"1.0.23\",\n)\n\ncargo_build_script(\n name = \"_bs\",\n compile_data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \"**/*.rs\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n crate_name = \"build_script_build\",\n crate_root = \"build.rs\",\n data = glob(\n allow_empty = True,\n include = [\"**\"],\n exclude = [\n \"**/* *\",\n \".tmp_git_root/**/*\",\n \"BUILD\",\n \"BUILD.bazel\",\n \"WORKSPACE\",\n \"WORKSPACE.bazel\",\n ],\n ),\n edition = \"2021\",\n pkg_name = \"zmij\",\n rustc_env_files = [\n \":cargo_toml_env_vars\",\n ],\n rustc_flags = [\n \"--cap-lints=allow\",\n ],\n srcs = glob(\n allow_empty = True,\n include = [\"**/*.rs\"],\n ),\n tags = [\n \"cargo-bazel\",\n \"crate-name=zmij\",\n \"manual\",\n \"noclippy\",\n \"norustfmt\",\n ],\n version = \"1.0.23\",\n visibility = [\"//visibility:private\"],\n)\n\nalias(\n name = \"build_script_build\",\n actual = \":_bs\",\n tags = [\"manual\"],\n)\n" + } } } } diff --git a/Makefile b/Makefile index 2fd8535..ea8c97b 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,10 @@ .PHONY: check check-ci check-common lint format-check typecheck test cargo-check cargo-test cargo-clippy \ cargo-test-no-python cargo-clippy-no-python check-no-pyo3 cargo-deny \ - cargo-test-python-features check-locks regen-locks bazel-toolchain-guard \ + cargo-test-python-features check-locks check-bazel-locks regen-locks bazel-toolchain-guard \ bazel-check bazel-consumer-check \ build-native build-test-user-ext build-fegen-rust-cst build-rust-parser-fixture \ build-test-fixtures build-poc-cst gen-rust-cst gen-rust-parser gen-rust-unparser \ + gen-ast gen-rust-ast \ build-fegen-rust-parser test-native-parser test-rust-parser-fixture fix gencode # ══════════════════════════════════════════════════════════════════════════════ @@ -40,13 +41,20 @@ # DO NOT add new steps directly to `check` or `check-ci` — they inherit via this target. # # Single source for the step list, consumed by both the loop and the success echo -# (no duplicated literal to drift). ORDER IS LOAD-BEARING: check-locks must run -# AFTER test. The maturin builds under `test` re-resolve a stale Cargo.lock in -# place (cargo without --locked), and the check-locks git diff is what catches -# that rewrite — so it has to run afterward to see it. +# (no duplicated literal to drift). ORDER IS LOAD-BEARING, and the rule behind it is +# general: a step that only DIFFS a generated file must run after the step that REWRITES +# it, or it passes vacuously on the stale committed copy. +# - check-locks must run AFTER test. The maturin builds under `test` re-resolve a stale +# Cargo.lock in place (cargo without --locked), and the check-locks git diff is what +# catches that rewrite — so it has to run afterward to see it. +# - check-bazel-locks must run AFTER bazel-check and bazel-consumer-check, and therefore +# stays LAST. Those two lanes are the writer that repairs a stale MODULE.bazel.lock in +# place (bzlmod's default lockfile_mode is `update`), exactly as the maturin builds are +# for Cargo.lock. A new step appended after it that rewrites a lockfile would reopen +# the blind spot; put such a step before it. CHECK_STEPS := lint format-check typecheck test cargo-check cargo-clippy cargo-test \ cargo-test-python-features cargo-test-no-python cargo-clippy-no-python \ - check-no-pyo3 check-locks bazel-check bazel-consumer-check + check-no-pyo3 check-locks bazel-check bazel-consumer-check check-bazel-locks check-common: @steps="$(CHECK_STEPS)"; \ @@ -157,6 +165,13 @@ cargo-clippy: cargo-test-no-python: cargo test -q --locked -p fltk-cst-core --no-default-features cargo test -q --locked -p fltk-parser-core + # fltk-ast-core three times: the workspace lanes above cover its default (indexmap-on) + # feature set, the --no-default-features line is what keeps "a consumer with no keyed + # collections can drop indexmap" compiling, and --all-features is the only lane that + # compiles the uuid and decimal scalar builtins at all. + cargo test -q --locked -p fltk-ast-core + cargo test -q --locked -p fltk-ast-core --no-default-features + cargo test -q --locked -p fltk-ast-core --all-features cargo test -q --locked --manifest-path tests/rust_parser_fixture/Cargo.toml cargo test -q --locked --manifest-path crates/fegen-rust/Cargo.toml --no-default-features cargo test -q --locked --manifest-path tests/rust_poc_cst/Cargo.toml --no-default-features @@ -165,6 +180,8 @@ cargo-test-no-python: cargo-clippy-no-python: cargo clippy -q --locked -p fltk-cst-core --no-default-features --all-targets -- -D warnings cargo clippy -q --locked -p fltk-parser-core --all-targets -- -D warnings + cargo clippy -q --locked -p fltk-ast-core --no-default-features --all-targets -- -D warnings + cargo clippy -q --locked -p fltk-ast-core --all-features --all-targets -- -D warnings cargo clippy -q --locked --manifest-path tests/rust_parser_fixture/Cargo.toml --all-targets -- -D warnings cargo clippy -q --locked --manifest-path crates/fegen-rust/Cargo.toml --no-default-features --all-targets -- -D warnings cargo clippy -q --locked --manifest-path tests/rust_poc_cst/Cargo.toml --no-default-features --all-targets -- -D warnings @@ -182,6 +199,12 @@ check-no-pyo3: parser="$$(cargo tree --locked -p fltk-parser-core --edges normal,build)"; \ echo "$$parser" | grep -q fltk-cst-core || { echo "FAIL: check-no-pyo3 broken: cargo tree output lacks fltk-cst-core"; exit 1; }; \ ! echo "$$parser" | grep -q pyo3 || { echo "FAIL: pyo3 present in fltk-parser-core dependency graph"; exit 1; }; \ + ast="$$(cargo tree --locked -p fltk-ast-core --edges normal,build)"; \ + echo "$$ast" | grep -q fltk-cst-core || { echo "FAIL: check-no-pyo3 broken: cargo tree output lacks fltk-cst-core"; exit 1; }; \ + ! echo "$$ast" | grep -q pyo3 || { echo "FAIL: pyo3 present in fltk-ast-core dependency graph"; exit 1; }; \ + ast_all="$$(cargo tree --locked -p fltk-ast-core --all-features --edges normal,build)"; \ + echo "$$ast_all" | grep -q fltk-cst-core || { echo "FAIL: check-no-pyo3 broken: cargo tree output lacks fltk-cst-core"; exit 1; }; \ + ! echo "$$ast_all" | grep -q pyo3 || { echo "FAIL: pyo3 present in fltk-ast-core --all-features graph"; exit 1; }; \ fixture="$$(cargo tree --locked --manifest-path tests/rust_parser_fixture/Cargo.toml --edges normal,build)"; \ echo "$$fixture" | grep -q fltk-parser-core || { echo "FAIL: check-no-pyo3 broken: cargo tree output lacks fltk-parser-core"; exit 1; }; \ ! echo "$$fixture" | grep -q pyo3 || { echo "FAIL: pyo3 present in rust_parser_fixture default-features graph"; exit 1; }; \ @@ -219,6 +242,18 @@ check-locks: tests/rust_poc_cst/Cargo.lock \ || { echo "FAIL: lockfiles drifted; commit the regenerated files"; exit 1; } +# Bazel lock drift gate. MODULE.bazel.lock and tests/bazel_consumer/MODULE.bazel.lock are +# tracked, generated files, and bzlmod's default lockfile_mode is `update`: a Bazel run +# rewrites a stale one in place and still reports green, so nothing ever demands the repair +# be committed. The Bazel lanes above are the regenerating half of the usual +# regenerate-in-place + diff pattern, which is why this step is a pure diff and why it runs +# last (see the CHECK_STEPS comment). Run standalone without a prior Bazel run it passes +# vacuously, exactly as check-locks does for a Cargo.lock no maturin build has rewritten; +# `make check` is the gate that clears these. +check-bazel-locks: + git diff --exit-code -- MODULE.bazel.lock tests/bazel_consumer/MODULE.bazel.lock \ + || { echo "FAIL: Bazel lockfiles drifted; commit the regenerated files"; exit 1; } + # Drift detector for the Rust version: rust-toolchain.toml is the single source of # truth, but bzlmod cannot read TOML, so every Bazel module that pulls in rules_rust # must mirror the version in a rust.toolchain tag. Without a mirrored tag a module @@ -308,6 +343,23 @@ gen-rust-parser: gen-rust-unparser: uv run python -m fltk.fegen.genparser gen-rust-unparser $(GRAMMAR) $(RS_OUT) $(EXTRA_ARGS) +# Emit a Python AST module (BASE_ast.py) from a grammar. +# CST_MODULE is the import path of the grammar's generated CST module (make it with +# `genparser generate` first). EXTRA_ARGS carries --parser-module / --unparser-module / --goal. +# Usage: make gen-ast GRAMMAR=path/to/grammar.fltkg BASE=mylang CST_MODULE=pkg.mylang_cst \ +# OUT_DIR=pkg [EXTRA_ARGS=...] +gen-ast: + uv run python -m fltk.fegen.genparser gen-ast $(GRAMMAR) $(BASE) $(CST_MODULE) \ + --output-dir $(OUT_DIR) $(EXTRA_ARGS) + +# Emit a Rust AST module (ast.rs) from a grammar (no compilation). +# The module references the grammar's generated Rust CST module (--cst-mod-path, default +# super::cst), so emit that with gen-rust-cst first. EXTRA_ARGS carries --ast-config / +# --parser-mod-path / --unparser-mod-path / --goal. +# Usage: make gen-rust-ast GRAMMAR=path/to/grammar.fltkg RS_OUT=path/to/ast.rs [EXTRA_ARGS=...] +gen-rust-ast: + uv run python -m fltk.fegen.genparser gen-rust-ast $(GRAMMAR) $(RS_OUT) $(EXTRA_ARGS) + # Regenerate the parser for the fegen grammar into the fegen-rust crate. build-fegen-rust-parser: uv run python -m fltk.fegen.genparser gen-rust-parser \ @@ -349,6 +401,10 @@ gencode: uv run python -m fltk.fegen.genparser generate --protocol \ fltk/fegen/regex.fltkg regex fltk.fegen.regex_cst \ --output-dir fltk/fegen + # Python: fltkast grammar (fltkast_cst.py, fltkast_cst_protocol.py, fltkast_parser.py, fltkast_trivia_parser.py) + uv run python -m fltk.fegen.genparser generate --protocol \ + fltk/fegen/fltkast.fltkg fltkast fltk.fegen.fltkast_cst \ + --output-dir fltk/fegen # Python: fltklsp grammar (fltklsp_cst.py, fltklsp_cst_protocol.py, fltklsp_parser.py, fltklsp_trivia_parser.py) uv run python -m fltk.fegen.genparser generate --protocol \ fltk/lsp/fltklsp.fltkg fltklsp fltk.lsp.fltklsp_cst \ @@ -393,6 +449,13 @@ gencode: --init-pyi-output fltk/_stubs/rust_parser_fixture/__init__.pyi --extension-name rust_parser_fixture --submodules cst,parser,unparser,unparser_default,collision_cst,collision_parser" # Default-FormatterConfig variant (no --format-config) for default-config cross-backend parity. $(MAKE) gen-rust-unparser GRAMMAR=fltk/fegen/test_data/rust_parser_fixture.fltkg RS_OUT=tests/rust_parser_fixture/src/unparser_default.rs + # Rust: tests/rust_parser_fixture/src/ast.rs (rust_parser_fixture.fltkg, shaped by + # tests/rust_parser_fixture/rust_parser_fixture.fltkast). Committed artifact: entry points + # run against the generated parser and the .fltkfmt-baked unparser above. + # Emitted after both, since it imports them. + $(MAKE) gen-rust-ast GRAMMAR=fltk/fegen/test_data/rust_parser_fixture.fltkg RS_OUT=tests/rust_parser_fixture/src/ast.rs \ + EXTRA_ARGS="--ast-config tests/rust_parser_fixture/rust_parser_fixture.fltkast \ + --parser-mod-path super::parser --unparser-mod-path super::unparser --goal nest_sum" # Rust: tests/rust_parser_fixture/src/collision_cst.rs and collision_parser.rs (collision_fixture.fltkg) # Demonstrates that a cdylib can host multiple grammars; proves Parser/ApplyResult CST # classes and the parser machinery coexist without collision after the cst/parser split. diff --git a/TODO.md b/TODO.md index 70c54ff..0213d9c 100644 --- a/TODO.md +++ b/TODO.md @@ -155,3 +155,96 @@ chosen, cover both the label path and the rule-name path, and add a fixture case grammar has keyword labels (`type`, `match`) but nothing that camels to `Self`. Location: `fltk/fegen/gsm2tree_rs.py` (`_rust_variant_name`, and the class-name collision check in `RustCstGenerator.__init__`). + +## `ast-terminal-repeat-synthesis` + +`to_cst` on a terminal-only AST node rebuilds the CST by matching the node's `text` against one +regex per alternative, with a named capture group per included item +(`fltk/fegen/ast_model.py`, `_terminal_plan`). That construction cannot express an item whose +quantifier admits more than one occurrence — a single group would capture the whole run rather +than each occurrence — so `_terminal_plan` marks such an alternative unsynthesisable +(`pattern=None`), and `astrt.terminal_to_cst` raises `AstError` for it. The parse direction is +unaffected: `from_cst` reads the node's own span, so a rule like `word := c:/[a-z]/+ ;` converts +fine and only fails on the way back out. Closing this means splitting the text per occurrence +(walk the alternative's items left to right, matching each pattern at the current offset with +backtracking) and mirroring the algorithm in the Rust emitter so both backends synthesise the same +children. Location: `fltk/fegen/ast_model.py` (`_terminal_plan`'s `bounds != (1, 1)` return), +`fltk/fegen/pyrt/astrt.py` (`terminal_to_cst`). + +## `ast-dispatch-order` + +`alternatives_are_disjoint` (`fltk/fegen/grammar_shape.py`) decides whether two alternatives of a +rule can be told apart in the CST from their labeled children's occurrence counts and kinds alone. +It cannot use child *order*, so `x := a:num , b:name | b:name , a:num ;` reads as non-disjoint even +though the child order distinguishes the two, and the rule classifies as a merged product where a +sum would be sound. Closing this means an order-sensitive signature (the sequence of labeled item +positions per alternative, matched against the children in source order) in both the classifier and +the generated dispatch, on both backends. It must ship opt-in or with a major version: rules that +default to a merged product today would silently become sums, which is a breaking change to +generated public API for every downstream consumer of such a grammar. Location: +`fltk/fegen/grammar_shape.py` (`alternatives_are_disjoint`, and `alternatives_are_sum` / +`AltSignature` with it), `fltk/fegen/pyrt/astrt.py` (`AltSignature.accepts`). + +## `ast-transparent-container-payload` + +`transparent;` on a single-field product erases the rule to the type of its one field, but only +when that field occurs exactly once: an optional or repeated field is a generation error +(`_ModelBuilder.erased_product_payload`). Design §5.4 states the payload as "the field's type" +without restricting arity, so `list := "[" , (value , ("," , value)* , ","?)? , "]" ;` marked +`transparent;` should erase to `Vec` / `list[Value]` rather than being refused. Closing this +means composing two container levels: `FieldType` carries one `Container`, so a use site of an +erased collection payload needs `list[list[T]]` annotations, and `astrt.cursor` — which tells a +single value from a collection by `isinstance(value, list)` — would take a list-valued single field +for several values, so the emitter must construct the cursor explicitly at such positions. Both +halves have to land in the Rust emitter the same way, or the two ASTs stop being shape-equivalent. +Location: `fltk/fegen/ast_model.py` (`_ModelBuilder.erased_product_payload`'s arity check), +`fltk/fegen/gsm2ast.py` (`field_annotation`, `cursor_expression`). + +## `rust-cst-memberless-nodes` + +The Rust CST generator refuses any rule whose model has no members (`gsm2tree_rs.py`, +`_rule_info`: "Model class ... would have no members"), while the Python CST generator accepts one. +Two AST-modelable shapes are therefore unreachable on the Rust backend: a marker product spelled +with `.` separators (`marker := $"!" . $"?" ;` — a rule whose included items are all unlabeled +literals, which the AST models as a span-only node) and an unlabeled-unincluded terminal rule. This +is pre-existing CST-generator behavior, not AST-layer debt, and the workaround is to `$`-include a +terminal so the node has one member. Closing it means teaching the Rust CST generator to emit a +memberless node — the node struct, its child and label enums (which have no variants), and the +parser plumbing that appends nothing — which is its own bounded design. Until it is closed, the +Python/Rust AST parity suite must carve these two shapes out as a known divergence rather than +reporting them as a backend bug. Location: `fltk/fegen/gsm2tree_rs.py` (the `if not model.types:` +guard in `_rule_info`). + +## `ast-deep-clone-debug` + +Generated Rust fold types derive `Clone` and `Debug` (`gsm2ast_rs.py`, `_NODE_DERIVES`), and both +derives recurse once per chain link, so cloning or `{:?}`-formatting a fold chain of some tens of +thousands of operands overflows the stack — the same hazard the emitted iterative `Drop` closes for +teardown and the emitted `eq_walk` closes for comparison. Unlike those two, `Clone` and `Debug` are +explicit consumer calls: they are avoidable, no design law rests on them, and a consumer who needs +neither pays nothing. So v1 documents the limit rather than emitting worklist implementations. +Closing it means emitting a written-out `Clone` (build the new chain bottom-up from a worklist over +the old one) and `Debug` (render iteratively, or bound the depth) for the types the recursion +analysis marks `deep`, in place of the derives. Do it when a consumer actually hits it — the +`PartialEq` walk is the shape to copy. Location: `fltk/fegen/gsm2ast_rs.py` (`_NODE_DERIVES`). + + +## `ast-select-literal-content` + +Kind-aware `to_cst` alternative selection tests a value's *kind*, and a labeled literal's kind is +the same TEXT a regex position contributes (`element_types` maps a literal to SPAN, which +`field_type` coerces to TEXT wherever the label carries anything else). So for a rule whose +alternatives split a label between a literal and something else — `x := v:"lit" | v:item ;` under a +`rule x { product; }` sidecar — the literal alternative's selection guard admits *any* string, and +the literal position then renders the grammar's own text: a hand-built `X(v="xyz")` unparses to +`lit` on both backends, silently replacing the value. Pre-existing (name-only first-fit chose the +same alternative and swapped the same way); the kind test narrowed it to strings but not to the +literal's own string. Closing it means a content test at selection time — `Guard(GuardKind.LITERAL)` +where the accepted TEXT of a label is contributed by literal positions alone, which Python already +spells as `astrt.LiteralText` — *and* the matching content test on the Rust side, whose selection +conjunct is a `matches!` over field enum variants and carries no content today. That second half is +the design work: `AcceptedKind.guard` is currently the untagged backend's test only, so making +selection content-aware changes what the tagged backend reads, and it has to be decided against the +multi-spelling doctrine (`rival_signature` deliberately does not record which literal a value came +from, so alternatives differing only in literal spelling stay first-fit). Location: +`fltk/fegen/ast_model.py` (`_kind_guard`), `fltk/fegen/gsm2ast_rs.py` (`kind_condition`). diff --git a/crates/fegen-rust/src/unparser.rs b/crates/fegen-rust/src/unparser.rs index e58188b..2607599 100644 --- a/crates/fegen-rust/src/unparser.rs +++ b/crates/fegen-rust/src/unparser.rs @@ -737,9 +737,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::NoWs) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ".")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(".")); Some(UnparseResult::new(acc, pos + 1)) @@ -765,9 +768,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::WsAllowed) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ",")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(",")); Some(UnparseResult::new(acc, pos + 1)) @@ -793,9 +799,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::WsRequired) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ":")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(":")); Some(UnparseResult::new(acc, pos + 1)) @@ -956,9 +965,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::NoWs) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ".")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(".")); Some(UnparseResult::new(acc, pos + 1)) @@ -984,9 +996,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::WsAllowed) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ",")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(",")); Some(UnparseResult::new(acc, pos + 1)) @@ -1012,9 +1027,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::WsRequired) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ":")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(":")); Some(UnparseResult::new(acc, pos + 1)) @@ -1076,9 +1094,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::NoWs) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ".")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(".")); Some(UnparseResult::new(acc, pos + 1)) @@ -1104,9 +1125,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::WsAllowed) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ",")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(",")); Some(UnparseResult::new(acc, pos + 1)) @@ -1132,9 +1156,12 @@ impl Unparser { if child_tuple.0 != Some(cst::ItemsLabel::WsRequired) { return None; } - match &child_tuple.1 { - cst::ItemsChild::Span(_) => {} + let span = match &child_tuple.1 { + cst::ItemsChild::Span(span) => span, _ => return None, + }; + if span.text_str().is_some_and(|t| !matches!(t, ":")) { + return None; } let acc = acc.add_non_trivia(fltk_unparser_core::text(":")); Some(UnparseResult::new(acc, pos + 1)) @@ -1571,6 +1598,10 @@ impl Unparser { if child_tuple.0 != Some(cst::DispositionLabel::Suppress) { return None; } + let cst::DispositionChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "%")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("%")); Some(UnparseResult::new(acc, pos + 1)) } @@ -1593,6 +1624,10 @@ impl Unparser { if child_tuple.0 != Some(cst::DispositionLabel::Include) { return None; } + let cst::DispositionChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "$")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("$")); Some(UnparseResult::new(acc, pos + 1)) } @@ -1615,6 +1650,10 @@ impl Unparser { if child_tuple.0 != Some(cst::DispositionLabel::Inline) { return None; } + let cst::DispositionChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "!")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("!")); Some(UnparseResult::new(acc, pos + 1)) } @@ -1650,6 +1689,10 @@ impl Unparser { if child_tuple.0 != Some(cst::QuantifierLabel::Optional) { return None; } + let cst::QuantifierChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "?")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("?")); Some(UnparseResult::new(acc, pos + 1)) } @@ -1672,6 +1715,10 @@ impl Unparser { if child_tuple.0 != Some(cst::QuantifierLabel::OneOrMore) { return None; } + let cst::QuantifierChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "+")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("+")); Some(UnparseResult::new(acc, pos + 1)) } @@ -1694,6 +1741,10 @@ impl Unparser { if child_tuple.0 != Some(cst::QuantifierLabel::ZeroOrMore) { return None; } + let cst::QuantifierChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "*")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("*")); Some(UnparseResult::new(acc, pos + 1)) } @@ -1981,6 +2032,10 @@ impl Unparser { if child_tuple.0 != Some(cst::LineCommentLabel::Prefix) { return None; } + let cst::LineCommentChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "//")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("//")); Some(UnparseResult::new(acc, pos + 1)) } @@ -2038,6 +2093,10 @@ impl Unparser { if child_tuple.0 != Some(cst::BlockCommentLabel::Start) { return None; } + let cst::BlockCommentChild::Span(span) = &child_tuple.1; + if span.text_str().is_some_and(|t| !matches!(t, "/*")) { + return None; + } let acc = acc.add_non_trivia(fltk_unparser_core::text("/*")); Some(UnparseResult::new(acc, pos + 1)) } diff --git a/crates/fltk-ast-core/BUILD.bazel b/crates/fltk-ast-core/BUILD.bazel new file mode 100644 index 0000000..4a6811d --- /dev/null +++ b/crates/fltk-ast-core/BUILD.bazel @@ -0,0 +1,32 @@ +load("@rules_rust//rust:defs.bzl", "rust_library") + +rust_library( + name = "fltk-ast-core", + srcs = glob(["src/**/*.rs"]), + # Bazel crate_features do not read Cargo defaults, so every feature is stated here. All + # three are on because a Bazel consumer has no way to re-enable a feature this target left + # off: generated AST code for a sidecar using `key:` names ::fltk_ast_core::IndexMap, and + # code for a `type: uuid` / `type: decimal` field names ::fltk_ast_core::Uuid / + # ::fltk_ast_core::Decimal. A pure-Rust consumer who wants any of the three dependencies + # gone builds through Cargo with default-features = false. + # + # The uuid / rust_decimal labels below come from the @fltk_crates hub only because + # fltk-ast-core declares both as unconditional dev-dependencies: crate_universe's + # from_cargo resolution sees an optional dependency no workspace member activates as + # absent. Cargo.toml documents the mirroring requirement. + crate_features = [ + "decimal", + "indexmap", + "uuid", + ], + crate_name = "fltk_ast_core", + edition = "2021", + visibility = ["//visibility:public"], + deps = [ + "//crates/fltk-cst-core", + "@fltk_crates//:indexmap", + "@fltk_crates//:regex-automata", + "@fltk_crates//:rust_decimal", + "@fltk_crates//:uuid", + ], +) diff --git a/crates/fltk-ast-core/Cargo.toml b/crates/fltk-ast-core/Cargo.toml new file mode 100644 index 0000000..32a1bc3 --- /dev/null +++ b/crates/fltk-ast-core/Cargo.toml @@ -0,0 +1,54 @@ +[package] +name = "fltk-ast-core" +version = "0.4.0" +edition = "2021" +license = "MIT" + +[lib] +name = "fltk_ast_core" +crate-type = ["rlib"] + +# No `python` feature: pyo3-freedom is structural absence, not a disabled feature. +# This crate never links pyo3. +# +# regex-automata is taken directly rather than reached through fltk-parser-core's +# re-export: generated AST code never names a regex type — terminal patterns are +# compiled and matched behind `TerminalPattern` — so there is no generated-code/runtime +# version pair to keep coherent, which is what that re-export exists for. The version +# and feature pin it shares with fltk-parser-core lives in the workspace manifest. +[dependencies] +fltk-cst-core = { path = "../fltk-cst-core", default-features = false } +indexmap = { version = "2", optional = true } +# The two opt-in scalar builtins. Both are taken without default features: `uuid`'s +# generators and `rust_decimal`'s serde support are no part of parsing a lexeme or +# rendering a value back to one. +uuid = { version = "1", optional = true, default-features = false, features = ["std"] } +rust_decimal = { version = "1", optional = true, default-features = false, features = [ + "std", +] } +regex-automata = { workspace = true } + +# The two scalar builtins again, unconditionally. The crate's own feature-gated tests use +# both, and a dev-dependency is always active in the workspace resolve — which is what gives +# the Bazel lane's `crate.from_cargo` hub a target for each, so +# `crates/fltk-ast-core/BUILD.bazel` can turn the features on. Every field mirrors the +# optional declaration above, and `tests/test_ast_core_manifest.py` fails if the two drift: +# a Bazel build would then compile a different version or feature set than a Cargo build of +# the same feature. +[dev-dependencies] +uuid = { version = "1", default-features = false, features = ["std"] } +rust_decimal = { version = "1", default-features = false, features = [ + "std", +] } + +[features] +default = ["indexmap"] +# indexmap (default-on): the container a `key:` keyed collection generates. Generated +# code names `::fltk_ast_core::IndexMap`, so a consumer whose sidecar uses no `key:` +# statement can drop the dependency with `default-features = false`. +indexmap = ["dep:indexmap"] +# uuid / decimal: the two `type:` builtins whose value is not a primitive. Off by default +# so a consumer using neither pays for neither; a generated module that needs one names +# the feature in its header comment. +uuid = ["dep:uuid"] +decimal = ["dep:rust_decimal"] diff --git a/crates/fltk-ast-core/src/children.rs b/crates/fltk-ast-core/src/children.rs new file mode 100644 index 0000000..325e8a7 --- /dev/null +++ b/crates/fltk-ast-core/src/children.rs @@ -0,0 +1,191 @@ +//! Reading a CST node's labeled children, for the generated `from_cst` converters. +//! +//! Generated code collects the children carrying one label into a slice — the label enum is +//! per-rule, so the filtering is emitted, not generic — and then asks these helpers what the +//! field's arity allows. Each helper has a counterpart of the same name in +//! `fltk.fegen.pyrt.astrt`, and a CST the one backend refuses must be refused by the other for +//! the same stated reason: the message templates are one text, differing only where each +//! language spells a `Debug`/`repr` of an interpolated value (`{label:?}` renders `"key"` where +//! Python's `{label!r}` renders `'key'`). That correspondence is enforced by +//! `tests/test_ast_error_message_parity.py`, which reads the templates out of this file. +//! +//! A parser-produced CST satisfies every arity by construction; these failures are reachable +//! from a hand-built or mutated one. + +use std::fmt::Debug; + +use fltk_cst_core::Span; + +use crate::error::AstError; + +/// The single child of a required label. +pub fn one<'a, C>(children: &[&'a C], rule: &str, label: &str, span: &Span) -> Result<&'a C, AstError> { + match children { + [single] => Ok(single), + _ => Err(AstError::new( + format!( + "rule {rule:?}: expected exactly one {label:?} child, found {}", + children.len() + ), + span.clone(), + )), + } +} + +/// The child of an optional label, or `None`. +pub fn optional<'a, C>(children: &[&'a C], rule: &str, label: &str, span: &Span) -> Result, AstError> { + match children { + [] => Ok(None), + [single] => Ok(Some(single)), + _ => Err(at_most_one(children.len(), rule, label, span)), + } +} + +/// Whether an optional labeled literal is present. +pub fn presence(children: &[&C], rule: &str, label: &str, span: &Span) -> Result { + match children { + [] => Ok(false), + [_single] => Ok(true), + _ => Err(at_most_one(children.len(), rule, label, span)), + } +} + +fn at_most_one(found: usize, rule: &str, label: &str, span: &Span) -> AstError { + AstError::new( + format!("rule {rule:?}: expected at most one {label:?} child, found {found}"), + span.clone(), + ) +} + +/// The source text of a span child. +/// +/// `span` is the containing node's span, which is where the failure is reported: a sourceless +/// child span has no position of its own to point at. +pub fn text(child: &Span, rule: &str, label: &str, span: &Span) -> Result { + child.text_str().map(str::to_string).ok_or_else(|| { + AstError::new( + format!("rule {rule:?}: the {label:?} span carries no source text"), + span.clone(), + ) + }) +} + +/// The source text a node's own span covers, which is what a terminal-only rule carries. +pub fn node_text(span: &Span, rule: &str) -> Result { + span.text_str() + .map(str::to_string) + .ok_or_else(|| AstError::new(format!("rule {rule:?}: node span carries no source text"), span.clone())) +} + +/// A child of a kind the label cannot hold. +/// +/// Reachable only from a hand-built CST: the parser puts a child of the grammar's own term +/// under each label. +pub fn unexpected_child(rule: &str, label: &str, span: &Span) -> AstError { + AstError::new( + format!("rule {rule:?}: label {label:?} has a child of unexpected kind"), + span.clone(), + ) +} + +/// Two elements of a keyed collection carrying one key. +/// +/// The two-span diagnostic a hand-written resolver writes: the offending element's span, and +/// the earlier element's as `related`. +pub fn duplicate_key(rule: &str, key: &K, span: &Span, previous: &Span) -> AstError { + AstError::with_related( + format!("duplicate {rule} key {key:?}"), + span.clone(), + vec![("previously defined here".to_string(), previous.clone())], + ) +} + +#[cfg(test)] +mod tests { + use fltk_cst_core::SourceText; + + use super::*; + + fn span() -> Span { + Span::unknown() + } + + /// A stand-in for a generated child enum's payload; the helpers are generic over it. + #[derive(Debug, PartialEq)] + struct Child(u8); + + #[test] + fn a_required_label_needs_exactly_one_child() { + let child = Child(1); + assert_eq!(one(&[&child], "entry", "key", &span()), Ok(&child)); + assert_eq!( + one::(&[], "entry", "key", &span()).unwrap_err().message, + "rule \"entry\": expected exactly one \"key\" child, found 0" + ); + assert_eq!( + one(&[&child, &child], "entry", "key", &span()).unwrap_err().message, + "rule \"entry\": expected exactly one \"key\" child, found 2" + ); + } + + #[test] + fn an_optional_label_takes_none_or_one() { + let child = Child(1); + assert_eq!(optional::(&[], "entry", "tag", &span()), Ok(None)); + assert_eq!(optional(&[&child], "entry", "tag", &span()), Ok(Some(&child))); + assert_eq!( + optional(&[&child, &child], "entry", "tag", &span()) + .unwrap_err() + .message, + "rule \"entry\": expected at most one \"tag\" child, found 2" + ); + } + + #[test] + fn presence_is_whether_the_keyword_was_written() { + let child = Child(1); + assert_eq!(presence::(&[], "decl", "pub", &span()), Ok(false)); + assert_eq!(presence(&[&child], "decl", "pub", &span()), Ok(true)); + assert!(presence(&[&child, &child], "decl", "pub", &span()).is_err()); + } + + #[test] + fn text_comes_off_the_span_that_carries_its_source() { + let source = SourceText::from_str("hello", None); + let child = Span::new_with_source(1, 4, &source); + assert_eq!(text(&child, "word", "w", &span()), Ok("ell".to_string())); + assert_eq!(node_text(&child, "word"), Ok("ell".to_string())); + } + + #[test] + fn a_sourceless_span_carries_no_text_to_convert() { + let child = Span::new_sourceless(0, 3); + assert_eq!( + text(&child, "word", "w", &span()).unwrap_err().message, + "rule \"word\": the \"w\" span carries no source text" + ); + assert_eq!( + node_text(&child, "word").unwrap_err().message, + "rule \"word\": node span carries no source text" + ); + } + + #[test] + fn an_unexpected_child_names_the_rule_and_the_label() { + assert_eq!( + unexpected_child("wrap", "a", &span()).message, + "rule \"wrap\": label \"a\" has a child of unexpected kind" + ); + } + + #[test] + fn a_duplicate_key_carries_both_locations() { + let source = SourceText::from_str("aa", None); + let first = Span::new_with_source(0, 1, &source); + let second = Span::new_with_source(1, 2, &source); + let error = duplicate_key("setting", &"host", &second, &first); + assert_eq!(error.message, "duplicate setting key \"host\""); + assert_eq!(error.span, second); + assert_eq!(error.related, vec![("previously defined here".to_string(), first)]); + } +} diff --git a/crates/fltk-ast-core/src/convert.rs b/crates/fltk-ast-core/src/convert.rs new file mode 100644 index 0000000..2d3408d --- /dev/null +++ b/crates/fltk-ast-core/src/convert.rs @@ -0,0 +1,66 @@ +use crate::error::AstError; + +/// Convert a CST node into an AST value. +/// +/// Generated converters are inherent associated functions (`Entry::from_cst`), not impls of +/// this trait — the trait is the escape hatch a `custom(...)` rule uses: the generator emits +/// no type and no converter for such a rule, and the containing rule's converter reaches the +/// user's type through here. +/// +/// The CST node type is a parameter rather than an associated type so one AST type can be +/// built from more than one rule's node, and so the impl is legal for a foreign value type: +/// `C` is local to the crate writing the impl. +pub trait FromCst: Sized { + /// Build the AST value, or explain why the node cannot produce one. + fn from_cst(cst: &C) -> Result; +} + +/// Synthesize a CST node from an AST value — the reverse of [`FromCst`], and the other half +/// of what a `custom(...)` rule's type must provide. +/// +/// The node this produces is fed to the generated formatter, so it must carry exactly the +/// children the parser would have produced for the rule. +pub trait ToCst { + /// Build the CST node, or explain why the value cannot produce one. + fn to_cst(&self) -> Result; +} + +#[cfg(test)] +mod tests { + use super::*; + use fltk_cst_core::Span; + + /// A stand-in for a generated CST node: the text a terminal matched. + struct Word(String); + + /// A stand-in for a `custom(...)` rule's user type, holding the reversed lexeme so a + /// round trip through both traits proves each direction ran. + #[derive(Debug, PartialEq)] + struct Flipped(String); + + impl FromCst for Flipped { + fn from_cst(cst: &Word) -> Result { + if cst.0.is_empty() { + return Err(AstError::new("rule 'word': empty", Span::unknown())); + } + Ok(Flipped(cst.0.chars().rev().collect())) + } + } + + impl ToCst for Flipped { + fn to_cst(&self) -> Result { + Ok(Word(self.0.chars().rev().collect())) + } + } + + /// The traits carry no logic of their own, so the only thing there is to assert about + /// them is that the two bounds compose and that `C`-as-a-parameter admits a foreign + /// value type, which is the stated reason for the parameter. + #[test] + fn the_traits_are_reachable_through_generic_code() { + fn round_trip + ToCst>(node: &C) -> Result { + T::from_cst(node)?.to_cst() + } + assert_eq!(round_trip::(&Word("xy".to_string())).unwrap().0, "xy"); + } +} diff --git a/crates/fltk-ast-core/src/error.rs b/crates/fltk-ast-core/src/error.rs new file mode 100644 index 0000000..965aa34 --- /dev/null +++ b/crates/fltk-ast-core/src/error.rs @@ -0,0 +1,168 @@ +use std::fmt; + +use fltk_cst_core::Span; + +/// A CST could not be converted to its AST form, or an AST value could not be +/// serialized back to a CST. +/// +/// `span` locates the failure; `related` carries secondary locations, such as the earlier +/// element a duplicate key collides with. Values built by hand carry +/// [`Span::unknown`] spans, so `related` and the message are the whole of the diagnostic +/// there. +/// +/// This is the Rust counterpart of `fltk.fegen.pyrt.astrt.AstError`: the two backends refuse +/// the same inputs and write their messages from the same templates, but the offending value +/// is quoted by each language's own debug formatting (`{:?}` here, `!r` there), so the two +/// spellings are not byte-identical. Only rendered *output* is required to match byte for +/// byte; diagnostics are not. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct AstError { + /// What went wrong, naming the rule and label involved. + pub message: String, + /// Where it went wrong. + pub span: Span, + /// Secondary locations, each with its own explanation. + pub related: Vec<(String, Span)>, +} + +impl AstError { + /// An error at one location. + pub fn new(message: impl Into, span: Span) -> Self { + Self { + message: message.into(), + span, + related: Vec::new(), + } + } + + /// An error with secondary locations, such as `("previously defined here", span)`. + pub fn with_related(message: impl Into, span: Span, related: Vec<(String, Span)>) -> Self { + Self { + message: message.into(), + span, + related, + } + } +} + +impl fmt::Display for AstError { + /// The message, followed by a 1-based `line`/`column` when the span resolves one. + /// + /// Sourceless and unknown spans resolve nothing, so a hand-built value's error is the + /// bare message. Related locations are not rendered — a caller that wants them walks + /// [`related`](Self::related), as a diagnostic renderer does. + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self.span.line_col_inner() { + Some(pos) => write!(f, "{} at line {}, column {}", self.message, pos.line + 1, pos.col + 1), + None => write!(f, "{}", self.message), + } + } +} + +impl std::error::Error for AstError {} + +/// The failure of a `parse_str` convenience: source text either does not parse, or parses +/// to a CST the converter rejects. +/// +/// The `Parse` arm carries the generated parser's own formatted diagnostic, which is a +/// string rather than a structured error because that is what the parser produces. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ParseToAstError { + /// The source text is not in the language. + Parse(String), + /// The text parsed, but the CST does not convert. + Ast(AstError), +} + +impl fmt::Display for ParseToAstError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ParseToAstError::Parse(message) => write!(f, "{message}"), + ParseToAstError::Ast(error) => write!(f, "{error}"), + } + } +} + +impl std::error::Error for ParseToAstError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + ParseToAstError::Parse(_) => None, + ParseToAstError::Ast(error) => Some(error), + } + } +} + +impl From for ParseToAstError { + fn from(error: AstError) -> Self { + ParseToAstError::Ast(error) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use fltk_cst_core::SourceText; + + #[test] + fn display_names_a_resolvable_position_one_based() { + let source = SourceText::from_str("first\nsecond", None); + let error = AstError::new("rule 'x': bad", Span::new_with_source(6, 12, &source)); + assert_eq!(error.to_string(), "rule 'x': bad at line 2, column 1"); + } + + #[test] + fn display_of_an_unknown_span_is_the_bare_message() { + let error = AstError::new("rule 'x': bad", Span::unknown()); + assert_eq!(error.to_string(), "rule 'x': bad"); + } + + #[test] + fn display_of_a_sourceless_span_is_the_bare_message() { + let error = AstError::new("rule 'x': bad", Span::new_sourceless(3, 7)); + assert_eq!(error.to_string(), "rule 'x': bad"); + } + + #[test] + fn related_locations_are_carried_but_not_rendered() { + let source = SourceText::from_str("a b", None); + let error = AstError::with_related( + "duplicate 'setting' key 'a'", + Span::new_with_source(2, 3, &source), + vec![("previously defined here".to_string(), Span::new_with_source(0, 1, &source))], + ); + assert_eq!(error.related.len(), 1); + assert_eq!(error.related[0].0, "previously defined here"); + assert_eq!(error.related[0].1.start(), 0); + assert_eq!(error.to_string(), "duplicate 'setting' key 'a' at line 1, column 3"); + } + + #[test] + fn new_leaves_related_empty() { + assert!(AstError::new("x", Span::unknown()).related.is_empty()); + } + + #[test] + fn ast_error_is_a_std_error() { + fn as_error(error: &dyn std::error::Error) -> String { + error.to_string() + } + assert_eq!(as_error(&AstError::new("boom", Span::unknown())), "boom"); + } + + #[test] + fn parse_arm_displays_the_parser_diagnostic() { + let error = ParseToAstError::Parse("expected ';' at line 1".to_string()); + assert_eq!(error.to_string(), "expected ';' at line 1"); + assert!(std::error::Error::source(&error).is_none()); + } + + #[test] + fn ast_arm_displays_and_sources_the_ast_error() { + let error: ParseToAstError = AstError::new("rule 'x': bad", Span::unknown()).into(); + assert_eq!(error.to_string(), "rule 'x': bad"); + assert_eq!( + std::error::Error::source(&error).map(ToString::to_string), + Some("rule 'x': bad".to_string()) + ); + } +} diff --git a/crates/fltk-ast-core/src/fold.rs b/crates/fltk-ast-core/src/fold.rs new file mode 100644 index 0000000..308a8ca --- /dev/null +++ b/crates/fltk-ast-core/src/fold.rs @@ -0,0 +1,321 @@ +//! Folding a rule's operands into a binary chain, for the generated `from_cst` converters. +//! +//! A grammar spells a precedence level as `operand , (op , operand)*`, which the CST records as a +//! flat run of children. The AST shape is the nested one: a bare operand, or a link joining two +//! sub-chains. Generated code collects the operands with their own spans and the operators, then +//! hands both to [`fold_left`] or [`fold_right`] along with two closures — one wrapping an operand +//! as the rule's own type, one building a link — because those are the only parts that name +//! generated types. +//! +//! The loop lives here rather than in the emitters so the nesting order, the span merging and the +//! diagnostics are one implementation. Each helper has a counterpart of the same name in +//! `fltk.fegen.pyrt.astrt`, and the message templates are one text under the translation +//! `tests/test_ast_error_message_parity.py` enforces. +//! +//! A parser-produced CST always interleaves as the grammar says, so the arity failure is +//! reachable only from a hand-built or mutated one, and the source-mismatch failure only from one +//! whose operands were parsed from different sources. [`fold_left`] and [`fold_right`] check the +//! interleaving themselves, so a caller who has not run [`check_fold_arity`] over its own runs — +//! anything but a generated converter, which checks against the CST node's span first — gets the +//! same diagnostic rather than a chain with values quietly dropped from it. + +use fltk_cst_core::Span; + +use crate::error::AstError; + +/// A node with no operand at all, which no fold can reduce. +fn no_operands(rule: &str, span: &Span) -> AstError { + AstError::new( + format!("rule {rule:?}: a fold needs at least one operand, but the node has none"), + span.clone(), + ) +} + +/// Check the interleaving a fold rule's grammar fixes: one operator between each operand pair. +pub fn check_fold_arity(operands: usize, operators: usize, rule: &str, span: &Span) -> Result<(), AstError> { + if operands < 1 { + return Err(no_operands(rule, span)); + } + if operators != operands - 1 { + return Err(AstError::new( + format!( + "rule {rule:?}: a fold over {operands} operand(s) needs {} operator(s), but the node has {operators}", + operands - 1 + ), + span.clone(), + )); + } + Ok(()) +} + +/// A chain nested against the fold's own direction, which the grammar has no shape for. +/// +/// `side` is the side of a link that holds the offending sub-chain: a `fold_left` rule nests to the +/// left, so a link in a link's `rhs` cannot be unfolded back into the alternating item run. +pub fn against_direction(rule: &str, side: &str) -> AstError { + AstError::new( + format!( + "rule {rule:?}: this fold nests the other way, so the {side} operand of a link cannot itself be a chain — the grammar has no shape to render it as; rebuild the chain in the fold's own direction" + ), + Span::unknown(), + ) +} + +/// The span covering both sides of one link. +fn merge(left: &Span, right: &Span, rule: &str) -> Result { + left.merge(right).map_err(|_| { + AstError::new( + format!("rule {rule:?}: the operands of a fold come from different sources, so their spans cannot merge"), + left.clone(), + ) + }) +} + +/// Left-nest a fold rule's operands: `a op b op c` becomes `(a op b) op c`. +/// +/// Each operand arrives with its own CST span, in source order; every synthesized link carries the +/// merge of everything below it. A single operand comes back wrapped by `operand` and nothing +/// else, so the link type appears only where the grammar actually repeated. `span` is the whole +/// node's, used for the arity diagnostic, which has no operand to point at. +/// +/// The interleaving is checked here: one operator between each operand pair, or [`AstError`]. +pub fn fold_left( + rule: &str, + span: &Span, + operands: Vec<(T, Span)>, + operators: Vec, + operand: impl Fn(T) -> V, + link: impl Fn(O, V, V, Span) -> V, +) -> Result { + check_fold_arity(operands.len(), operators.len(), rule, span)?; + let mut rest = operands.into_iter(); + let (first, first_span) = rest.next().expect("the arity check leaves at least one operand"); + let mut value = operand(first); + let mut covered = first_span; + for ((next, next_span), operator) in rest.zip(operators) { + covered = merge(&covered, &next_span, rule)?; + value = link(operator, value, operand(next), covered.clone()); + } + Ok(value) +} + +/// Right-nest a fold rule's operands: `a op b op c` becomes `a op (b op c)`. +/// +/// The interleaving is checked here, as in [`fold_left`]. +pub fn fold_right( + rule: &str, + span: &Span, + operands: Vec<(T, Span)>, + operators: Vec, + operand: impl Fn(T) -> V, + link: impl Fn(O, V, V, Span) -> V, +) -> Result { + check_fold_arity(operands.len(), operators.len(), rule, span)?; + let mut rest = operands; + let (last, last_span) = rest.pop().expect("the arity check leaves at least one operand"); + let mut value = operand(last); + let mut covered = last_span; + for ((previous, previous_span), operator) in rest.into_iter().rev().zip(operators.into_iter().rev()) { + covered = merge(&previous_span, &covered, rule)?; + value = link(operator, operand(previous), value, covered.clone()); + } + Ok(value) +} + +#[cfg(test)] +mod tests { + use fltk_cst_core::SourceText; + + use super::*; + + /// A stand-in for a generated fold pair: the enum's two variants over one operand type. + #[derive(Debug, PartialEq)] + enum Chain { + Operand(i64), + Link(Box), + } + + #[derive(Debug, PartialEq)] + struct Link { + op: char, + lhs: Chain, + rhs: Chain, + span: Span, + } + + fn operand(value: i64) -> Chain { + Chain::Operand(value) + } + + fn link(op: char, lhs: Chain, rhs: Chain, span: Span) -> Chain { + Chain::Link(Box::new(Link { op, lhs, rhs, span })) + } + + /// One source holding `1+2+3`, so operand spans are the digit positions in it. + fn source() -> SourceText { + SourceText::from_str("1+2+3", None) + } + + fn operands(count: usize) -> Vec<(i64, Span)> { + let source = source(); + (0..count) + .map(|index| { + let start = i64::try_from(index * 2).expect("index fits"); + ( + i64::try_from(index + 1).expect("index fits"), + Span::new_with_source(start, start + 1, &source), + ) + }) + .collect() + } + + fn span() -> Span { + Span::unknown() + } + + #[test] + fn a_lone_operand_is_not_wrapped_in_a_link() { + let folded = fold_left("expr", &span(), operands(1), Vec::::new(), operand, link); + assert_eq!(folded, Ok(Chain::Operand(1))); + let folded = fold_right("expr", &span(), operands(1), Vec::::new(), operand, link); + assert_eq!(folded, Ok(Chain::Operand(1))); + } + + #[test] + fn a_left_fold_nests_the_earlier_operands_deeper() { + let folded = fold_left("expr", &span(), operands(3), vec!['+', '-'], operand, link).expect("three operands"); + let Chain::Link(outer) = folded else { + panic!("three operands fold into a link"); + }; + assert_eq!(outer.op, '-'); + assert_eq!(outer.rhs, Chain::Operand(3)); + let Chain::Link(inner) = outer.lhs else { + panic!("the left side of a left fold is the deeper chain"); + }; + assert_eq!(inner.op, '+'); + assert_eq!(inner.lhs, Chain::Operand(1)); + assert_eq!(inner.rhs, Chain::Operand(2)); + } + + #[test] + fn a_right_fold_nests_the_later_operands_deeper() { + let folded = fold_right("expr", &span(), operands(3), vec!['+', '-'], operand, link).expect("three operands"); + let Chain::Link(outer) = folded else { + panic!("three operands fold into a link"); + }; + assert_eq!(outer.op, '+'); + assert_eq!(outer.lhs, Chain::Operand(1)); + let Chain::Link(inner) = outer.rhs else { + panic!("the right side of a right fold is the deeper chain"); + }; + assert_eq!(inner.op, '-'); + assert_eq!(inner.lhs, Chain::Operand(2)); + assert_eq!(inner.rhs, Chain::Operand(3)); + } + + #[test] + fn each_link_covers_everything_below_it() { + let folded = fold_left("expr", &span(), operands(3), vec!['+', '-'], operand, link).expect("three operands"); + let Chain::Link(outer) = folded else { + panic!("three operands fold into a link"); + }; + // "1+2+3": the outer link spans all five characters, the inner one the first three. + assert_eq!((outer.span.start(), outer.span.end()), (0, 5)); + let Chain::Link(inner) = &outer.lhs else { + panic!("the left side is the deeper chain"); + }; + assert_eq!((inner.span.start(), inner.span.end()), (0, 3)); + assert_eq!(outer.span.text().as_deref(), Some("1+2+3")); + } + + #[test] + fn a_right_fold_merges_the_same_extents() { + let folded = fold_right("expr", &span(), operands(3), vec!['+', '-'], operand, link).expect("three operands"); + let Chain::Link(outer) = folded else { + panic!("three operands fold into a link"); + }; + assert_eq!((outer.span.start(), outer.span.end()), (0, 5)); + let Chain::Link(inner) = &outer.rhs else { + panic!("the right side is the deeper chain"); + }; + assert_eq!((inner.span.start(), inner.span.end()), (2, 5)); + } + + #[test] + fn a_node_with_no_operand_names_the_rule() { + assert_eq!( + check_fold_arity(0, 0, "expr", &span()).unwrap_err().message, + "rule \"expr\": a fold needs at least one operand, but the node has none" + ); + let folded = fold_left("expr", &span(), Vec::<(i64, Span)>::new(), Vec::::new(), operand, link); + assert_eq!( + folded.unwrap_err().message, + "rule \"expr\": a fold needs at least one operand, but the node has none" + ); + let folded = fold_right("expr", &span(), Vec::<(i64, Span)>::new(), Vec::::new(), operand, link); + assert!(folded.is_err()); + } + + #[test] + fn a_fold_refuses_a_run_the_interleaving_does_not_fit() { + // Neither surplus is dropped to fit the shorter run: a chain missing an operand — or an + // operator — is not the value the caller handed over. + let surplus_operators = fold_left("expr", &span(), operands(2), vec!['+', '-'], operand, link); + assert_eq!( + surplus_operators.unwrap_err().message, + "rule \"expr\": a fold over 2 operand(s) needs 1 operator(s), but the node has 2" + ); + let surplus_operands = fold_left("expr", &span(), operands(3), vec!['+'], operand, link); + assert_eq!( + surplus_operands.unwrap_err().message, + "rule \"expr\": a fold over 3 operand(s) needs 2 operator(s), but the node has 1" + ); + let surplus_operators = fold_right("expr", &span(), operands(2), vec!['+', '-'], operand, link); + assert!(surplus_operators.is_err()); + let surplus_operands = fold_right("expr", &span(), operands(3), vec!['+'], operand, link); + assert!(surplus_operands.is_err()); + } + + #[test] + fn the_operator_count_has_to_sit_between_the_operands() { + assert_eq!(check_fold_arity(1, 0, "expr", &span()), Ok(())); + assert_eq!(check_fold_arity(3, 2, "expr", &span()), Ok(())); + assert_eq!( + check_fold_arity(3, 1, "expr", &span()).unwrap_err().message, + "rule \"expr\": a fold over 3 operand(s) needs 2 operator(s), but the node has 1" + ); + assert_eq!( + check_fold_arity(1, 4, "expr", &span()).unwrap_err().message, + "rule \"expr\": a fold over 1 operand(s) needs 0 operator(s), but the node has 4" + ); + } + + #[test] + fn operands_from_two_sources_cannot_be_covered_by_one_span() { + let other = SourceText::from_str("9", None); + let mut mixed = operands(2); + mixed[1].1 = Span::new_with_source(0, 1, &other); + let error = fold_left("expr", &span(), mixed, vec!['+'], operand, link).unwrap_err(); + assert_eq!( + error.message, + "rule \"expr\": the operands of a fold come from different sources, so their spans cannot merge" + ); + } + + #[test] + fn a_long_chain_folds_without_recursing() { + // The loop is iterative; only the eventual drop of the chain is not, which is why this + // stays at a depth ordinary drop glue survives. + let count = 1000; + let operators = vec!['+'; count - 1]; + let folded = fold_left("expr", &span(), operands(count), operators, operand, link).expect("a long chain"); + let mut depth = 0; + let mut node = &folded; + while let Chain::Link(current) = node { + depth += 1; + node = ¤t.lhs; + } + assert_eq!(depth, count - 1); + assert_eq!(node, &Chain::Operand(1)); + } +} diff --git a/crates/fltk-ast-core/src/lib.rs b/crates/fltk-ast-core/src/lib.rs new file mode 100644 index 0000000..09a644d --- /dev/null +++ b/crates/fltk-ast-core/src/lib.rs @@ -0,0 +1,98 @@ +//! `fltk-ast-core`: the pyo3-free runtime for FLTK's generated AST layer. +//! +//! A generated `ast.rs` names this crate by absolute path (`::fltk_ast_core::AstError`), so +//! a rule called `error` or `span` cannot collide with anything a preamble imported. The +//! crate is the Rust counterpart of `fltk/fegen/pyrt/astrt.py`: the two are written against +//! one model, and a value that converts, rejects, or renders one way on one backend does so +//! the same way on the other. +//! +//! What lives here: +//! +//! - [`AstError`] and [`ParseToAstError`], the failures conversion and the `parse_str` +//! convenience report. +//! - [`FromCst`] / [`ToCst`], the traits a `custom(...)` rule's user type implements so +//! generated converters can reach it. +//! - The child-reading helpers ([`one`], [`optional`], [`presence`], [`text`], [`node_text`], +//! [`unexpected_child`], [`duplicate_key`]) a generated `from_cst` asks about the children +//! it collected under one label. +//! - [`check_fold_arity`], [`fold_left`] and [`fold_right`], which turn a fold rule's flat run of +//! operands and operators into the nested chain its AST type is, and [`against_direction`], +//! which refuses a chain the grammar has no shape to render. +//! - [`TerminalPattern`], [`LazyTerminal`] and [`validate_terminal`], which keep serialization +//! honest: text that would not re-parse is refused rather than written out. +//! - [`TerminalShape`], the other half of that honesty in the serialize direction: it splits a +//! terminal-only rule's text back across the grammar items it was read from. +//! - [`Cursor`] and its companions ([`check_group`], [`alternative_fits`], [`filled`], +//! [`check_consumed`], [`hoisted`], [`wrapper_needed`]), which hand a field's values to the item +//! positions that can carry them and name the shapes the grammar cannot accommodate, plus +//! [`unrenderable`], which the `unparse_str` convenience reports when the formatter declines a +//! synthesised CST. +//! - The [`scalar`] coercions: one strict parse and one canonical rendering per `type:` +//! builtin, gated so that both backends accept the same lexemes and render the same +//! bytes. +//! - [`IndexMap`], and the two third-party scalar types `Uuid` and `Decimal`, re-exported so +//! generated code names one version of each. +//! +//! It has no pyo3 dependency (pyo3-freedom is a structural absence, matching +//! `fltk-parser-core` and `fltk-unparser-core`). It depends on `fltk-cst-core` for +//! [`fltk_cst_core::Span`], which every AST node carries. +//! +//! # Features +//! +//! - `indexmap` (default-on): the container a `key:` keyed collection generates. A consumer +//! whose sidecar uses no `key:` statement can take this crate with +//! `default-features = false` and drop the dependency; a generated module that needs the +//! feature says so in its header comment. +//! - `uuid` / `decimal` (off by default): the `type: uuid` and `type: decimal` builtins, +//! which are the two whose value is a third-party type (`uuid::Uuid`, +//! `rust_decimal::Decimal`). A generated module using either names its feature in the +//! same header comment. + +mod children; +mod convert; +mod error; +mod fold; +pub mod scalar; +mod synth; +mod terminal; + +pub use children::{duplicate_key, node_text, one, optional, presence, text, unexpected_child}; +pub use convert::{FromCst, ToCst}; +pub use fold::{against_direction, check_fold_arity, fold_left, fold_right}; +pub use error::{AstError, ParseToAstError}; +pub use synth::{ + alternative_fits, check_consumed, check_group, filled, hoisted, populated, unplaceable, unrenderable, + wrapper_needed, Cursor, TerminalAlt, TerminalShape, TerminalSplit, UNBOUNDED, +}; +pub use terminal::{source_span, text_span, validate_terminal, LazyTerminal, TerminalPattern}; + +/// The insertion-ordered map a `key:` keyed collection generates. +/// +/// Re-exported rather than named directly by generated code so the generated module and this +/// runtime cannot end up on two versions of `indexmap`. +#[cfg(feature = "indexmap")] +pub use indexmap::IndexMap; + +/// The value of a `type: uuid;` coercion, as [`scalar::parse_uuid`] returns it. +/// +/// Re-exported for the same reason as [`IndexMap`]: a generated field naming `uuid::Uuid` +/// directly would be a different type from this crate's whenever the two resolve to different +/// versions of `uuid`, and the consumer's crate would then need the dependency of its own. +#[cfg(feature = "uuid")] +pub use uuid::Uuid; + +/// The value of a `type: decimal;` coercion, as [`scalar::parse_decimal`] returns it. +/// +/// Re-exported for the same reason as [`Uuid`]. +#[cfg(feature = "decimal")] +pub use rust_decimal::Decimal; + +// A generated field is typed by the re-export and filled by the coercion, so the two have to be +// one type. The coercion is the whole check, and it happens at compile time: a `#[test]` body +// asserting a value equals itself through an identity function reads like a runtime check while +// carrying none, so these are `const` items instead — they fail to compile if a re-export drifts. +#[cfg(feature = "uuid")] +const _UUID_RE_EXPORT_IS_WHAT_THE_COERCION_PRODUCES: fn(uuid::Uuid) -> Uuid = |value| value; + +#[cfg(feature = "decimal")] +const _DECIMAL_RE_EXPORT_IS_WHAT_THE_COERCION_PRODUCES: fn(rust_decimal::Decimal) -> Decimal = |value| value; diff --git a/crates/fltk-ast-core/src/scalar.rs b/crates/fltk-ast-core/src/scalar.rs new file mode 100644 index 0000000..4d2036b --- /dev/null +++ b/crates/fltk-ast-core/src/scalar.rs @@ -0,0 +1,576 @@ +//! Scalar coercions: the parse and canonical-render halves of a `type:` builtin. +//! +//! Every coercion passes a shared format gate before any native parse runs. The native +//! parses of the two backends are lax in different places — Rust's `f64::from_str` takes +//! `inf` and `NaN`, Python's `uuid.UUID` takes braced and URN spellings, Python's `int` +//! takes digit separators — so a gate written once is what makes both backends accept and +//! reject the same lexemes. These functions are the counterparts of the helpers in +//! `fltk.fegen.pyrt.astrt`, one for one. +//! +//! Rendering is the inverse: one canonical text per value, chosen so that both backends +//! render a given value to the same bytes and so that the text re-parses to the value it +//! came from. + +use std::str::FromStr; +use std::sync::LazyLock; + +use fltk_cst_core::Span; + +use crate::error::AstError; +use crate::terminal::TerminalPattern; + +/// Optional sign, then digits. Rejects the digit separators Python's `int` accepts. +static INTEGER_FORMAT: LazyLock = LazyLock::new(|| TerminalPattern::new("[+-]?[0-9]+")); + +/// Optional sign, digits with an optional fraction, or a bare fraction. The decimal gate +/// on its own, and the mantissa of the float gate. +const PLAIN_NUMBER: &str = r"[+-]?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)"; + +/// [`PLAIN_NUMBER`] with an optional exponent. Rejects the `inf`/`infinity`/`NaN` +/// spellings a native float parse accepts. +static FLOAT_FORMAT: LazyLock = + LazyLock::new(|| TerminalPattern::new(&format!("{PLAIN_NUMBER}(?:[eE][+-]?[0-9]+)?"))); + +/// Canonical 8-4-4-4-12 hex, case-insensitive. Braced and URN spellings are rejected. +#[cfg(feature = "uuid")] +static UUID_FORMAT: LazyLock = LazyLock::new(|| { + TerminalPattern::new("[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}") +}); + +/// A coercion failed on `text`, which is not `expected`. +fn coercion_error(text: &str, expected: &str, rule: &str, span: &Span) -> AstError { + AstError::new(format!("rule {rule:?}: {text:?} is not {expected}"), span.clone()) +} + +/// A rendered value is not `expected`. Unlike a parse failure the offender is a typed +/// value, so it renders through `Display` rather than as quoted text. +fn render_error(value: impl std::fmt::Display, expected: &str, rule: &str, span: &Span) -> AstError { + AstError::new(format!("rule {rule:?}: {value} is not {expected}"), span.clone()) +} + +/// `text`, once the gate has accepted it. +fn gated<'a>( + text: &'a str, + gate: &TerminalPattern, + expected: &str, + rule: &str, + span: &Span, +) -> Result<&'a str, AstError> { + if gate.matches(text) { + return Ok(text); + } + Err(coercion_error(text, expected, rule, span)) +} + +/// The gated text as an `i128`, range-checked against one width. +/// +/// Widening to `i128` keeps both backends agreeing on which lexemes are out of range: +/// `"-0"` is a valid `u8` of zero, and a magnitude past `u64::MAX` is a range failure +/// rather than a syntax error. +fn integer_value(text: &str, rule: &str, span: &Span, width: &str, low: i128, high: i128) -> Result { + let accepted = gated(text, &INTEGER_FORMAT, &format!("a valid {width}"), rule, span)?; + let out_of_range = || coercion_error(text, &format!("in range for {width} ({low} to {high})"), rule, span); + let value = i128::from_str(accepted).map_err(|_| out_of_range())?; + if value < low || value > high { + return Err(out_of_range()); + } + Ok(value) +} + +macro_rules! integer_coercion { + ($name:ident, $ty:ty, $width:literal) => { + #[doc = concat!("Coerce a terminal's text to an `", $width, "`.")] + pub fn $name(text: &str, rule: &str, span: &Span) -> Result<$ty, AstError> { + let value = integer_value( + text, + rule, + span, + $width, + i128::from(<$ty>::MIN), + i128::from(<$ty>::MAX), + )?; + Ok(<$ty>::try_from(value).expect("integer_value range-checks against this width")) + } + }; +} + +integer_coercion!(parse_i8, i8, "i8"); +integer_coercion!(parse_i16, i16, "i16"); +integer_coercion!(parse_i32, i32, "i32"); +integer_coercion!(parse_i64, i64, "i64"); +integer_coercion!(parse_u8, u8, "u8"); +integer_coercion!(parse_u16, u16, "u16"); +integer_coercion!(parse_u32, u32, "u32"); +integer_coercion!(parse_u64, u64, "u64"); + +/// The gated text as an `f64`, before any narrowing. +/// +/// A magnitude past `f64::MAX` parses to infinity; the caller rejects it, so overflow is +/// reported as a range failure rather than a malformed lexeme. +fn float_value(text: &str, rule: &str, span: &Span, width: &str) -> Result { + let expected = format!("a valid {width}"); + let accepted = gated(text, &FLOAT_FORMAT, &expected, rule, span)?; + f64::from_str(accepted).map_err(|_| coercion_error(text, &expected, rule, span)) +} + +/// Coerce a terminal's text to an `f64`. +/// +/// An infinity is out of range rather than a value: the gate rejects the `inf` lexeme, so +/// accepting one by overflow would make a value with no spelling to render back to. +pub fn parse_f64(text: &str, rule: &str, span: &Span) -> Result { + let value = float_value(text, rule, span, "f64")?; + if !value.is_finite() { + return Err(coercion_error(text, "in range for f64", rule, span)); + } + Ok(value) +} + +/// Coerce a terminal's text to an `f32`. +/// +/// The text is read at 64 bits and then narrowed, so a lexeme that rounds differently +/// through 64 bits lands on the same value on both backends. +pub fn parse_f32(text: &str, rule: &str, span: &Span) -> Result { + let narrowed = float_value(text, rule, span, "f32")? as f32; + if !narrowed.is_finite() { + return Err(coercion_error(text, "in range for f32", rule, span)); + } + Ok(narrowed) +} + +/// An `f64` coercion's canonical text. +pub fn render_f64(value: f64, rule: &str, span: &Span) -> Result { + if !value.is_finite() { + return Err(render_error(value, "a finite float", rule, span)); + } + Ok(canonical_float(&format!("{value:e}"))) +} + +/// An `f32` coercion's canonical text: the shortest spelling that round-trips *at 32 bits*. +/// +/// The field is an `f32`, so the value is already what the width holds and the shortest +/// spelling of it is shorter than the same number's `f64` spelling — which is what keeps a +/// parsed `3.14` rendering as `3.14` rather than in seventeen digits. +pub fn render_f32(value: f32, rule: &str, span: &Span) -> Result { + if !value.is_finite() { + return Err(render_error(value, "a finite float", rule, span)); + } + Ok(canonical_float(&format!("{value:e}"))) +} + +/// Rust's exponential form respelled the way CPython's `repr` spells a float. +/// +/// The input is `[-]d[.ddd]e[-]dd`, whose digits are already the shortest decimal that +/// round-trips the value at its own width. Only the layout differs between the two +/// languages: CPython switches to exponent notation outside a fixed decimal-point window +/// and pads the exponent to two digits, and an integral value keeps a trailing `.0`. +fn canonical_float(exponential: &str) -> String { + let (sign, rest) = match exponential.strip_prefix('-') { + Some(rest) => ("-", rest), + None => ("", exponential), + }; + let (mantissa, exponent) = rest + .split_once('e') + .expect("Rust's exponential float format always carries an exponent"); + let exponent: i32 = exponent.parse().expect("the exponent is a decimal integer"); + let digits: String = mantissa.chars().filter(|c| *c != '.').collect(); + + // Where the decimal point falls, counted in digits from the left. + let point = exponent + 1; + if point <= -4 || point > 16 { + let mut out = format!("{sign}{}", &digits[..1]); + if digits.len() > 1 { + out.push('.'); + out.push_str(&digits[1..]); + } + let exponent = point - 1; + let symbol = if exponent < 0 { '-' } else { '+' }; + out.push_str(&format!("e{symbol}{:02}", exponent.abs())); + return out; + } + if point <= 0 { + let zeros = "0".repeat(usize::try_from(-point).expect("a non-negative count")); + return format!("{sign}0.{zeros}{digits}"); + } + let point = usize::try_from(point).expect("a positive count"); + if point >= digits.len() { + let zeros = "0".repeat(point - digits.len()); + return format!("{sign}{digits}{zeros}.0"); + } + format!("{sign}{}.{}", &digits[..point], &digits[point..]) +} + +/// Coerce a terminal's text to a UUID, in the canonical 8-4-4-4-12 spelling only. +#[cfg(feature = "uuid")] +pub fn parse_uuid(text: &str, rule: &str, span: &Span) -> Result { + let expected = "a canonical 8-4-4-4-12 UUID"; + let accepted = gated(text, &UUID_FORMAT, expected, rule, span)?; + uuid::Uuid::parse_str(accepted).map_err(|_| coercion_error(text, expected, rule, span)) +} + +/// A UUID coercion's canonical text: lowercase, hyphenated. +#[cfg(feature = "uuid")] +pub fn render_uuid(value: &uuid::Uuid) -> String { + value.hyphenated().to_string() +} + +/// [`PLAIN_NUMBER`]: the float gate without its exponent. +#[cfg(feature = "decimal")] +static DECIMAL_FORMAT: LazyLock = LazyLock::new(|| TerminalPattern::new(PLAIN_NUMBER)); + +/// The domain of the decimal type: a 96-bit mantissa scaled by at most 10^28. +/// +/// Wider than this is refused rather than rounded, because a rounded value would render +/// back to different text than it was read from. Both backends narrow to this domain so +/// a `type: decimal` lexeme one accepts is never one the other refuses. +#[cfg(feature = "decimal")] +pub const DECIMAL_DOMAIN: &str = "a decimal of at most 28 fractional digits and 96 bits of mantissa"; + +/// Coerce a terminal's text to a decimal; exponent forms are not accepted. +#[cfg(feature = "decimal")] +pub fn parse_decimal(text: &str, rule: &str, span: &Span) -> Result { + let accepted = gated(text, &DECIMAL_FORMAT, "a plain decimal number", rule, span)?; + // A trailing point is significant to the gate and not to the decimal parser. + let trimmed = accepted.strip_suffix('.').unwrap_or(accepted); + rust_decimal::Decimal::from_str_exact(trimmed).map_err(|_| coercion_error(text, DECIMAL_DOMAIN, rule, span)) +} + +/// A decimal coercion's canonical text: plain notation, keeping the value's scale. +#[cfg(feature = "decimal")] +pub fn render_decimal(value: &rust_decimal::Decimal) -> String { + value.to_string() +} + +/// Coerce a terminal's text through a `type: custom(...)` parse function. +/// +/// The contract is an `Err(String)` on bad input, which becomes the message of an error +/// carrying the node's span — the function itself has no way to know where its text came +/// from. +pub fn parse_custom( + parse: impl FnOnce(&str) -> Result, + text: &str, + rule: &str, + span: &Span, +) -> Result { + parse(text).map_err(|error| AstError::new(format!("rule {rule:?}: {error}"), span.clone())) +} + +#[cfg(test)] +// Intentional: these lints police float literals a reader might have meant differently, but +// here the literal *is* the case — `3.14` is the value whose rendering is asserted, not an +// approximation of pi, and `123456.789` is asserted precisely because 32 bits cannot hold it. +#[allow(clippy::approx_constant, clippy::excessive_precision)] +mod tests { + use super::*; + use fltk_cst_core::SourceText; + + fn span() -> Span { + Span::unknown() + } + + #[test] + fn every_width_reads_its_own_range() { + assert_eq!(parse_i8("-128", "n", &span()), Ok(-128)); + assert_eq!(parse_i8("127", "n", &span()), Ok(127)); + assert_eq!(parse_i16("-32768", "n", &span()), Ok(-32768)); + assert_eq!(parse_i32("2147483647", "n", &span()), Ok(2147483647)); + assert_eq!(parse_i64("-9223372036854775808", "n", &span()), Ok(i64::MIN)); + assert_eq!(parse_u8("255", "n", &span()), Ok(255)); + assert_eq!(parse_u16("65535", "n", &span()), Ok(65535)); + assert_eq!(parse_u32("4294967295", "n", &span()), Ok(4294967295)); + assert_eq!(parse_u64("18446744073709551615", "n", &span()), Ok(u64::MAX)); + } + + #[test] + fn a_leading_plus_and_leading_zeros_are_accepted() { + assert_eq!(parse_i32("+42", "n", &span()), Ok(42)); + assert_eq!(parse_u8("007", "n", &span()), Ok(7)); + // Negative zero is in range for an unsigned width. + assert_eq!(parse_u8("-0", "n", &span()), Ok(0)); + } + + #[test] + fn the_gate_rejects_what_a_native_parse_would_take() { + for text in ["1_000", " 42", "42 ", "0x2a", "", "4.0", "1e3", "+", "inf"] { + let error = parse_i32(text, "n", &span()).unwrap_err(); + assert_eq!( + error.message, + format!("rule \"n\": {text:?} is not a valid i32"), + "for {text:?}" + ); + } + } + + #[test] + fn out_of_range_names_the_width_and_its_bounds() { + let error = parse_i8("128", "count", &span()).unwrap_err(); + assert_eq!( + error.message, + "rule \"count\": \"128\" is not in range for i8 (-128 to 127)" + ); + assert_eq!( + parse_u8("-1", "count", &span()).unwrap_err().message, + "rule \"count\": \"-1\" is not in range for u8 (0 to 255)" + ); + } + + #[test] + fn a_magnitude_past_every_width_is_still_a_range_failure() { + // Wider than i128 itself, so the widened parse is what fails, not the comparison. + let text = "9".repeat(60); + let error = parse_u64(&text, "n", &span()).unwrap_err(); + assert!( + error.message.contains("in range for u64 (0 to 18446744073709551615)"), + "{}", + error.message + ); + } + + #[test] + fn a_coercion_error_carries_the_nodes_span() { + let source = SourceText::from_str("x = 300", None); + let error = parse_i8("300", "n", &Span::new_with_source(4, 7, &source)).unwrap_err(); + assert_eq!(error.to_string(), format!("{} at line 1, column 5", error.message)); + } + + #[test] + fn floats_read_the_forms_the_gate_allows() { + assert_eq!(parse_f64("3.14", "r", &span()), Ok(3.14)); + assert_eq!(parse_f64("-0.5", "r", &span()), Ok(-0.5)); + assert_eq!(parse_f64("+2.", "r", &span()), Ok(2.0)); + assert_eq!(parse_f64(".5", "r", &span()), Ok(0.5)); + assert_eq!(parse_f64("1e3", "r", &span()), Ok(1000.0)); + assert_eq!(parse_f64("1E-3", "r", &span()), Ok(0.001)); + assert_eq!(parse_f64("42", "r", &span()), Ok(42.0)); + } + + #[test] + fn the_float_gate_rejects_the_non_finite_spellings() { + for text in ["inf", "-inf", "infinity", "NaN", "nan", "1_0.5", "0x1p3", ""] { + let error = parse_f64(text, "r", &span()).unwrap_err(); + assert_eq!( + error.message, + format!("rule \"r\": {text:?} is not a valid f64"), + "for {text:?}" + ); + } + } + + #[test] + fn an_overflowing_magnitude_is_out_of_range_for_its_width() { + assert_eq!( + parse_f64("1e400", "r", &span()).unwrap_err().message, + "rule \"r\": \"1e400\" is not in range for f64" + ); + assert_eq!( + parse_f32("1e40", "r", &span()).unwrap_err().message, + "rule \"r\": \"1e40\" is not in range for f32" + ); + // The same text is an ordinary f64. + assert_eq!(parse_f64("1e40", "r", &span()), Ok(1e40)); + } + + #[test] + fn an_f32_holds_what_the_narrower_width_holds() { + assert_eq!(parse_f32("3.14", "r", &span()), Ok(3.14f32)); + assert_eq!(f64::from(parse_f32("0.1", "r", &span()).unwrap()), 0.10000000149011612); + // Subnormals survive; only an overflow is refused. + assert!(parse_f32("1e-45", "r", &span()).unwrap() > 0.0); + } + + #[test] + fn f64_rendering_is_cpython_repr() { + // The same value/text pairs are asserted against the Python renderer by + // `F64_RENDERINGS` in `fltk/fegen/test_gsm2ast.py`; the two tables must stay in step. + let cases: &[(f64, &str)] = &[ + (0.0, "0.0"), + (-0.0, "-0.0"), + (1.0, "1.0"), + (3.14, "3.14"), + (0.1, "0.1"), + (-2.75, "-2.75"), + (123456.789, "123456.789"), + (1e15, "1000000000000000.0"), + (1e16, "1e+16"), + (1e17, "1e+17"), + (1e22, "1e+22"), + (1e-4, "0.0001"), + (1e-5, "1e-05"), + (1.5e300, "1.5e+300"), + (2.5e-300, "2.5e-300"), + (5e-324, "5e-324"), + (f64::MAX, "1.7976931348623157e+308"), + ]; + for (value, expected) in cases { + assert_eq!(render_f64(*value, "r", &span()).as_deref(), Ok(*expected), "for {value:?}"); + } + } + + #[test] + fn f32_rendering_is_the_shortest_spelling_at_32_bits() { + // Mirrored by `F32_RENDERINGS` in `fltk/fegen/test_gsm2ast.py`, row for row. + let cases: &[(f32, &str)] = &[ + (0.0, "0.0"), + (1.0, "1.0"), + (3.14, "3.14"), + (0.1, "0.1"), + (1e15, "1000000000000000.0"), + (1e16, "1e+16"), + (1e-5, "1e-05"), + (123456.789, "123456.79"), + (16777216.0, "16777216.0"), + (f32::MAX, "3.4028235e+38"), + (f32::MIN_POSITIVE, "1.1754944e-38"), + ]; + for (value, expected) in cases { + assert_eq!(render_f32(*value, "r", &span()).as_deref(), Ok(*expected), "for {value:?}"); + } + } + + #[test] + fn a_parsed_float_renders_back_to_the_text_it_came_from() { + for text in ["0.0", "3.14", "0.1", "123456.789", "1e+16", "1e-05", "-2.75"] { + let value = parse_f64(text, "r", &span()).unwrap(); + assert_eq!(render_f64(value, "r", &span()).as_deref(), Ok(text), "for {text:?}"); + } + for text in ["0.0", "3.14", "0.1", "1e+16", "1e-05"] { + let value = parse_f32(text, "r", &span()).unwrap(); + assert_eq!(render_f32(value, "r", &span()).as_deref(), Ok(text), "for {text:?}"); + } + } + + #[test] + fn a_wide_spelling_renders_short_at_the_narrow_width() { + // The f64-exact spelling of 3.14 rounds to the same f32 as "3.14" does. + let value = parse_f32("3.140000104904175", "r", &span()).unwrap(); + assert_eq!(render_f32(value, "r", &span()).as_deref(), Ok("3.14")); + // At 64 bits the same text is a distinct value and keeps its digits. + let wide = parse_f64("3.140000104904175", "r", &span()).unwrap(); + assert_eq!(render_f64(wide, "r", &span()).as_deref(), Ok("3.140000104904175")); + } + + #[test] + fn a_non_finite_value_has_no_canonical_text() { + assert_eq!( + render_f64(f64::INFINITY, "r", &span()).unwrap_err().message, + "rule \"r\": inf is not a finite float" + ); + assert!(render_f32(f32::NAN, "r", &span()).is_err()); + assert!(render_f32(f32::NEG_INFINITY, "r", &span()).is_err()); + } + + #[test] + fn a_custom_parse_functions_message_becomes_the_error() { + fn parse_money(text: &str) -> Result { + text.strip_prefix('$') + .ok_or_else(|| format!("{text:?} is not an amount")) + .and_then(|rest| rest.parse::().map_err(|e| e.to_string())) + } + assert_eq!(parse_custom(parse_money, "$12", "money", &span()), Ok(12)); + let error = parse_custom(parse_money, "12", "money", &span()).unwrap_err(); + assert_eq!(error.message, "rule \"money\": \"12\" is not an amount"); + } + + #[test] + fn a_custom_parse_failure_carries_the_nodes_span() { + let source = SourceText::from_str("pay 12", None); + let error = parse_custom( + |_: &str| Err::("bad".to_string()), + "12", + "money", + &Span::new_with_source(4, 6, &source), + ) + .unwrap_err(); + assert_eq!(error.to_string(), "rule \"money\": bad at line 1, column 5"); + } + + #[cfg(feature = "uuid")] + #[test] + fn a_uuid_reads_in_the_canonical_spelling_only() { + let text = "F81D4FAE-7DEC-11D0-A765-00A0C91E6BF6"; + let value = parse_uuid(text, "id", &span()).unwrap(); + assert_eq!(render_uuid(&value), text.to_lowercase()); + for rejected in [ + "{f81d4fae-7dec-11d0-a765-00a0c91e6bf6}", + "urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6", + "f81d4fae7dec11d0a76500a0c91e6bf6", + "f81d4fae-7dec-11d0-a765-00a0c91e6bf", + "", + ] { + let error = parse_uuid(rejected, "id", &span()).unwrap_err(); + assert_eq!( + error.message, + format!("rule \"id\": {rejected:?} is not a canonical 8-4-4-4-12 UUID"), + "for {rejected:?}" + ); + } + } + + #[cfg(feature = "uuid")] + #[test] + fn a_uuid_round_trips_through_its_canonical_text() { + let text = "00000000-0000-0000-0000-000000000000"; + assert_eq!(render_uuid(&parse_uuid(text, "id", &span()).unwrap()), text); + } + + #[cfg(feature = "decimal")] + #[test] + fn a_decimal_keeps_its_scale_through_a_round_trip() { + for text in ["1.50", "0.0", "-3", "12345.6789", "0.000001"] { + let value = parse_decimal(text, "amount", &span()).unwrap(); + assert_eq!(render_decimal(&value), text, "for {text:?}"); + } + } + + #[cfg(feature = "decimal")] + #[test] + fn a_negative_zero_decimal_renders_unsigned() { + // The sign carries no value; both backends normalize to the same unsigned bytes. + for (text, expected) in [("-0", "0"), ("-0.0", "0.0"), ("-0.00", "0.00")] { + let value = parse_decimal(text, "amount", &span()).unwrap(); + assert_eq!(render_decimal(&value), expected, "for {text:?}"); + } + } + + #[cfg(feature = "decimal")] + #[test] + fn a_decimals_leading_plus_and_trailing_point_normalize() { + assert_eq!(render_decimal(&parse_decimal("+1.5", "a", &span()).unwrap()), "1.5"); + assert_eq!(render_decimal(&parse_decimal("007.5", "a", &span()).unwrap()), "7.5"); + assert_eq!(render_decimal(&parse_decimal("5.", "a", &span()).unwrap()), "5"); + } + + #[cfg(feature = "decimal")] + #[test] + fn the_decimal_gate_rejects_exponent_forms() { + for text in ["1e3", "1E3", "inf", "1_0", ""] { + let error = parse_decimal(text, "amount", &span()).unwrap_err(); + assert_eq!( + error.message, + format!("rule \"amount\": {text:?} is not a plain decimal number"), + "for {text:?}" + ); + } + } + + #[cfg(feature = "decimal")] + #[test] + fn a_decimal_too_wide_to_hold_exactly_is_refused_not_rounded() { + let text = "1.00000000000000000000000000000001"; + let error = parse_decimal(text, "amount", &span()).unwrap_err(); + assert_eq!(error.message, format!("rule \"amount\": {text:?} is not {DECIMAL_DOMAIN}")); + } + + #[cfg(feature = "decimal")] + #[test] + fn the_edges_of_the_decimal_domain() { + // 2^96 - 1 fits the mantissa; one more does not. + assert!(parse_decimal("79228162514264337593543950335", "a", &span()).is_ok()); + assert!(parse_decimal("79228162514264337593543950336", "a", &span()).is_err()); + // 28 fractional digits are the most a scale can hold; a 29th is not. + assert!(parse_decimal("0.0000000000000000000000000001", "a", &span()).is_ok()); + assert!(parse_decimal("0.00000000000000000000000000001", "a", &span()).is_err()); + // Trailing zeros count toward both bounds, being part of the scale and the mantissa. + assert!(parse_decimal("1.0000000000000000000000000000", "a", &span()).is_ok()); + assert!(parse_decimal("7922816251426433759354395033.5", "a", &span()).is_ok()); + } +} diff --git a/crates/fltk-ast-core/src/synth.rs b/crates/fltk-ast-core/src/synth.rs new file mode 100644 index 0000000..9c4252d --- /dev/null +++ b/crates/fltk-ast-core/src/synth.rs @@ -0,0 +1,620 @@ +//! Synthesis: rebuilding the CST an AST value stands for. +//! +//! `to_cst` walks one alternative's item positions in grammar order and appends exactly what the +//! parser would have appended there. Most of that walk is generated code, because it names the +//! CST node types, labels and child variants of one grammar. What lives here is the part that is +//! the same for every grammar: splitting a terminal-only rule's text back across the items it +//! was read from. +//! +//! A terminal-only rule carries text and nothing else, so the split is the inverse of reading +//! the node's own span: the alternative is spelled as one regex with a capture group per +//! included regex item, and each group's slice becomes a child span carrying its own source. +//! A literal item's text is a grammar constant, so its child carries position only. +//! +//! Every other node form holds fields instead, and the walk hands each field's values to the item +//! positions that can carry them: [`Cursor`] is that distribution, and [`check_group`], +//! [`alternative_fits`], [`filled`], [`check_consumed`], [`hoisted`] and [`wrapper_needed`] are +//! the questions a body asks about values whose shape the grammar cannot accommodate. Each has a +//! counterpart of the same name in `fltk.fegen.pyrt.astrt`, and the message templates are one +//! text under the translation `tests/test_ast_error_message_parity.py` enforces. + +use std::sync::OnceLock; + +use fltk_cst_core::Span; + +use crate::error::AstError; +use crate::terminal::{source_span, TerminalPattern}; + +/// The upper bound of an item position the grammar sets no limit on. +pub const UNBOUNDED: usize = usize::MAX; + +/// One alternative of a terminal-only rule, as a single regex over the node's text. +#[derive(Debug)] +pub struct TerminalAlt { + /// The whole alternative as one regex, or `None` when its shape is not rebuildable. + /// + /// A repeated included item, a sub-expression or a rule reference leaves no determined split: + /// one regex cannot say which slice of the text each occurrence took. + pub pattern: Option<&'static str>, + + /// Per included item, in grammar order, the capture group holding that item's text. + /// + /// `None` is a literal: its text comes back from the grammar rather than from the value, so + /// the child it contributes carries position only. + pub groups: &'static [Option<&'static str>], +} + +/// A terminal-only rule's alternatives, compiled on first use. +/// +/// [`new`](TerminalShape::new) is `const`, so a generated module declares one `static` per rule +/// and pays for the regex compilation only if something actually serializes that rule. +#[derive(Debug)] +pub struct TerminalShape { + alternatives: &'static [TerminalAlt], + compiled: OnceLock>>, +} + +/// Which alternative a node's text came from, and what each of its items takes. +#[derive(Debug, Clone, PartialEq)] +pub struct TerminalSplit { + /// The index of the matched alternative, in grammar order. + pub alternative: usize, + + /// One span per included item of that alternative, in grammar order. + pub spans: Vec, +} + +impl TerminalShape { + /// Declare the alternatives of one terminal-only rule. + pub const fn new(alternatives: &'static [TerminalAlt]) -> Self { + Self { + alternatives, + compiled: OnceLock::new(), + } + } + + fn compiled(&self) -> &[Option] { + self.compiled + .get_or_init(|| { + self.alternatives + .iter() + .map(|alternative| alternative.pattern.map(TerminalPattern::new)) + .collect() + }) + .as_slice() + } + + /// Split `text` across the items of the first alternative that matches all of it. + /// + /// Alternatives are tried in grammar order, which is the order the parser would have tried + /// them in, so a text two alternatives could have matched comes back as the one the parse + /// would have produced. + pub fn split(&self, text: &str, rule: &str) -> Result { + if self.alternatives.iter().all(|alternative| alternative.pattern.is_none()) { + // Must stay on one line: the parity test matches this template verbatim. + return Err(AstError::new( + format!("rule {rule:?}: the rule's shape cannot be rebuilt from text — every alternative holds a repeated terminal, a sub-expression or a rule reference, so no split of the text back into children is determined; restructure the rule or convert it by hand"), + Span::unknown(), + )); + } + for (index, (alternative, compiled)) in self.alternatives.iter().zip(self.compiled()).enumerate() { + let Some(pattern) = compiled else { + continue; + }; + let regex = pattern.regex(); + let mut captures = regex.create_captures(); + regex.captures(text, &mut captures); + if !captures.is_match() { + continue; + } + let spans = alternative + .groups + .iter() + .map(|group| match group { + None => Span::unknown(), + Some(name) => { + let matched = captures + .get_group_by_name(name) + .expect("every group the plan names wraps a required item of the same pattern"); + source_span(&text[matched.start..matched.end]) + } + }) + .collect(); + return Ok(TerminalSplit { + alternative: index, + spans, + }); + } + Err(AstError::new( + format!("rule {rule:?}: text {text:?} is not something the rule could have matched"), + Span::unknown(), + )) + } +} + +/// One field's values, handed out to the item positions that can carry them. +/// +/// Each position takes as many values as its quantifier allows, leaving behind whatever later +/// required positions for the same label still need. A position that can hold only some of the +/// values — one branch of a sub-expression alternation — takes them through +/// [`take_if`](Cursor::take_if), which is how the branches share one label. +#[derive(Debug)] +pub struct Cursor<'a, T: ?Sized> { + values: Vec<&'a T>, + position: usize, +} + +impl<'a, T: ?Sized> Cursor<'a, T> { + /// A cursor over one field's values, in the order the field holds them. + pub fn new(values: Vec<&'a T>) -> Self { + Self { values, position: 0 } + } + + /// Up to `maximum` values, leaving `reserve` of them to the positions after this one. + pub fn take(&mut self, maximum: usize, reserve: usize) -> Vec<&'a T> { + self.take_if(maximum, reserve, |_value| true) + } + + /// [`take`](Cursor::take), stopping at the first value this position cannot hold. + pub fn take_if(&mut self, maximum: usize, reserve: usize, accepts: impl Fn(&T) -> bool) -> Vec<&'a T> { + let mut taken = Vec::new(); + while taken.len() < maximum && self.remaining() > reserve && accepts(self.values[self.position]) { + taken.push(self.values[self.position]); + self.position += 1; + } + taken + } + + /// How many values no position has taken yet. + pub fn remaining(&self) -> usize { + self.values.len() - self.position + } +} + +/// The labels of `states` that carry something, for alternative and branch selection. +pub fn populated<'a>(states: &[(&'a str, bool)]) -> Vec<&'a str> { + states + .iter() + .filter(|(_label, state)| *state) + .map(|(label, _state)| *label) + .collect() +} + +/// Whether an alternative can carry exactly the populated fields. +pub fn alternative_fits(present: &[&str], required: &[&str], labels: &[&str]) -> bool { + required.iter().all(|label| present.contains(label)) && present.iter().all(|label| labels.contains(label)) +} + +/// The values an item position took, once its own lower bound is known to be met. +/// +/// A required position left empty would put a CST missing a required child in front of the +/// formatter, which can only report that something is wrong with the whole node; the shortfall is +/// the user's data and is named here instead. +pub fn filled(available: usize, minimum: usize, rule: &str, label: &str) -> Result<(), AstError> { + if available < minimum { + return Err(AstError::new( + format!( + "rule {rule:?}: the grammar needs {minimum} {label:?} value(s) at this position, but {available} were available" + ), + Span::unknown(), + )); + } + Ok(()) +} + +/// Every field value must have found an item position to occupy. +pub fn check_consumed(rule: &str, label: &str, remaining: usize) -> Result<(), AstError> { + if remaining > 0 { + return Err(AstError::new( + format!("rule {rule:?}: the grammar has no place for {remaining} more {label:?} value(s)"), + Span::unknown(), + )); + } + Ok(()) +} + +/// No branch of an alternation can carry this value. +/// +/// `kind` names the type of the value that arrived, which is what the position rejected: on this +/// backend that is the field's declared Rust type, where the Python backend names the runtime +/// class of the value. +pub fn unplaceable(rule: &str, label: &str, kind: &str) -> AstError { + AstError::new( + format!("rule {rule:?}: no item position accepts a {kind} value for {label:?}"), + Span::unknown(), + ) +} + +/// One field a flattened wrapper requires, checked before the wrapper is rebuilt. +pub fn hoisted<'a, T>(value: Option<&'a T>, rule: &str, field: &str) -> Result<&'a T, AstError> { + value.ok_or_else(|| { + AstError::new( + format!( + "rule {rule:?}: the flattened wrapper needs a {field:?} value, but it is absent; populate it, or leave every field hoisted out of the wrapper empty" + ), + Span::unknown(), + ) + }) +} + +/// Whether an optional `flatten;` wrapper has to be rebuilt around its hoisted fields. +/// +/// The wrapper is what the grammar spells; the AST holds only its contents, so it is emitted +/// exactly when something it would carry is populated. A value whose hoisted fields all sit at +/// their absent defaults therefore renders without the wrapper, as an absent one does. +pub fn wrapper_needed(states: &[bool]) -> bool { + states.iter().any(|state| *state) +} + +/// The generated formatter declined to render a synthesised CST. +/// +/// Synthesis appends what the parser would have appended, which is the positional contract the +/// formatter checks, so either the grammar has a shape the formatter cannot rebuild from any CST — +/// in which case parsing the same text and formatting the result fails the same way — or the +/// synthesis itself is wrong. +pub fn unrenderable(rule: &str) -> AstError { + AstError::new( + // Must stay on one line: the parity test matches this template verbatim. + format!("the formatter could not render a synthesised {rule:?} node; either the grammar has a shape the formatter cannot rebuild from a CST — parsing the same text and formatting the result fails the same way — or this is a bug in FLTK's AST synthesis"), + Span::unknown(), + ) +} + +/// One set of labels as a diagnostic spells it: sorted, without repeats, quoted, comma-separated. +/// +/// Written out rather than left to `{:?}`, so the rendering is not mistaken for a message template +/// of its own, and so the ordering and the deduplication a diagnostic reports are stated in the one +/// place that decides them: a label two branches of an alternation share is one offer, not two. +fn label_list(labels: &[&str]) -> String { + let mut sorted: Vec<&str> = labels.to_vec(); + sorted.sort_unstable(); + sorted.dedup(); + let mut rendered = String::from("["); + for (index, label) in sorted.iter().enumerate() { + if index > 0 { + rendered.push_str(", "); + } + rendered.push('"'); + rendered.push_str(label); + rendered.push('"'); + } + rendered.push(']'); + rendered +} + +/// The populated fields of one sub-expression alternation must suit a single branch. +/// +/// `branches` is the labels each branch carries. `demanded` says every branch needs a value, so +/// leaving all of them empty renders nothing where the grammar requires something. `exclusive` +/// narrows the second test to the labels this alternation alone can supply: a label the +/// alternative also uses elsewhere may legitimately be populated from there, and a repeatable +/// alternation may draw one label's values from several branches in turn. +pub fn check_group( + rule: &str, + present: &[&str], + branches: &[&[&str]], + exclusive: &[&str], + demanded: bool, +) -> Result<(), AstError> { + if demanded && present.is_empty() { + let union: Vec<&str> = branches.iter().flat_map(|labels| labels.iter().copied()).collect(); + let offered = label_list(&union); + return Err(AstError::new( + format!("rule {rule:?}: the grammar needs one of {offered} at this position, but none is populated"), + Span::unknown(), + )); + } + let narrowed: Vec<&str> = present.iter().copied().filter(|label| exclusive.contains(label)).collect(); + if narrowed.is_empty() || branches.iter().any(|labels| narrowed.iter().all(|label| labels.contains(label))) { + return Ok(()); + } + let offered = branches.iter().map(|labels| label_list(labels)).collect::>().join(" | "); + let narrowed = label_list(&narrowed); + Err(AstError::new( + format!( + "rule {rule:?}: {narrowed} cannot come from one branch of this alternation, which carries {offered}; populate the fields of a single branch" + ), + Span::unknown(), + )) +} + +#[cfg(test)] +mod tests { + use super::*; + + /// `number := val:/-?[0-9]+/ ;` — one included regex item. + static NUMBER: TerminalShape = TerminalShape::new(&[TerminalAlt { + pattern: Some("(?P-?[0-9]+)"), + groups: &[Some("g0")], + }]); + + /// `string_literal := "\"" . content:/[^"]*/ . "\"" ;` — suppressed quotes, so the + /// pattern carries them and only the content is a child. + static STRING_LITERAL: TerminalShape = TerminalShape::new(&[TerminalAlt { + pattern: Some("(?:\")(?P[^\"]*)(?:\")"), + groups: &[Some("g0")], + }]); + + /// `tag := $"#" . name:/[a-z]+/ ;` — an included literal beside an included regex, so the + /// first child carries position only. + static TAG: TerminalShape = TerminalShape::new(&[TerminalAlt { + pattern: Some("(?:#)(?P[a-z]+)"), + groups: &[None, Some("g0")], + }]); + + /// Two alternatives, the first of which also matches a prefix of the second's texts. + static EITHER: TerminalShape = TerminalShape::new(&[ + TerminalAlt { + pattern: Some("(?P[a-z]+)"), + groups: &[Some("g0")], + }, + TerminalAlt { + pattern: Some("(?P[a-z]+)(?P[0-9]+)"), + groups: &[Some("g0"), Some("g1")], + }, + ]); + + /// A rule whose every alternative holds a repeated included item. + static UNSPLITTABLE: TerminalShape = TerminalShape::new(&[TerminalAlt { + pattern: None, + groups: &[], + }]); + + /// `parts := p:/[a-z]/* | w:/[0-9]+/ ;` — one alternative a repeated item leaves + /// unrebuildable, one a single regex spells. + static MIXED: TerminalShape = TerminalShape::new(&[ + TerminalAlt { + pattern: None, + groups: &[], + }, + TerminalAlt { + pattern: Some("(?P[0-9]+)"), + groups: &[Some("g0")], + }, + ]); + + fn texts(split: &TerminalSplit) -> Vec> { + split.spans.iter().map(|span| span.text().map(|text| text.to_string())).collect() + } + + #[test] + fn one_included_regex_takes_the_whole_text() { + let split = NUMBER.split("-42", "number").expect("the text is a number"); + assert_eq!(split.alternative, 0); + assert_eq!(texts(&split), vec![Some("-42".to_string())]); + } + + #[test] + fn a_child_span_carries_its_own_source() { + let split = NUMBER.split("7", "number").expect("the text is a number"); + assert!(split.spans[0].has_source()); + assert_eq!(split.spans[0].start(), 0); + assert_eq!(split.spans[0].end(), 1); + } + + #[test] + fn a_suppressed_literal_stays_out_of_the_children() { + let split = STRING_LITERAL + .split("\"hi\"", "string_literal") + .expect("the text is a quoted string"); + assert_eq!(texts(&split), vec![Some("hi".to_string())]); + } + + #[test] + fn an_included_literal_contributes_a_sourceless_child() { + let split = TAG.split("#host", "tag").expect("the text is a tag"); + assert_eq!(split.spans[0], Span::unknown()); + assert_eq!(texts(&split), vec![None, Some("host".to_string())]); + } + + #[test] + fn a_group_is_read_by_name_not_by_position() { + // The user's own terminal carries a capture group of its own, which shifts every index. + static NESTED: TerminalShape = TerminalShape::new(&[TerminalAlt { + pattern: Some("(?:(a|b)+)(?P[0-9]+)"), + groups: &[Some("g0")], + }]); + let split = NESTED.split("ab12", "nested").expect("the text matches"); + assert_eq!(texts(&split), vec![Some("12".to_string())]); + } + + #[test] + fn the_split_is_measured_in_codepoints() { + static UNICODE: TerminalShape = TerminalShape::new(&[TerminalAlt { + pattern: Some("(?P[^ ]+)(?: )(?P[^ ]+)"), + groups: &[Some("g0"), Some("g1")], + }]); + let split = UNICODE.split("café bar", "unicode").expect("the text matches"); + assert_eq!(split.spans[0].end(), 4, "four codepoints, five bytes"); + assert_eq!(texts(&split), vec![Some("café".to_string()), Some("bar".to_string())]); + } + + #[test] + fn alternatives_are_tried_in_grammar_order() { + let split = EITHER.split("ab12", "either").expect("the second alternative matches"); + assert_eq!(split.alternative, 1); + assert_eq!(texts(&split), vec![Some("ab".to_string()), Some("12".to_string())]); + let split = EITHER.split("ab", "either").expect("the first alternative matches"); + assert_eq!(split.alternative, 0); + } + + #[test] + fn a_partial_match_is_not_a_match() { + let error = NUMBER.split("42x", "number").expect_err("the terminal does not accept a trailing letter"); + assert_eq!( + error.message, + "rule \"number\": text \"42x\" is not something the rule could have matched" + ); + assert_eq!(error.span, Span::unknown()); + } + + #[test] + fn a_shape_no_alternative_can_rebuild_names_the_shape_not_the_text() { + let error = UNSPLITTABLE.split("anything", "parts").expect_err("no alternative can be rebuilt"); + assert!( + error.message.starts_with("rule \"parts\": the rule's shape cannot be rebuilt from text"), + "{}", + error.message + ); + assert!(error.message.contains("restructure the rule or convert it by hand")); + } + + #[test] + fn a_rebuildable_alternative_still_serves_the_text_it_matches() { + let split = MIXED.split("42", "parts").expect("the second alternative matches"); + assert_eq!(split.alternative, 1, "the index counts the unrebuildable alternative too"); + assert_eq!(texts(&split), vec![Some("42".to_string())]); + } + + #[test] + fn text_only_an_unrebuildable_alternative_could_have_matched_names_the_text() { + // Some alternative can be rebuilt, so the shape is not what is being reported: the text + // is, even though it is the rule's shape that leaves it nowhere to go. + let error = MIXED.split("abc", "parts").expect_err("no rebuildable alternative matches"); + assert_eq!( + error.message, + "rule \"parts\": text \"abc\" is not something the rule could have matched" + ); + } + + #[test] + fn compilation_happens_once() { + static ONCE: TerminalShape = TerminalShape::new(&[TerminalAlt { + pattern: Some("(?P[0-9]+)"), + groups: &[Some("g0")], + }]); + let first = ONCE.compiled().as_ptr(); + assert!(ONCE.split("1", "once").is_ok()); + assert_eq!(first, ONCE.compiled().as_ptr(), "the compiled alternatives are cached"); + } + + #[test] + fn a_position_takes_up_to_its_maximum() { + let values = [1, 2, 3]; + let mut cursor = Cursor::new(values.iter().collect()); + assert_eq!(cursor.take(2, 0), vec![&1, &2]); + assert_eq!(cursor.remaining(), 1); + assert_eq!(cursor.take(UNBOUNDED, 0), vec![&3]); + assert_eq!(cursor.remaining(), 0); + } + + #[test] + fn a_reserve_leaves_what_a_later_required_position_needs() { + let values = [1, 2]; + let mut cursor = Cursor::new(values.iter().collect()); + assert_eq!(cursor.take(UNBOUNDED, 1), vec![&1], "one value is held back"); + assert_eq!(cursor.take(UNBOUNDED, 0), vec![&2]); + } + + #[test] + fn a_position_stops_at_the_first_value_it_cannot_hold() { + let values = [1, 2, 9, 3]; + let mut cursor = Cursor::new(values.iter().collect()); + assert_eq!(cursor.take_if(UNBOUNDED, 0, |value| *value < 5), vec![&1, &2]); + assert_eq!(cursor.remaining(), 2, "the value it declined is still there"); + } + + #[test] + fn populated_labels_are_the_ones_carrying_something() { + assert_eq!(populated(&[("a", true), ("b", false), ("c", true)]), vec!["a", "c"]); + } + + #[test] + fn an_alternative_fits_what_it_requires_and_nothing_it_lacks() { + assert!(alternative_fits(&["a"], &["a"], &["a", "b"])); + assert!(!alternative_fits(&[], &["a"], &["a", "b"]), "a required label is absent"); + assert!(!alternative_fits(&["c"], &[], &["a", "b"]), "a populated label is not carried"); + } + + #[test] + fn a_short_run_of_values_names_the_shortfall() { + assert_eq!(filled(2, 2, "pair", "a"), Ok(())); + assert_eq!( + filled(1, 2, "pair", "a").unwrap_err().message, + "rule \"pair\": the grammar needs 2 \"a\" value(s) at this position, but 1 were available" + ); + } + + #[test] + fn a_value_no_position_took_is_named() { + assert_eq!(check_consumed("pair", "a", 0), Ok(())); + assert_eq!( + check_consumed("pair", "a", 2).unwrap_err().message, + "rule \"pair\": the grammar has no place for 2 more \"a\" value(s)" + ); + } + + #[test] + fn a_value_no_branch_accepts_names_its_type() { + assert_eq!( + unplaceable("val", "x", "String").message, + "rule \"val\": no item position accepts a String value for \"x\"" + ); + } + + #[test] + fn a_wrapper_missing_a_required_field_says_which() { + assert_eq!(hoisted(Some(&1), "schedule", "interval"), Ok(&1)); + let error = hoisted::(None, "schedule", "interval").unwrap_err(); + assert!( + error.message.starts_with("rule \"schedule\": the flattened wrapper needs a \"interval\" value"), + "{}", + error.message + ); + assert!(error.message.ends_with("leave every field hoisted out of the wrapper empty")); + } + + #[test] + fn an_optional_wrapper_is_rebuilt_only_for_something_it_carries() { + assert!(!wrapper_needed(&[false, false])); + assert!(wrapper_needed(&[false, true])); + assert!(!wrapper_needed(&[])); + } + + #[test] + fn one_branch_of_an_alternation_has_to_carry_every_populated_label() { + let branches: &[&[&str]] = &[&["a"], &["b"]]; + assert_eq!(check_group("decl", &["a"], branches, &["a", "b"], true), Ok(())); + assert_eq!( + check_group("decl", &[], branches, &["a", "b"], true).unwrap_err().message, + "rule \"decl\": the grammar needs one of [\"a\", \"b\"] at this position, but none is populated" + ); + assert_eq!( + check_group("decl", &["a", "b"], branches, &["a", "b"], true) + .unwrap_err() + .message, + "rule \"decl\": [\"a\", \"b\"] cannot come from one branch of this alternation, \ + which carries [\"a\"] | [\"b\"]; populate the fields of a single branch" + ); + } + + #[test] + fn a_node_the_formatter_declined_names_both_possibilities() { + let error = unrenderable("config"); + assert!( + error.message.starts_with("the formatter could not render a synthesised \"config\" node"), + "{}", + error.message + ); + assert!(error.message.contains("a bug in FLTK's AST synthesis")); + assert_eq!(error.span, Span::unknown()); + } + + #[test] + fn a_label_two_branches_carry_is_offered_once() { + // `( a:x , b:y | a:x , c:z )`: `a` sits in both branches, and the offer is a set of labels. + let branches: &[&[&str]] = &[&["a", "b"], &["a", "c"]]; + assert_eq!( + check_group("decl", &[], branches, &["a", "b", "c"], true).unwrap_err().message, + "rule \"decl\": the grammar needs one of [\"a\", \"b\", \"c\"] at this position, but none is populated" + ); + } + + #[test] + fn a_label_the_alternative_supplies_elsewhere_is_not_judged_here() { + // `exclusive` is empty for a repeatable alternation, so only the demanded test applies. + let branches: &[&[&str]] = &[&["a"], &["b"]]; + assert_eq!(check_group("decl", &["a", "b"], branches, &[], false), Ok(())); + } +} + diff --git a/crates/fltk-ast-core/src/terminal.rs b/crates/fltk-ast-core/src/terminal.rs new file mode 100644 index 0000000..b9c5c0f --- /dev/null +++ b/crates/fltk-ast-core/src/terminal.rs @@ -0,0 +1,242 @@ +use std::sync::OnceLock; + +use fltk_cst_core::{SourceText, Span}; +use regex_automata::meta::Regex; + +use crate::error::AstError; + +/// One grammar terminal, compiled for whole-text matching. +pub struct TerminalPattern { + pattern: String, + regex: Regex, +} + +impl TerminalPattern { + /// Compile a grammar terminal. + /// + /// The pattern comes from a grammar the parser generator has already accepted, so an + /// unsupported one is a generator bug rather than a user error, and this panics on it. + /// + /// The compiled form is `\A(?:)\z`, which is what makes matching a *full* match + /// rather than a prefix one: an alternation whose first branch matches a shorter prefix + /// (`a|ab` against `"ab"`) must still match the whole text, as Python's + /// `re.fullmatch` does. + pub fn new(pattern: &str) -> Self { + let whole = format!(r"\A(?:{pattern})\z"); + let regex = Regex::new(&whole).unwrap_or_else(|e| { + panic!("terminal pattern {pattern:?} is not supported by regex_automata::meta::Regex: {e}") + }); + Self { + pattern: pattern.to_string(), + regex, + } + } + + /// The terminal as the grammar spells it, for diagnostics. + pub fn pattern(&self) -> &str { + &self.pattern + } + + /// Whether the terminal matches the whole of `text`. + pub fn matches(&self, text: &str) -> bool { + self.regex.is_match(text) + } + + /// The compiled automaton, for a caller that needs capture groups rather than a yes or no. + /// + /// Crate-private: a regex type is no part of this crate's surface — generated code names + /// terminals as patterns and reaches them through this type — and only the terminal-only + /// split ([`crate::TerminalShape`]) needs more than a match test. + pub(crate) fn regex(&self) -> &Regex { + &self.regex + } +} + +impl std::fmt::Debug for TerminalPattern { + /// The grammar's spelling; the compiled automaton has no useful rendering. + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("TerminalPattern").field("pattern", &self.pattern).finish() + } +} + +/// One grammar terminal, compiled on first use. +/// +/// [`new`](LazyTerminal::new) is `const`, so a generated converter declares its terminals as +/// `static` items in its own body and pays for the compilation only if something actually +/// serializes through that position. +#[derive(Debug)] +pub struct LazyTerminal { + pattern: &'static str, + compiled: OnceLock, +} + +impl LazyTerminal { + /// Declare one terminal, without compiling it. + pub const fn new(pattern: &'static str) -> Self { + Self { + pattern, + compiled: OnceLock::new(), + } + } + + /// The compiled terminal. + pub fn get(&self) -> &TerminalPattern { + self.compiled.get_or_init(|| TerminalPattern::new(self.pattern)) + } +} + +/// Check that a field's text is something the grammar's terminal could have matched. +/// +/// Serialization runs every regex-backed text through this — field strings, coercion +/// renderings, `custom` unparse output, `text_from` targets — so that an AST value which +/// serializes at all serializes to text that re-parses to the same value. +pub fn validate_terminal<'a>( + text: &'a str, + pattern: &TerminalPattern, + rule: &str, + label: &str, +) -> Result<&'a str, AstError> { + if pattern.matches(text) { + return Ok(text); + } + Err(AstError::new( + format!( + "rule {rule:?}: the {label:?} text {text:?} does not match the terminal /{}/", + pattern.pattern() + ), + Span::unknown(), + )) +} + +/// A span carrying its own single-token source, for a synthesized regex child. +/// +/// The returned span is self-describing: consumers can extract its text without a separate +/// whole-document source. +pub fn source_span(text: &str) -> Span { + let source = SourceText::from_str(text, None); + // Span offsets are codepoint indices, not byte offsets. + let length = i64::try_from(text.chars().count()).expect("terminal text length exceeds i64"); + Span::new_with_source(0, length, &source) +} + +/// [`source_span`] over a text the grammar's terminal accepts. +pub fn text_span(text: &str, pattern: &TerminalPattern, rule: &str, label: &str) -> Result { + Ok(source_span(validate_terminal(text, pattern, rule, label)?)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn a_terminal_matches_the_whole_text_only() { + let digits = TerminalPattern::new("[0-9]+"); + assert!(digits.matches("42")); + assert!(!digits.matches("42x")); + assert!(!digits.matches("x42")); + assert!(!digits.matches("")); + } + + #[test] + fn a_shorter_first_branch_does_not_shadow_a_whole_match() { + // Leftmost-first matching alone would report `a` here and leave `b` unconsumed. + let pattern = TerminalPattern::new("a|ab"); + assert!(pattern.matches("ab")); + assert!(pattern.matches("a")); + assert!(!pattern.matches("abc")); + } + + #[test] + fn an_anchor_bearing_pattern_still_matches() { + let pattern = TerminalPattern::new("^[a-z]+$"); + assert!(pattern.matches("abc")); + assert!(!pattern.matches("abc1")); + } + + #[test] + fn a_leading_flag_applies_to_the_wrapped_pattern() { + let pattern = TerminalPattern::new("(?i)[a-z]+"); + assert!(pattern.matches("AbC")); + assert!(!pattern.matches("Ab1")); + } + + #[test] + fn non_ascii_classes_match_by_codepoint() { + let pattern = TerminalPattern::new("[À-ÿ]+"); + assert!(pattern.matches("Àé")); + assert!(!pattern.matches("Àa")); + } + + #[test] + fn the_pattern_is_recoverable_for_diagnostics() { + assert_eq!(TerminalPattern::new("[0-9]+").pattern(), "[0-9]+"); + assert_eq!( + format!("{:?}", TerminalPattern::new("[0-9]+")), + "TerminalPattern { pattern: \"[0-9]+\" }" + ); + } + + #[test] + #[should_panic(expected = "is not supported by")] + fn an_uncompilable_pattern_panics() { + TerminalPattern::new("[0-9"); + } + + #[test] + fn validation_hands_back_accepted_text() { + let pattern = TerminalPattern::new("[0-9]+"); + assert_eq!(validate_terminal("42", &pattern, "number", "val"), Ok("42")); + } + + #[test] + fn validation_names_rule_label_pattern_and_text() { + let pattern = TerminalPattern::new("[0-9]+"); + let error = validate_terminal("12x", &pattern, "number", "val").unwrap_err(); + assert_eq!( + error.message, + "rule \"number\": the \"val\" text \"12x\" does not match the terminal /[0-9]+/" + ); + assert_eq!(error.span, Span::unknown()); + } + + #[test] + fn a_lazily_declared_terminal_compiles_once_and_matches() { + static DIGITS: LazyTerminal = LazyTerminal::new("[0-9]+"); + let first: *const TerminalPattern = DIGITS.get(); + assert!(DIGITS.get().matches("42")); + assert!(!DIGITS.get().matches("4x")); + assert_eq!(first, DIGITS.get() as *const TerminalPattern, "the compiled form is cached"); + } + + #[test] + fn a_synthesized_span_carries_its_own_text() { + let span = source_span("host"); + assert_eq!(span.start(), 0); + assert_eq!(span.end(), 4); + assert_eq!(span.text().as_deref(), Some("host")); + assert!(span.has_source()); + } + + #[test] + fn a_synthesized_span_is_measured_in_codepoints() { + // "café" is four codepoints and five UTF-8 bytes; a byte length would not resolve. + let span = source_span("café"); + assert_eq!(span.end(), 4); + assert_eq!(span.text().as_deref(), Some("café")); + } + + #[test] + fn an_empty_synthesized_span_is_source_bearing() { + let span = source_span(""); + assert_eq!(span.end(), 0); + assert_eq!(span.text().as_deref(), Some("")); + } + + #[test] + fn text_span_validates_before_building() { + let pattern = TerminalPattern::new("[a-z]+"); + assert_eq!(text_span("host", &pattern, "identifier", "name").unwrap().end(), 4); + let error = text_span("h0st", &pattern, "identifier", "name").unwrap_err(); + assert!(error.message.contains("does not match the terminal /[a-z]+/")); + } +} diff --git a/crates/fltk-parser-core/Cargo.toml b/crates/fltk-parser-core/Cargo.toml index cc8f9df..69225b4 100644 --- a/crates/fltk-parser-core/Cargo.toml +++ b/crates/fltk-parser-core/Cargo.toml @@ -14,14 +14,4 @@ crate-type = ["rlib"] [dependencies] fltk-cst-core = { path = "../fltk-cst-core", default-features = false } -regex-automata = { version = "0.4", default-features = false, features = [ - "std", - "syntax", - "perf", - "unicode", - "meta", - "nfa-backtrack", - "nfa-pikevm", - "hybrid", - "dfa-onepass", -] } +regex-automata = { workspace = true } diff --git a/fltk/_stubs/rust_parser_fixture/unparser.pyi b/fltk/_stubs/rust_parser_fixture/unparser.pyi index 7993e85..a090b97 100644 --- a/fltk/_stubs/rust_parser_fixture/unparser.pyi +++ b/fltk/_stubs/rust_parser_fixture/unparser.pyi @@ -110,5 +110,15 @@ class Unparser: def unparse_quoted_doc(self, node: _proto.Quoted) -> Doc | None: ... def unparse_mixed_opt(self, node: _proto.MixedOpt, max_width: int = ..., indent_width: int = ...) -> str | None: ... def unparse_mixed_opt_doc(self, node: _proto.MixedOpt) -> Doc | None: ... + def unparse_uuid_val(self, node: _proto.UuidVal, max_width: int = ..., indent_width: int = ...) -> str | None: ... + def unparse_uuid_val_doc(self, node: _proto.UuidVal) -> Doc | None: ... + def unparse_decimal_val( + self, node: _proto.DecimalVal, max_width: int = ..., indent_width: int = ... + ) -> str | None: ... + def unparse_decimal_val_doc(self, node: _proto.DecimalVal) -> Doc | None: ... + def unparse_colour(self, node: _proto.Colour, max_width: int = ..., indent_width: int = ...) -> str | None: ... + def unparse_colour_doc(self, node: _proto.Colour) -> Doc | None: ... + def unparse_sum_chain(self, node: _proto.SumChain, max_width: int = ..., indent_width: int = ...) -> str | None: ... + def unparse_sum_chain_doc(self, node: _proto.SumChain) -> Doc | None: ... def unparse__trivia(self, node: _proto.Trivia, max_width: int = ..., indent_width: int = ...) -> str | None: ... def unparse__trivia_doc(self, node: _proto.Trivia) -> Doc | None: ... diff --git a/fltk/fegen/ast_config.py b/fltk/fegen/ast_config.py new file mode 100644 index 0000000..2ca36f1 --- /dev/null +++ b/fltk/fegen/ast_config.py @@ -0,0 +1,1583 @@ +"""Config model for ``.fltkast`` files, the CST-to-model transform, and validation. + +Three layers, in order: + +* the pre-validation model — plain dataclasses mirroring the sidecar's statements one for + one, in source order. Statements are kept as a list rather than folded into per-rule + fields because duplicates and conflicts (two ``type:`` statements, ``sum;`` beside + ``product;``) are diagnosed with the span of each offending statement. +* a small grammar index — the rule, label and shape surface validation matches statements + against. Shape classification comes from :mod:`fltk.fegen.grammar_shape`, which the AST + model classifies with too, so an annotation is accepted exactly when the model will emit + the shape it applies to. +* :class:`ResolvedAstConfig` — one frozen record per configured rule, the shape the AST + model consumes. Building it validates: every offense is collected and the whole set is + raised together. +""" + +from __future__ import annotations + +import dataclasses +import enum +import keyword +import typing + +from fltk.fegen import cst_ergonomics as ce +from fltk.fegen import fltkast_cst as cst +from fltk.fegen import grammar_shape as gshape +from fltk.fegen import gsm +from fltk.fegen.fltkast_parser import Parser +from fltk.fegen.pyrt import error_formatter, errors, terminalsrc + +if typing.TYPE_CHECKING: + from collections.abc import Collection, Iterable, Mapping, Sequence + + from fltk.fegen.pyrt import span_protocol + + +class AstConfigError(ValueError): + """Raised when ``.fltkast`` text fails to parse or map. + + The message renders every offense with a ``file:line:col`` caret annotation, so a + single raise can report more than one. + """ + + +# --- The parsed statement model -------------------------------------------------------- + + +@dataclasses.dataclass(frozen=True) +class CustomArg: + """One ``key: "value"`` entry of a ``custom(...)`` argument list.""" + + key: str + value: str + span: span_protocol.SpanProtocol + + +@dataclasses.dataclass(frozen=True) +class BuiltinTypeSpec: + """``type: i64;`` — a named builtin scalar coercion.""" + + name: str + span: span_protocol.SpanProtocol + + +@dataclasses.dataclass(frozen=True) +class CustomTypeSpec: + """``type: custom(...);`` — user-supplied type and parse/unparse function paths.""" + + args: tuple[CustomArg, ...] + span: span_protocol.SpanProtocol + + +TypeSpec: typing.TypeAlias = BuiltinTypeSpec | CustomTypeSpec + + +@dataclasses.dataclass(frozen=True) +class TypeStmt: + """``type: ;`` — a type coercion, builtin or custom.""" + + spec: TypeSpec + span: span_protocol.SpanProtocol + + +@dataclasses.dataclass(frozen=True) +class BoolStmt: + """``bool: