├── .envrc ├── crates ├── common │ ├── src │ │ └── lib.rs │ └── Cargo.toml ├── workspace-hack │ ├── src │ │ └── lib.rs │ ├── build.rs │ ├── .gitattributes │ └── Cargo.toml └── nix-weather │ ├── build.rs │ ├── Cargo.toml │ └── src │ ├── cli.rs │ ├── net.rs │ ├── nix.rs │ └── main.rs ├── .rustfmt.toml ├── .github └── FUNDING.yml ├── justfile ├── deny.toml ├── .gitignore ├── .config ├── rust-toolchain.toml ├── treefmt.nix ├── hakari.toml └── cliff.toml ├── .forgejo ├── workflows │ ├── nix-build.yml │ ├── nix-flake-check.yml │ └── conventional-commits.yml └── CODEOWNERS ├── Cargo.toml ├── REUSE.toml ├── .versionrc ├── README.md ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md ├── flake.lock ├── flake.nix ├── LICENSE.txt ├── LICENSES ├── EUPL-1.2.txt └── CC-BY-4.0.txt └── Cargo.lock /.envrc: -------------------------------------------------------------------------------- 1 | if has nix; then 2 | use flake . 3 | fi 4 | -------------------------------------------------------------------------------- /crates/common/src/lib.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | // 3 | // SPDX-License-Identifier: EUPL-1.2 4 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | tab_spaces = 2 6 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | github: cafkafk 6 | -------------------------------------------------------------------------------- /crates/workspace-hack/src/lib.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | // 3 | // SPDX-License-Identifier: EUPL-1.2 4 | 5 | // This is a stub lib.rs. 6 | -------------------------------------------------------------------------------- /justfile: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | update-deps: 6 | cargo hakari generate 7 | 8 | changelog: 9 | git cliff -c .config/cliff.toml 10 | -------------------------------------------------------------------------------- /crates/workspace-hack/build.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | // 3 | // SPDX-License-Identifier: EUPL-1.2 4 | 5 | // A build script is required for cargo to consider build dependencies. 6 | fn main() {} 7 | -------------------------------------------------------------------------------- /deny.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | [bans] 6 | multiple-versions = 'allow' 7 | 8 | [licenses] 9 | private = { ignore = true } 10 | allow = ["MIT", "ISC", "MPL-2.0", "Apache-2.0", "Unicode-DFS-2016", "BSD-3-Clause", "EUPL-1.2"] 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | # Ignore output from latex locally 6 | *.aux 7 | *.log 8 | *.pdf 9 | 10 | # Rust 11 | /target 12 | 13 | # Nix 14 | result* 15 | 16 | # Direnv 17 | .direnv 18 | 19 | # pre-commit-hooks 20 | .pre-commit-config.yaml 21 | -------------------------------------------------------------------------------- /crates/common/Cargo.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | [package] 6 | name = "common" 7 | version.workspace = true 8 | edition.workspace = true 9 | publish = false 10 | 11 | [dependencies] 12 | workspace-hack = { version = "0.1", path = "../workspace-hack" } 13 | -------------------------------------------------------------------------------- /crates/workspace-hack/.gitattributes: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | # Avoid putting conflict markers in the generated Cargo.toml file, since their presence breaks 6 | # Cargo. 7 | # Also do not check out the file as CRLF on Windows, as that's what hakari needs. 8 | Cargo.toml merge=binary -crlf 9 | -------------------------------------------------------------------------------- /.config/rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # SPDX-FileContributor: Christina Sørensen 3 | # 4 | # SPDX-License-Identifier: EUPL-1.2 5 | 6 | [toolchain] 7 | channel = "stable" 8 | components = [ 9 | "rustfmt", 10 | "rustc", 11 | "rust-src", 12 | "rust-analyzer", 13 | "cargo", 14 | "clippy", 15 | ] 16 | profile = "minimal" 17 | -------------------------------------------------------------------------------- /.forgejo/workflows/nix-build.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | name: build 6 | on: 7 | push: 8 | branches: [main] 9 | pull_request: 10 | branches: [main] 11 | jobs: 12 | run: 13 | runs-on: native 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: build flake 17 | run: nix build 18 | -------------------------------------------------------------------------------- /.forgejo/workflows/nix-flake-check.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | name: check 6 | on: 7 | push: 8 | branches: [main] 9 | pull_request: 10 | branches: [main] 11 | jobs: 12 | run: 13 | runs-on: native 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: flake checks 17 | run: nix flake check 18 | -------------------------------------------------------------------------------- /.forgejo/workflows/conventional-commits.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | name: conventional commits 6 | on: 7 | push: 8 | branches: [main] 9 | pull_request: 10 | branches: [main] 11 | concurrency: 12 | group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }} 13 | cancel-in-progress: true 14 | jobs: 15 | check: 16 | name: conventional commits 17 | runs-on: native 18 | steps: 19 | - uses: actions/checkout@v4 20 | - uses: actions/action-conventional-commits@v1.3.0 21 | -------------------------------------------------------------------------------- /.config/treefmt.nix: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # SPDX-FileContributor: Christina Sørensen 3 | # 4 | # SPDX-License-Identifier: EUPL-1.2 5 | { 6 | projectRootFile = "Cargo.toml"; 7 | programs = { 8 | nixfmt.enable = true; # nix 9 | statix.enable = true; # nix static analysis 10 | deadnix.enable = true; # find dead nix code 11 | rustfmt.enable = true; # rust 12 | shellcheck.enable = true; # bash/shell 13 | taplo.enable = false; # toml 14 | yamlfmt.enable = true; # yaml 15 | }; 16 | settings = { 17 | formatter = { 18 | shellcheck.excludes = [ ".envrc" ]; 19 | }; 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | [workspace] 6 | resolver = "2" 7 | members = ["crates/*", "crates/workspace-hack"] 8 | 9 | [workspace.package] 10 | description = "Guix weather, for nix!" 11 | version = "0.0.4" 12 | edition = "2021" 13 | license = "EUPL-1.2" 14 | authors = ["Christina Sørensen "] 15 | categories = ["command-line-utilities"] 16 | 17 | # Keep this on anything that isn't EOL, we'll be nice to nixpkgs as long as 18 | # they don't literally actually unironically lock all our deps for us or go on 19 | # EOL rustc >_> 20 | # 21 | # ...also if we wanna play with bench we can probably cfg gate that :p 22 | rust-version = "1.80.1" 23 | 24 | [workspace.metadata.crane] 25 | name = "nix-weather" 26 | 27 | [workspace.dependencies] 28 | workspace-hack = { version = "0.1", path = "./crates/workspace-hack" } 29 | -------------------------------------------------------------------------------- /REUSE.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | version = 1 6 | SPDX-PackageName = "trial" 7 | SPDX-PackageSupplier = "Christina Sørensen " 8 | 9 | [[annotations]] 10 | path = "flake.lock" 11 | precedence = "aggregate" 12 | SPDX-FileCopyrightText = "2024 Christina Sørensen" 13 | SPDX-License-Identifier = "EUPL-1.2" 14 | 15 | [[annotations]] 16 | path = "Cargo.lock" 17 | precedence = "aggregate" 18 | SPDX-FileCopyrightText = "2024 Christina Sørensen" 19 | SPDX-License-Identifier = "EUPL-1.2" 20 | 21 | [[annotations]] 22 | path = ".envrc" 23 | precedence = "aggregate" 24 | SPDX-FileCopyrightText = "2024 Christina Sørensen" 25 | SPDX-License-Identifier = "EUPL-1.2" 26 | 27 | [[annotations]] 28 | path = ".versionrc" 29 | precedence = "aggregate" 30 | SPDX-FileCopyrightText = "2024 Christina Sørensen" 31 | SPDX-License-Identifier = "EUPL-1.2" 32 | -------------------------------------------------------------------------------- /.forgejo/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | # Lines starting with a '#' are comments. 6 | # Each line is a file pattern followed by one or more owners. 7 | 8 | # These owners will be the default owners for everything in the repository. 9 | # * @global-owner1 @global-owner2 10 | 11 | # The 'docs/*' pattern will match files like 12 | # 'docs/getting-started.md' but not further nested files like 13 | # 'docs/build-app/troubleshooting.md'. 14 | # docs/* @doc-owner-team 15 | 16 | # You can also use email addresses if the user isn't on GitHub. 17 | # *.py admin@example.com 18 | 19 | # You can use a '*' at the end of a pattern to match all files 20 | # of a particular type. 21 | # *.* @all-file-types-owner 22 | 23 | # Order is important. The last matching pattern has the most precedence. 24 | # This means if a pull request touches both *.js and *.css files, 25 | # it will only request a review from @js-owner, not @css-owner. 26 | # *.js @js-owner 27 | # *.css @css-owner 28 | 29 | # All files for me :3 30 | * @cafkafk 31 | -------------------------------------------------------------------------------- /.config/hakari.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | # This file contains settings for `cargo hakari`. 6 | # See https://docs.rs/cargo-hakari/latest/cargo_hakari/config for a full list of options. 7 | 8 | hakari-package = "workspace-hack" 9 | 10 | # Format version for hakari's output. Version 4 requires cargo-hakari 0.9.22 or above. 11 | dep-format-version = "4" 12 | 13 | # Setting workspace.resolver = "2" in the root Cargo.toml is HIGHLY recommended. 14 | # Hakari works much better with the new feature resolver. 15 | # For more about the new feature resolver, see: 16 | # https://blog.rust-lang.org/2021/03/25/Rust-1.51.0.html#cargos-new-feature-resolver 17 | resolver = "2" 18 | 19 | # Add triples corresponding to platforms commonly used by developers here. 20 | # https://doc.rust-lang.org/rustc/platform-support.html 21 | platforms = [ 22 | # "x86_64-unknown-linux-gnu", 23 | # "x86_64-apple-darwin", 24 | # "x86_64-pc-windows-msvc", 25 | ] 26 | 27 | # Write out exact versions rather than a semver range. (Defaults to false.) 28 | # exact-versions = true 29 | -------------------------------------------------------------------------------- /crates/nix-weather/build.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023-2024 Christina Sørensen 2 | // SPDX-FileContributor: Christina Sørensen 3 | // 4 | // SPDX-License-Identifier: EUPL-1.2 5 | 6 | use clap::ValueEnum; 7 | use clap_complete::{generate_to, Shell}; 8 | use clap_mangen::Man; 9 | use std::env; 10 | use std::fs::File; 11 | use std::io::Error; 12 | use std::path::PathBuf; 13 | 14 | include!("src/cli.rs"); 15 | 16 | fn main() -> Result<(), Error> { 17 | let real_outdir = match env::var_os("OUT_DIR") { 18 | None => return Ok(()), 19 | Some(outdir) => outdir, 20 | }; 21 | 22 | let outdir = match env::var_os("MAN_OUT") { 23 | None => real_outdir, 24 | Some(outdir) => outdir, 25 | }; 26 | 27 | let mut cmd = build(); 28 | for &shell in Shell::value_variants() { 29 | // HACK: this is gross :( 30 | std::process::Command::new("mkdir") 31 | .arg("man") 32 | .output() 33 | .expect("failed to make man directory"); 34 | 35 | generate_to(shell, &mut cmd, "nix-weather", &outdir)?; 36 | } 37 | 38 | let file = PathBuf::from(&outdir).join("nix-weather.1"); 39 | let mut file = File::create(file)?; 40 | 41 | Man::new(cmd).render(&mut file)?; 42 | 43 | println!("cargo:warning=completion file is generated: {outdir:?}"); 44 | 45 | Ok(()) 46 | } 47 | -------------------------------------------------------------------------------- /crates/nix-weather/Cargo.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # SPDX-FileContributor: Christina Sørensen 3 | # 4 | # SPDX-License-Identifier: EUPL-1.2 5 | 6 | [package] 7 | name = "nix-weather" 8 | description.workspace = true 9 | authors.workspace = true 10 | categories.workspace = true 11 | license.workspace = true 12 | rust-version.workspace = true 13 | version.workspace = true 14 | edition.workspace = true 15 | publish = true 16 | build = "build.rs" 17 | 18 | [dependencies] 19 | clap = { version = "4.5.1", features = ["cargo"] } 20 | console-subscriber = "0.2.0" 21 | dns-lookup = "2.0.4" 22 | domain = { version = "0.9.3", features = ["tokio", "resolv"] } 23 | futures = "0.3.30" 24 | gethostname = "0.4.3" 25 | itertools = "0.12.1" 26 | log = "0.4.21" 27 | openssl = { version = "0.10.63" } 28 | pretty_env_logger = "0.5.0" 29 | rayon = "1.9.0" 30 | reqwest = { version = "0.12", features = ["blocking"] } 31 | rlimit = "0.10.2" 32 | scraper = "0.18.1" 33 | serde = "1.0.197" 34 | serde_json = "1.0.114" 35 | tokio = { version = "1.36.0", features = ["macros", "full"] } 36 | workspace-hack = { version = "0.1", path = "../workspace-hack" } 37 | 38 | [build-dependencies] 39 | clap = { version = "4.5.1", features = ["cargo"] } 40 | clap_complete = "4" 41 | clap_mangen = "0.2.20" 42 | gethostname = "0.4.3" 43 | -------------------------------------------------------------------------------- /crates/nix-weather/src/cli.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023-2024 Christina Sørensen 2 | // SPDX-FileContributor: Christina Sørensen 3 | // SPDX-FileContributor: Maximilian Marx 4 | // 5 | // SPDX-License-Identifier: EUPL-1.2 6 | 7 | use clap::{arg, command, crate_authors, value_parser, ArgAction, ArgGroup, Command}; 8 | 9 | pub fn build() -> Command { 10 | command!() 11 | .author(crate_authors!("\n")) 12 | // TODO: parse multiple installables, like e.g. build does? 13 | .arg(arg!([installable] "A nix installable").required(false)) 14 | .arg(arg!(--cache "Check a specific cache").required(false)) 15 | .arg( 16 | arg!(-n --name "Hostname of machine.") 17 | .required(false) 18 | .value_parser(value_parser!(String)), 19 | ) 20 | .arg( 21 | arg!(-c --config "Path to NixOS config.") 22 | .required(false) 23 | .value_parser(value_parser!(String)), 24 | ) 25 | .arg( 26 | arg!(--timestamp "Add timestamp to log output.") 27 | .action(ArgAction::SetTrue) 28 | .required(false), 29 | ) 30 | .arg(arg!(-v --verbose ... "Verbosity level.")) 31 | .arg( 32 | arg!(printBuildLogs: -L "Verbosity level.") 33 | .long("print-build-logs") 34 | .conflicts_with("verbose"), 35 | ) 36 | .arg(arg!(-'4' --"only-ipv4" "Use IPv4 addresses only.").action(ArgAction::SetTrue)) 37 | .arg(arg!(-'6' --"only-ipv6" "Use IPv6 addresses only.").action(ArgAction::SetTrue)) 38 | .group( 39 | ArgGroup::new("address_family") 40 | .args(["only-ipv4", "only-ipv6"]) 41 | .required(false), 42 | ) 43 | } 44 | -------------------------------------------------------------------------------- /crates/workspace-hack/Cargo.toml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | # SPDX-FileContributor: Maximilian Marx 5 | 6 | # This file is generated by `cargo hakari`. 7 | # To regenerate, run: 8 | # cargo hakari generate 9 | 10 | [package] 11 | name = "workspace-hack" 12 | version = "0.1.0" 13 | description = "workspace-hack package, managed by hakari" 14 | # You can choose to publish this crate: see https://docs.rs/cargo-hakari/latest/cargo_hakari/publishing. 15 | publish = false 16 | edition.workspace = true 17 | 18 | # The parts of the file between the BEGIN HAKARI SECTION and END HAKARI SECTION comments 19 | # are managed by hakari. 20 | 21 | ### BEGIN HAKARI SECTION 22 | [dependencies] 23 | byteorder = { version = "1" } 24 | clap = { version = "4", features = ["cargo", "env"] } 25 | clap_builder = { version = "4", default-features = false, features = ["cargo", "color", "env", "help", "std", "suggestions", "usage"] } 26 | either = { version = "1", default-features = false, features = ["use_std"] } 27 | itertools = { version = "0.12" } 28 | phf_shared = { version = "0.11", default-features = false, features = ["std"] } 29 | 30 | [build-dependencies] 31 | byteorder = { version = "1" } 32 | clap = { version = "4", features = ["cargo", "env"] } 33 | clap_builder = { version = "4", default-features = false, features = ["cargo", "color", "env", "help", "std", "suggestions", "usage"] } 34 | either = { version = "1", default-features = false, features = ["use_std"] } 35 | itertools = { version = "0.12" } 36 | phf_shared = { version = "0.11", default-features = false, features = ["std"] } 37 | 38 | ### END HAKARI SECTION 39 | -------------------------------------------------------------------------------- /.versionrc: -------------------------------------------------------------------------------- 1 | header: | 2 | # Changelog 3 | types: 4 | - type: feat 5 | increment: Minor 6 | section: Features 7 | hidden: false 8 | - type: fix 9 | increment: Patch 10 | section: Fixes 11 | hidden: false 12 | - type: build 13 | increment: None 14 | section: Other 15 | hidden: true 16 | - type: chore 17 | increment: None 18 | section: Other 19 | hidden: true 20 | - type: ci 21 | increment: None 22 | section: Other 23 | hidden: true 24 | - type: docs 25 | increment: None 26 | section: Documentation 27 | hidden: true 28 | - type: style 29 | increment: None 30 | section: Other 31 | hidden: true 32 | - type: refactor 33 | increment: None 34 | section: Other 35 | hidden: true 36 | - type: perf 37 | increment: None 38 | section: Other 39 | hidden: true 40 | - type: test 41 | increment: None 42 | section: Other 43 | hidden: true 44 | - type: merge 45 | increment: None 46 | section: Other 47 | hidden: true 48 | preMajor: false 49 | commitUrlFormat: '{{@root.host}}/{{@root.owner}}/{{@root.repository}}/commit/{{hash}}' 50 | compareUrlFormat: '{{@root.host}}/{{@root.owner}}/{{@root.repository}}/compare/{{previousTag}}...{{currentTag}}' 51 | issueUrlFormat: '{{@root.host}}/{{@root.owner}}/{{@root.repository}}/issues/{{issue}}' 52 | userUrlFormat: '{{host}}/{{user}}' 53 | releaseCommitMessageFormat: 'chore(release): {{currentTag}}' 54 | issuePrefixes: 55 | - '#' 56 | host: ssh://git.fem.gg 57 | owner: cafkafk 58 | repository: nix-weather 59 | template: null 60 | commitTemplate: null 61 | scopeRegex: ^[[:alnum:]]+(?:[-_/][[:alnum:]]+)*$ 62 | lineLength: 80 63 | wrapDisabled: false 64 | linkCompare: true 65 | linkReferences: true 66 | merges: false 67 | firstParent: false 68 | stripRegex: '' 69 | description: 70 | length: 71 | min: 10 72 | max: null 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 |
10 | 11 | # Nix Weather - Check Cache Availablility of NixOS Configurations 12 | 13 | A *fast* rust tool to check availability of your entire system in caches. It so 14 | to speak "checks the weather" before going to update. Heavily inspired by [`guix 15 | weather`](https://guix.gnu.org/manual/en/html_node/Invoking-guix-weather.html). 16 | 17 | 18 | [![Built with Nix](https://img.shields.io/badge/Built_With-Nix-5277C3.svg?logo=nixos&labelColor=73C3D5)](https://nixos.org) 19 | [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) 20 | [![REUSE status](https://api.reuse.software/badge/git.fsfe.org/reuse/api)](https://api.reuse.software/info/git.fsfe.org/reuse/api) 21 | [![License: EUPL-1.2](https://img.shields.io/badge/licence-EUPL--1.2-blue)](https://commission.europa.eu/content/european-union-public-licence_en) 22 | 23 |
24 | 25 | 26 | ## Usage 27 | 28 | > **Note** 29 | > Currently, `nix-weather` only has first-class support for flakes. 30 | 31 | General usage would be like this: 32 | 33 | ```bash 34 | nix-weather --name myhost --config ~/git/my-nixos-config 35 | ``` 36 | 37 | Here, we specify the name of the host, as specified at the flake output 38 | `nixosConfiguration`, and a path to the NixOS configuration flake. 39 | 40 | ## How It Works 41 | 42 | The basic idea is that we construct a set of all requisites to build the 43 | top-level of a NixOS configuration, and then query Nix cache(s) for the narinfo. 44 | By doing this in a high concurrency, parallel task runner (i.e. tokio async 45 | runtime), and only querying the headers for status codes, we can reach 46 | impressive speeds, typically around 45~ network time. 47 | 48 | One of the biggest limiting factors regarding speed is building the 49 | `config.system.toplevel`, and finding the necessary requisites with `nix-store`. 50 | Caching the requisites is a future goal, so that we only have to build the 51 | `toplevel`, and then match against its derivation in cache, which should cut 52 | down the nix part of the runtime by ~80%. 53 | 54 |
55 | 56 | ## Contributing 57 | 58 | For information on contributing, please see [CONTRIBUTING.md](CONTRIBUTING.md). 59 | -------------------------------------------------------------------------------- /crates/nix-weather/src/net.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | // SPDX-FileContributor: Christina Sørensen 3 | // SPDX-FileContributor: Maximilian Marx 4 | // 5 | // SPDX-License-Identifier: EUPL-1.2 6 | 7 | use std::{ 8 | io, 9 | net::{IpAddr, SocketAddr}, 10 | time::Duration, 11 | }; 12 | 13 | use reqwest::{dns::Resolve, Client}; 14 | use tokio::time::sleep; 15 | 16 | const MAX_SLIDE: u64 = 1000; 17 | 18 | #[derive(Debug, Copy, Clone, Default)] 19 | pub enum AddressFamilyFilter { 20 | #[default] 21 | Both, 22 | OnlyIPv4, 23 | OnlyIPv6, 24 | } 25 | 26 | impl AddressFamilyFilter { 27 | pub fn lookup_host(self, host: &str) -> io::Result> { 28 | let addresses = dns_lookup::lookup_host(host)?; 29 | Ok(self.filter_addresses(addresses)) 30 | } 31 | 32 | fn filter_addresses(self, addresses: T) -> impl Iterator 33 | where 34 | T: IntoIterator, 35 | { 36 | addresses.into_iter().filter(move |address| match self { 37 | Self::Both => true, 38 | Self::OnlyIPv4 => matches!(address, IpAddr::V4(_)), 39 | Self::OnlyIPv6 => matches!(address, IpAddr::V6(_)), 40 | }) 41 | } 42 | } 43 | 44 | impl Resolve for AddressFamilyFilter { 45 | fn resolve(&self, name: reqwest::dns::Name) -> reqwest::dns::Resolving { 46 | let filter = *self; 47 | Box::pin(async move { 48 | let addresses = filter.lookup_host(name.as_str())?; 49 | let socket_addresses: Box + Send> = 50 | Box::new(addresses.map(|ip| SocketAddr::new(ip, 0))); 51 | 52 | Ok(socket_addresses) 53 | }) 54 | } 55 | } 56 | 57 | pub async fn nar_exists(client: Client, domain: &str, hash: &str, slide: u64) -> usize { 58 | let response = client 59 | .head(format!("https://{domain}/{hash}.narinfo")) 60 | .send() 61 | .await; 62 | 63 | match response { 64 | Ok(response) if response.status().as_u16() == 200 => 1, 65 | Ok(response) if response.status().as_u16() == 404 => 0, 66 | Ok(response) if response.status().as_u16() == 429 => { 67 | // We're so fast now we get rate limited. 68 | 69 | let wait = if let Some(retry_after) = response.headers().get("Retry-After") { 70 | if let Ok(seconds) = String::from_utf8_lossy(retry_after.as_bytes()).parse::() { 71 | seconds * 1000 72 | } else { 73 | slide 74 | } 75 | } else { 76 | slide 77 | }; 78 | 79 | sleep(Duration::from_millis(wait)).await; 80 | Box::pin(nar_exists( 81 | client, 82 | domain, 83 | hash, 84 | std::cmp::min(slide * 2, MAX_SLIDE), 85 | )) 86 | .await 87 | } 88 | _ => { 89 | // We might also be out of sockets, so let's wait on that 90 | // Writing an actual sliding window seems kinda hard, 91 | // so we do this instead. 92 | log::trace!("rate limited! {slide}"); 93 | sleep(Duration::from_millis(slide)).await; 94 | Box::pin(nar_exists( 95 | client, 96 | domain, 97 | hash, 98 | std::cmp::min(slide * 2, MAX_SLIDE), 99 | )) 100 | .await 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /.config/cliff.toml: -------------------------------------------------------------------------------- 1 | # git-cliff ~ default configuration file 2 | # https://git-cliff.org/docs/configuration 3 | # 4 | # Lines starting with "#" are comments. 5 | # Configuration options are organized into tables and keys. 6 | # See documentation for more information on available options. 7 | 8 | [changelog] 9 | # template for the changelog footer 10 | header = """ 11 | 17 | 18 | # Changelog\n 19 | All notable changes to this project will be documented in this file.\n 20 | """ 21 | # template for the changelog body 22 | # https://keats.github.io/tera/docs/#introduction 23 | body = """ 24 | {% if version %}\ 25 | ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} 26 | {% else %}\ 27 | ## [unreleased] 28 | {% endif %}\ 29 | {% for group, commits in commits | group_by(attribute="group") %} 30 | ### {{ group | striptags | trim | upper_first }} 31 | {% for commit in commits %} 32 | - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ 33 | {% if commit.breaking %}[**breaking**] {% endif %}\ 34 | {{ commit.message | upper_first }}\ 35 | {% endfor %} 36 | {% endfor %}\n 37 | """ 38 | # template for the changelog footer 39 | footer = """ 40 | 41 | """ 42 | # remove the leading and trailing s 43 | trim = true 44 | # postprocessors 45 | postprocessors = [ 46 | # { pattern = '', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL 47 | ] 48 | 49 | [git] 50 | # parse the commits based on https://www.conventionalcommits.org 51 | conventional_commits = true 52 | # filter out the commits that are not conventional 53 | filter_unconventional = true 54 | # process each line of a commit as an individual commit 55 | split_commits = false 56 | # regex for preprocessing the commit messages 57 | commit_preprocessors = [ 58 | # Replace issue numbers 59 | #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, 60 | # Check spelling of the commit with https://github.com/crate-ci/typos 61 | # If the spelling is incorrect, it will be automatically fixed. 62 | #{ pattern = '.*', replace_command = 'typos --write-changes -' }, 63 | ] 64 | # regex for parsing and grouping commits 65 | commit_parsers = [ 66 | { message = "^feat", group = "Features" }, 67 | { message = "^fix", group = "Bug Fixes" }, 68 | { message = "^doc", group = "Documentation" }, 69 | { message = "^perf", group = "Performance" }, 70 | { message = "^refactor", group = "Refactor" }, 71 | { message = "^style", group = "Styling" }, 72 | { message = "^test", group = "Testing" }, 73 | #{ message = "^chore\\(release\\): prepare for", skip = true }, 74 | #{ message = "^chore\\(deps.*\\)", skip = true }, 75 | #{ message = "^chore\\(pr\\)", skip = true }, 76 | #{ message = "^chore\\(pull\\)", skip = true }, 77 | { message = "^chore|^ci", group = "Miscellaneous Tasks" }, 78 | { body = ".*security", group = "Security" }, 79 | { message = "^revert", group = "◀️ Revert" }, 80 | ] 81 | # protect breaking changes from being skipped due to matching a skipping commit_parser 82 | protect_breaking_commits = false 83 | # filter out the commits that are not matched by commit parsers 84 | filter_commits = false 85 | # regex for matching git tags 86 | # tag_pattern = "v[0-9].*" 87 | # regex for skipping tags 88 | # skip_tags = "" 89 | # regex for ignoring tags 90 | # ignore_tags = "" 91 | # sort the tags topologically 92 | topo_order = false 93 | # sort the commits inside sections by oldest/newest order 94 | sort_commits = "oldest" 95 | # limit the number of commits included in the changelog. 96 | # limit_commits = 42 97 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 7 | 8 | # Contributing to Nix Weather 9 | 10 | Nix Weather is a NixOs adjacent project, and expects contributors to have **at least** a local installation of `Nix` or `Lix` on their development machine. 11 | 12 | ## DevShell 13 | 14 | Currently, `nix-weather` is developed against Lix main branch. We also make use 15 | of experimental features, including ones still in RFC stage, such as [RFC 0148: 16 | `pipe-operators`](https://github.com/NixOS/rfcs/pull/148). 17 | 18 | The `devShell` in the flake takes care of setting this up for you, so as long as 19 | you can run that, you shouldn't have to worry. 20 | 21 | Further, the devShell includes formatting through `nix fmt`, and testing through 22 | `nix flake check`, as well as pre-commit-hooks, that ensure any PR is up to 23 | standard before being submitted. 24 | 25 | We stronly advice working and commiting from inside the devShell. To make this 26 | easier, use the provided [direnv](https://direnv.net/) configuration by 27 | installing direnv and running `direnv allow` in the repository root. 28 | 29 | ## Code Standards 30 | 31 | We make use of several standards, including: 32 | - [Semantic Versioning](https://semver.org/) for version bumps. 33 | - [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) for commit summaries. 34 | - [REUSE](https://reuse.software/) for license complicance. 35 | 36 | We also make use of code formatters, as well as rust related tooling for 37 | auditing dependencies have licenses that are compliant with the 38 | [EUPL-1.2](https://commission.europa.eu/content/european-union-public-licence_en). 39 | 40 | Take note that contributions will be legally considered under the EUPL-1.2 41 | Article 6 "Chain of Authorship" section, essentially a developer certificate of 42 | origin. 43 | 44 | > 6.Chain of Authorship 45 | > 46 | > The original Licensor warrants that the copyright in the Original Work granted 47 | > hereunder is owned by him/her or licensed to him/her and that he/she has the 48 | > power and authority to grant the Licence. 49 | > 50 | > Each Contributor warrants that the copyright in the modifications he/she 51 | > brings to the Work are owned by him/her or licensed to him/her and that he/she 52 | > has the power and authority to grant the Licence. 53 | > 54 | > Each time You accept the Licence, the original Licensor and subsequent 55 | > Contributors grant You a licence to their contributions to the Work, under the 56 | > terms of this Licence. 57 | 58 | ### Pull-Requests 59 | 60 | We currently expect that all commits are functional against `nix flake check` 61 | and don't introduce any regressions. Further we prohibit merge branch updates, 62 | and expect all pull requests to have been rebased against the `main` branch 63 | before being merged. 64 | 65 | Long chains of commits should be divided into separate PRs, specially if 66 | introducing multiple features that will all need separate review. Ideally, a 67 | stacked workflow is preferred. 68 | 69 | Formatting changes of code created in the PR should be rebased into the commit 70 | introducing the codebase, **not** be it's own separate commit. 71 | 72 | Treewide changes should be added to a `.git-blame-ignore-revs`. 73 | 74 | ## Code of Conduct 75 | 76 | The project is moderated according to the [Contributor Covenant Code of 77 | Conduct](CODE_OF_CONDUCT.md). We expect all contributions, issues, and other 78 | project communications made in spaces related to the project to live up to the 79 | standards set in the code of conduct, and it will be enforced according to the 80 | `Enforcement Guidelines` it describes. 81 | 82 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 83 | reported to the community leaders responsible for enforcement at: 84 | 85 | matrix: @cafkafk:gitter.im 86 | -------------------------------------------------------------------------------- /crates/nix-weather/src/nix.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | // SPDX-FileContributor: Christina Sørensen 3 | // 4 | // SPDX-License-Identifier: EUPL-1.2 5 | 6 | use serde_json::Value; 7 | use std::{ 8 | path::Path, 9 | process::{Command, Stdio}, 10 | }; 11 | 12 | /// Get nixosConfiguration derivation path 13 | #[inline] 14 | fn get_config_drv_path(host: &str, config_dir: &str) -> std::io::Result { 15 | Command::new("nix") 16 | .current_dir(Path::new(config_dir)) 17 | .args([ 18 | "build", 19 | "--quiet", 20 | &format!("./#nixosConfigurations.{host}.config.system.build.toplevel"), 21 | "--dry-run", 22 | "--json", 23 | ]) 24 | .output() 25 | } 26 | 27 | /// Get installable derivation path 28 | #[inline] 29 | fn get_installable_drv_path(installable: &str) -> std::io::Result { 30 | Command::new("nix") 31 | .args(["build", "--quiet", installable, "--dry-run", "--json"]) 32 | .output() 33 | } 34 | 35 | /// Takes a `drv_path` and gets all it's requisites from the nix store. 36 | #[inline] 37 | fn get_requisites_from_drv_path(drv_path: &str) -> std::io::Result { 38 | Command::new("nix-store") 39 | .args(["--query", "--requisites", drv_path]) 40 | .stdout(Stdio::piped()) 41 | .spawn() 42 | } 43 | 44 | /// Turns requisites into hashes 45 | #[inline] 46 | fn requisites_to_hashes( 47 | drv_requisites: std::process::Child, 48 | ) -> std::io::Result { 49 | let drv_requisites_remove_base = Command::new("cut") 50 | .args(["-d", "/", "-f4"]) 51 | .stdin(Stdio::from(drv_requisites.stdout.unwrap())) 52 | .stdout(Stdio::piped()) 53 | .spawn() 54 | .unwrap(); 55 | Command::new("cut") 56 | .args(["-d", "-", "-f1"]) 57 | .stdin(Stdio::from(drv_requisites_remove_base.stdout.unwrap())) 58 | .stdout(Stdio::piped()) 59 | .spawn() 60 | } 61 | 62 | /// Returns a Vec of cache urls from `nix config show` 63 | pub fn get_system_caches() -> Vec { 64 | let raw_config = Command::new("nix") 65 | .args(["config", "show", "--json"]) 66 | .output() 67 | .expect("Failed to run `nix config show --json`"); 68 | let parsed_config: Value = 69 | serde_json::from_str(&String::from_utf8(raw_config.stdout).unwrap()).unwrap(); 70 | parsed_config 71 | .get("substituters") 72 | .expect("couldn't find substituters attribute in nix.conf") 73 | .get("value") 74 | .expect("couldn't find value of substituters attribute in nix.conf") 75 | .as_array() 76 | .expect("couldn't convert substituters.value into array from nix.conf") 77 | .iter() 78 | .map(|value| { 79 | value 80 | .as_str() 81 | .expect("failed to parse borrowed string slcie from substituters.value array") 82 | .to_string() 83 | }) 84 | .collect() 85 | } 86 | 87 | pub fn get_requisites(host: &str, config_dir: &str, installable: Option) -> String { 88 | // If the users specified an installable, we interpret that, instead of trying 89 | // to guess their config location. 90 | let drv_path; 91 | if let Some(installable) = installable { 92 | drv_path = get_installable_drv_path(&installable).unwrap(); 93 | } else { 94 | drv_path = get_config_drv_path(host, config_dir).unwrap(); 95 | } 96 | 97 | let drv_path_json: Value = 98 | serde_json::from_str(&String::from_utf8(drv_path.stdout).unwrap()).unwrap(); 99 | let drv_path = drv_path_json[0]["drvPath"].clone(); 100 | 101 | log::debug!("drv_path: {}", &drv_path); 102 | 103 | let drv_requisites = get_requisites_from_drv_path(drv_path.as_str().unwrap()).unwrap(); 104 | 105 | let drv_requisite_hashes = requisites_to_hashes(drv_requisites); 106 | 107 | String::from_utf8( 108 | drv_requisite_hashes 109 | .unwrap() 110 | .wait_with_output() 111 | .unwrap() 112 | .stdout, 113 | ) 114 | .unwrap() 115 | } 116 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | 6 | 7 | # Contributor Covenant Code of Conduct 8 | 9 | ## Our Pledge 10 | 11 | We as members, contributors, and leaders pledge to make participation in our 12 | community a harassment-free experience for everyone, regardless of age, body 13 | size, visible or invisible disability, ethnicity, sex characteristics, gender 14 | identity and expression, level of experience, education, socio-economic status, 15 | nationality, personal appearance, race, caste, color, religion, or sexual 16 | identity and orientation. 17 | 18 | We pledge to act and interact in ways that contribute to an open, welcoming, 19 | diverse, inclusive, and healthy community. 20 | 21 | ## Our Standards 22 | 23 | Examples of behavior that contributes to a positive environment for our 24 | community include: 25 | 26 | * Demonstrating empathy and kindness toward other people 27 | * Being respectful of differing opinions, viewpoints, and experiences 28 | * Giving and gracefully accepting constructive feedback 29 | * Accepting responsibility and apologizing to those affected by our mistakes, 30 | and learning from the experience 31 | * Focusing on what is best not just for us as individuals, but for the overall 32 | community 33 | 34 | Examples of unacceptable behavior include: 35 | 36 | * The use of sexualized language or imagery, and sexual attention or advances of 37 | any kind 38 | * Trolling, insulting or derogatory comments, and personal or political attacks 39 | * Public or private harassment 40 | * Publishing others' private information, such as a physical or email address, 41 | without their explicit permission 42 | * Other conduct which could reasonably be considered inappropriate in a 43 | professional setting 44 | 45 | ## Enforcement Responsibilities 46 | 47 | Community leaders are responsible for clarifying and enforcing our standards of 48 | acceptable behavior and will take appropriate and fair corrective action in 49 | response to any behavior that they deem inappropriate, threatening, offensive, 50 | or harmful. 51 | 52 | Community leaders have the right and responsibility to remove, edit, or reject 53 | comments, commits, code, wiki edits, issues, and other contributions that are 54 | not aligned to this Code of Conduct, and will communicate reasons for moderation 55 | decisions when appropriate. 56 | 57 | ## Scope 58 | 59 | This Code of Conduct applies within all community spaces, and also applies when 60 | an individual is officially representing the community in public spaces. 61 | Examples of representing our community include using an official e-mail address, 62 | posting via an official social media account, or acting as an appointed 63 | representative at an online or offline event. 64 | 65 | ## Enforcement 66 | 67 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 68 | reported to the community leaders responsible for enforcement at: 69 | 70 | matrix: @cafkafk:gitter.im 71 | 72 | All complaints will be reviewed and investigated promptly and fairly. 73 | 74 | All community leaders are obligated to respect the privacy and security of the 75 | reporter of any incident. 76 | 77 | ## Enforcement Guidelines 78 | 79 | Community leaders will follow these Community Impact Guidelines in determining 80 | the consequences for any action they deem in violation of this Code of Conduct: 81 | 82 | ### 1. Correction 83 | 84 | **Community Impact**: Use of inappropriate language or other behavior deemed 85 | unprofessional or unwelcome in the community. 86 | 87 | **Consequence**: A private, written warning from community leaders, providing 88 | clarity around the nature of the violation and an explanation of why the 89 | behavior was inappropriate. A public apology may be requested. 90 | 91 | ### 2. Warning 92 | 93 | **Community Impact**: A violation through a single incident or series of 94 | actions. 95 | 96 | **Consequence**: A warning with consequences for continued behavior. No 97 | interaction with the people involved, including unsolicited interaction with 98 | those enforcing the Code of Conduct, for a specified period of time. This 99 | includes avoiding interactions in community spaces as well as external channels 100 | like social media. Violating these terms may lead to a temporary or permanent 101 | ban. 102 | 103 | ### 3. Temporary Ban 104 | 105 | **Community Impact**: A serious violation of community standards, including 106 | sustained inappropriate behavior. 107 | 108 | **Consequence**: A temporary ban from any sort of interaction or public 109 | communication with the community for a specified period of time. No public or 110 | private interaction with the people involved, including unsolicited interaction 111 | with those enforcing the Code of Conduct, is allowed during this period. 112 | Violating these terms may lead to a permanent ban. 113 | 114 | ### 4. Permanent Ban 115 | 116 | **Community Impact**: Demonstrating a pattern of violation of community 117 | standards, including sustained inappropriate behavior, harassment of an 118 | individual, or aggression toward or disparagement of classes of individuals. 119 | 120 | **Consequence**: A permanent ban from any sort of public interaction within the 121 | community. 122 | 123 | ## Attribution 124 | 125 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 126 | version 2.1, available at 127 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 128 | 129 | Community Impact Guidelines were inspired by 130 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 131 | 132 | For answers to common questions about this code of conduct, see the FAQ at 133 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at 134 | [https://www.contributor-covenant.org/translations][translations]. 135 | 136 | [homepage]: https://www.contributor-covenant.org 137 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 138 | [Mozilla CoC]: https://github.com/mozilla/diversity 139 | [FAQ]: https://www.contributor-covenant.org/faq 140 | [translations]: https://www.contributor-covenant.org/translations 141 | 142 | -------------------------------------------------------------------------------- /crates/nix-weather/src/main.rs: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | // SPDX-FileContributor: Christina Sørensen 3 | // SPDX-FileContributor: Maximilian Marx 4 | // 5 | // SPDX-License-Identifier: EUPL-1.2 6 | 7 | use std::collections::{BTreeMap, HashSet}; 8 | use std::sync::Arc; 9 | use std::time::Instant; 10 | use std::{env, io, net::SocketAddr}; 11 | 12 | use futures::future::join_all; 13 | use gethostname::gethostname; 14 | use itertools::Itertools; 15 | use net::AddressFamilyFilter; 16 | 17 | use crate::nix::get_requisites; 18 | 19 | mod cli; 20 | mod net; 21 | mod nix; 22 | 23 | /// The initial time to wait on http 104, in milliseconds 24 | const SLIDE: u64 = 100; 25 | 26 | // Open files limit to try to set 27 | const NOFILES_LIMIT: u64 = 16384; 28 | 29 | const DEFAULT_CONFIG_DIR: &str = "/etc/nixos"; 30 | 31 | // TODO: normalized? 32 | type Caches = HashSet; 33 | 34 | type NarHash = String; 35 | 36 | #[derive(Debug, Clone, Eq, Hash, PartialEq)] 37 | struct Cache { 38 | domain: String, 39 | // FIXME: redundant + eww 40 | ips: Vec, 41 | contents: Option>, 42 | // TODO: implement, it's in the narinfo 43 | size: Option, 44 | } 45 | 46 | #[tokio::main(flavor = "multi_thread")] 47 | #[allow(clippy::too_many_lines)] 48 | async fn main() -> io::Result<()> { 49 | let initial_time = Instant::now(); 50 | 51 | let host_name: String; 52 | let config_dir: String; 53 | let cache_urls: Vec; 54 | 55 | let matches = cli::build().get_matches(); 56 | 57 | // If the users inputs more -v flags than we have log levels, send them a 58 | // message informing them. 59 | let mut very_bose = false; 60 | 61 | // The Normal verbose flag, allowing multiple levels. Conflicts with 62 | // printBuildLogs. 63 | match matches 64 | .get_one::("verbose") 65 | .expect("Counts aren't defaulted") 66 | { 67 | 0 => env::set_var("RUST_LOG", "error"), 68 | 1 => env::set_var("RUST_LOG", "warn"), 69 | 2 => env::set_var("RUST_LOG", "info"), 70 | 3 => env::set_var("RUST_LOG", "debug"), 71 | 4 => env::set_var("RUST_LOG", "trace"), 72 | _ => { 73 | very_bose = true; 74 | env::set_var("RUST_LOG", "trace"); 75 | } 76 | } 77 | 78 | // The -L flag, to give a more nix3 feel 79 | if matches.get_flag("printBuildLogs") { 80 | env::set_var("RUST_LOG", "trace"); 81 | } 82 | 83 | if matches.get_flag("timestamp") { 84 | pretty_env_logger::formatted_timed_builder() 85 | .parse_env("RUST_LOG") 86 | .init(); 87 | } else { 88 | pretty_env_logger::formatted_builder() 89 | .parse_env("RUST_LOG") 90 | .init(); 91 | } 92 | 93 | if very_bose { 94 | log::trace!("More than four -v flags don't increase log level."); 95 | } 96 | 97 | if let Some(name) = matches.get_one::("name") { 98 | host_name = name.to_owned(); 99 | } else { 100 | host_name = gethostname().into_string().unwrap(); 101 | } 102 | 103 | if let Some(cache) = matches.get_one::("cache") { 104 | log::trace!("got cache from argument"); 105 | cache_urls = vec![cache.to_owned()]; 106 | } else { 107 | log::trace!("got cache from system/default"); 108 | cache_urls = nix::get_system_caches(); 109 | // FIXME: 110 | // let cache_urls_list = nix::get_system_caches(); 111 | // cache_urls = if cache_urls_list == Vec::::new() { 112 | // vec![DEFAULT_CACHE.to_string()] 113 | // } else { 114 | // cache_urls_list 115 | // }; 116 | } 117 | 118 | log::debug!("caches found: {cache_urls:?}"); 119 | 120 | if let Some(config) = matches.get_one::("config") { 121 | config_dir = config.to_owned(); 122 | } else { 123 | config_dir = DEFAULT_CONFIG_DIR.to_string(); 124 | } 125 | 126 | let address_family_filter = if matches.get_flag("only-ipv4") { 127 | AddressFamilyFilter::OnlyIPv4 128 | } else if matches.get_flag("only-ipv6") { 129 | AddressFamilyFilter::OnlyIPv6 130 | } else { 131 | AddressFamilyFilter::default() 132 | }; 133 | 134 | // try to increase NOFILES runtime limit 135 | if rlimit::increase_nofile_limit(NOFILES_LIMIT).is_err() { 136 | log::warn!( 137 | "Failed to increase NOFILES limit, still at {:#?}", 138 | rlimit::Resource::NOFILE.get().unwrap_or_default() 139 | ); 140 | } 141 | 142 | let mut caches: Caches = HashSet::new(); 143 | 144 | for cache_url in cache_urls { 145 | // FIXME: ewww ewwwwwwwwwwwwww 146 | let mut cache_url = cache_url 147 | .strip_prefix("https://") 148 | .unwrap_or(cache_url.strip_prefix("http://").unwrap_or(&cache_url)); 149 | cache_url = cache_url.strip_suffix("/").unwrap_or(cache_url); 150 | 151 | log::warn!("{cache_url}"); 152 | let ips: Vec = address_family_filter 153 | .lookup_host(cache_url) 154 | .unwrap() 155 | .collect(); 156 | // TODO: support http^w^w read http/https protocol, and decide correct port 157 | // TODO: target_ip is redundant 158 | let cache = Cache { 159 | domain: cache_url.to_string(), 160 | ips: ips.clone(), 161 | contents: None, 162 | size: None, 163 | }; 164 | caches.insert(cache); 165 | } 166 | 167 | for cache in caches.clone() { 168 | println!("\nChecking {}", cache.domain); 169 | let client = reqwest::Client::builder() 170 | .dns_resolver(Arc::new(address_family_filter)) 171 | .resolve(&cache.domain, SocketAddr::new(cache.ips[0], 443)) 172 | .build() 173 | .unwrap(); 174 | 175 | let binding = get_requisites( 176 | &host_name, 177 | &config_dir, 178 | matches.get_one::("installable").cloned(), 179 | ); 180 | 181 | let get_requisites_duration = initial_time.elapsed().as_secs(); 182 | 183 | println!("Found Nix Requisites in {get_requisites_duration} seconds"); 184 | 185 | let network_time = Instant::now(); 186 | 187 | let lines = binding 188 | .lines() 189 | .map(std::borrow::ToOwned::to_owned) 190 | .collect::>(); 191 | 192 | let count = lines.len(); 193 | 194 | let tasks = lines 195 | .into_iter() 196 | .map(|hash| { 197 | let client = client.clone(); 198 | // FIXME: ewww yuck eww 199 | let domain = cache.domain.clone(); 200 | let ip = cache.ips[0]; 201 | tokio::spawn(async move { 202 | log::trace!("connecting to {domain} {:#?} for {hash}", ip); 203 | net::nar_exists(client, &domain, &hash, SLIDE).await 204 | }) 205 | }) 206 | .collect_vec(); 207 | 208 | let sum: usize = join_all(tasks) 209 | .await 210 | .into_iter() 211 | .map(|result| result.unwrap()) 212 | .sum(); 213 | 214 | println!( 215 | "Checked {count} packages in {} seconds", 216 | network_time.elapsed().as_secs() 217 | ); 218 | 219 | #[allow(clippy::cast_precision_loss)] 220 | let percentage = (sum as f64 / count as f64) * 100.; 221 | 222 | println!("Found {sum:#?}/{count} ({percentage:.2}%) in cache"); 223 | } 224 | 225 | Ok(()) 226 | } 227 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "advisory-db": { 4 | "flake": false, 5 | "locked": { 6 | "lastModified": 1725558019, 7 | "narHash": "sha256-4dhSDMbVg+cZ3BBCXl7wJ08Co5wKQjoT+OkBxbOJbZo=", 8 | "owner": "rustsec", 9 | "repo": "advisory-db", 10 | "rev": "9f0ebadc1ce8ef9b7ee7ba4a6128b5aa247a95d1", 11 | "type": "github" 12 | }, 13 | "original": { 14 | "owner": "rustsec", 15 | "repo": "advisory-db", 16 | "type": "github" 17 | } 18 | }, 19 | "crane": { 20 | "locked": { 21 | "lastModified": 1725409566, 22 | "narHash": "sha256-PrtLmqhM6UtJP7v7IGyzjBFhbG4eOAHT6LPYOFmYfbk=", 23 | "owner": "ipetkov", 24 | "repo": "crane", 25 | "rev": "7e4586bad4e3f8f97a9271def747cf58c4b68f3c", 26 | "type": "github" 27 | }, 28 | "original": { 29 | "owner": "ipetkov", 30 | "repo": "crane", 31 | "type": "github" 32 | } 33 | }, 34 | "fenix": { 35 | "inputs": { 36 | "nixpkgs": [ 37 | "nixpkgs" 38 | ], 39 | "rust-analyzer-src": [] 40 | }, 41 | "locked": { 42 | "lastModified": 1725517947, 43 | "narHash": "sha256-sB8B3M6CS0Y0rnncsCPz0htg6LoC1RbI2Mq9K88tSOk=", 44 | "owner": "nix-community", 45 | "repo": "fenix", 46 | "rev": "96072c2af73da16c7db013dbb8c8869000157235", 47 | "type": "github" 48 | }, 49 | "original": { 50 | "owner": "nix-community", 51 | "repo": "fenix", 52 | "type": "github" 53 | } 54 | }, 55 | "flake-compat": { 56 | "flake": false, 57 | "locked": { 58 | "lastModified": 1696426674, 59 | "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", 60 | "owner": "edolstra", 61 | "repo": "flake-compat", 62 | "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", 63 | "type": "github" 64 | }, 65 | "original": { 66 | "owner": "edolstra", 67 | "repo": "flake-compat", 68 | "type": "github" 69 | } 70 | }, 71 | "flake-utils": { 72 | "inputs": { 73 | "systems": "systems" 74 | }, 75 | "locked": { 76 | "lastModified": 1710146030, 77 | "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", 78 | "owner": "numtide", 79 | "repo": "flake-utils", 80 | "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", 81 | "type": "github" 82 | }, 83 | "original": { 84 | "owner": "numtide", 85 | "repo": "flake-utils", 86 | "type": "github" 87 | } 88 | }, 89 | "flake-utils_2": { 90 | "inputs": { 91 | "systems": "systems_2" 92 | }, 93 | "locked": { 94 | "lastModified": 1710146030, 95 | "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", 96 | "owner": "numtide", 97 | "repo": "flake-utils", 98 | "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", 99 | "type": "github" 100 | }, 101 | "original": { 102 | "owner": "numtide", 103 | "repo": "flake-utils", 104 | "type": "github" 105 | } 106 | }, 107 | "flakey-profile": { 108 | "locked": { 109 | "lastModified": 1712898590, 110 | "narHash": "sha256-FhGIEU93VHAChKEXx905TSiPZKga69bWl1VB37FK//I=", 111 | "owner": "lf-", 112 | "repo": "flakey-profile", 113 | "rev": "243c903fd8eadc0f63d205665a92d4df91d42d9d", 114 | "type": "github" 115 | }, 116 | "original": { 117 | "owner": "lf-", 118 | "repo": "flakey-profile", 119 | "type": "github" 120 | } 121 | }, 122 | "gitignore": { 123 | "inputs": { 124 | "nixpkgs": [ 125 | "nixpkgs" 126 | ] 127 | }, 128 | "locked": { 129 | "lastModified": 1709087332, 130 | "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", 131 | "owner": "hercules-ci", 132 | "repo": "gitignore.nix", 133 | "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", 134 | "type": "github" 135 | }, 136 | "original": { 137 | "owner": "hercules-ci", 138 | "repo": "gitignore.nix", 139 | "type": "github" 140 | } 141 | }, 142 | "lix": { 143 | "flake": false, 144 | "locked": { 145 | "lastModified": 1723511168, 146 | "narHash": "sha256-XDcqLVPcsMhORerIPuQ1XNALtDvG6QRA2dKyNrccXyg=", 147 | "rev": "f9a3bf6ccccf8ac6b1604c1a2980e3a565ae4f44", 148 | "type": "tarball", 149 | "url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/f9a3bf6ccccf8ac6b1604c1a2980e3a565ae4f44.tar.gz?rev=f9a3bf6ccccf8ac6b1604c1a2980e3a565ae4f44" 150 | }, 151 | "original": { 152 | "type": "tarball", 153 | "url": "https://git.lix.systems/lix-project/lix/archive/main.tar.gz" 154 | } 155 | }, 156 | "lix-module": { 157 | "inputs": { 158 | "flake-utils": "flake-utils_2", 159 | "flakey-profile": "flakey-profile", 160 | "lix": "lix", 161 | "nixpkgs": [ 162 | "nixpkgs" 163 | ] 164 | }, 165 | "locked": { 166 | "lastModified": 1723511483, 167 | "narHash": "sha256-rT/OkVXKkns2YvyF1nFvl+8Gc3sld1c1sXPtGkbqaDY=", 168 | "ref": "main", 169 | "rev": "cecf70b77539c1a593f60ec9d0305b5e537ab6a9", 170 | "revCount": 106, 171 | "type": "git", 172 | "url": "https://git.lix.systems/lix-project/nixos-module" 173 | }, 174 | "original": { 175 | "ref": "main", 176 | "type": "git", 177 | "url": "https://git.lix.systems/lix-project/nixos-module" 178 | } 179 | }, 180 | "nixpkgs": { 181 | "locked": { 182 | "lastModified": 1725534445, 183 | "narHash": "sha256-Yd0FK9SkWy+ZPuNqUgmVPXokxDgMJoGuNpMEtkfcf84=", 184 | "owner": "NixOS", 185 | "repo": "nixpkgs", 186 | "rev": "9bb1e7571aadf31ddb4af77fc64b2d59580f9a39", 187 | "type": "github" 188 | }, 189 | "original": { 190 | "owner": "NixOS", 191 | "ref": "nixpkgs-unstable", 192 | "repo": "nixpkgs", 193 | "type": "github" 194 | } 195 | }, 196 | "nixpkgs-stable": { 197 | "locked": { 198 | "lastModified": 1725407940, 199 | "narHash": "sha256-tiN5Rlg/jiY0tyky+soJZoRzLKbPyIdlQ77xVgREDNM=", 200 | "owner": "NixOS", 201 | "repo": "nixpkgs", 202 | "rev": "6f6c45b5134a8ee2e465164811e451dcb5ad86e3", 203 | "type": "github" 204 | }, 205 | "original": { 206 | "owner": "NixOS", 207 | "ref": "nixos-24.05", 208 | "repo": "nixpkgs", 209 | "type": "github" 210 | } 211 | }, 212 | "pre-commit-hooks": { 213 | "inputs": { 214 | "flake-compat": [ 215 | "flake-compat" 216 | ], 217 | "gitignore": [ 218 | "gitignore" 219 | ], 220 | "nixpkgs": [ 221 | "nixpkgs" 222 | ], 223 | "nixpkgs-stable": [ 224 | "nixpkgs-stable" 225 | ] 226 | }, 227 | "locked": { 228 | "lastModified": 1725513492, 229 | "narHash": "sha256-tyMUA6NgJSvvQuzB7A1Sf8+0XCHyfSPRx/b00o6K0uo=", 230 | "owner": "cachix", 231 | "repo": "git-hooks.nix", 232 | "rev": "7570de7b9b504cfe92025dd1be797bf546f66528", 233 | "type": "github" 234 | }, 235 | "original": { 236 | "owner": "cachix", 237 | "repo": "git-hooks.nix", 238 | "type": "github" 239 | } 240 | }, 241 | "root": { 242 | "inputs": { 243 | "advisory-db": "advisory-db", 244 | "crane": "crane", 245 | "fenix": "fenix", 246 | "flake-compat": "flake-compat", 247 | "flake-utils": "flake-utils", 248 | "gitignore": "gitignore", 249 | "lix-module": "lix-module", 250 | "nixpkgs": "nixpkgs", 251 | "nixpkgs-stable": "nixpkgs-stable", 252 | "pre-commit-hooks": "pre-commit-hooks", 253 | "rust-overlay": "rust-overlay", 254 | "treefmt-nix": "treefmt-nix" 255 | } 256 | }, 257 | "rust-overlay": { 258 | "inputs": { 259 | "nixpkgs": [ 260 | "nixpkgs" 261 | ] 262 | }, 263 | "locked": { 264 | "lastModified": 1725589472, 265 | "narHash": "sha256-+OB00N6Yql/ZRQQkQ0PNnxfW2tH89DHnv29hBS7tXMM=", 266 | "owner": "oxalica", 267 | "repo": "rust-overlay", 268 | "rev": "2b00881d2ff72174cffdc007238cb6bedd6e1d8e", 269 | "type": "github" 270 | }, 271 | "original": { 272 | "owner": "oxalica", 273 | "repo": "rust-overlay", 274 | "type": "github" 275 | } 276 | }, 277 | "systems": { 278 | "locked": { 279 | "lastModified": 1681028828, 280 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 281 | "owner": "nix-systems", 282 | "repo": "default", 283 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 284 | "type": "github" 285 | }, 286 | "original": { 287 | "owner": "nix-systems", 288 | "repo": "default", 289 | "type": "github" 290 | } 291 | }, 292 | "systems_2": { 293 | "locked": { 294 | "lastModified": 1681028828, 295 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 296 | "owner": "nix-systems", 297 | "repo": "default", 298 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 299 | "type": "github" 300 | }, 301 | "original": { 302 | "owner": "nix-systems", 303 | "repo": "default", 304 | "type": "github" 305 | } 306 | }, 307 | "treefmt-nix": { 308 | "inputs": { 309 | "nixpkgs": [ 310 | "nixpkgs" 311 | ] 312 | }, 313 | "locked": { 314 | "lastModified": 1725271838, 315 | "narHash": "sha256-VcqxWT0O/gMaeWTTjf1r4MOyG49NaNxW4GHTO3xuThE=", 316 | "owner": "numtide", 317 | "repo": "treefmt-nix", 318 | "rev": "9fb342d14b69aefdf46187f6bb80a4a0d97007cd", 319 | "type": "github" 320 | }, 321 | "original": { 322 | "owner": "numtide", 323 | "repo": "treefmt-nix", 324 | "type": "github" 325 | } 326 | } 327 | }, 328 | "root": "root", 329 | "version": 7 330 | } 331 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Christina Sørensen 2 | # 3 | # SPDX-License-Identifier: EUPL-1.2 4 | 5 | { 6 | description = "Nix Weather - Check Cache Availability of NixOS Configurations"; 7 | 8 | inputs = { 9 | nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 10 | 11 | lix-module = { 12 | url = "git+https://git.lix.systems/lix-project/nixos-module?ref=main"; 13 | inputs.nixpkgs.follows = "nixpkgs"; 14 | }; 15 | 16 | crane.url = "github:ipetkov/crane"; 17 | 18 | fenix = { 19 | url = "github:nix-community/fenix"; 20 | inputs.nixpkgs.follows = "nixpkgs"; 21 | inputs.rust-analyzer-src.follows = ""; 22 | }; 23 | 24 | gitignore = { 25 | url = "github:hercules-ci/gitignore.nix"; 26 | inputs.nixpkgs.follows = "nixpkgs"; 27 | }; 28 | nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-24.05"; 29 | 30 | flake-compat = { 31 | url = "github:edolstra/flake-compat"; 32 | flake = false; 33 | }; 34 | 35 | flake-utils.url = "github:numtide/flake-utils"; 36 | 37 | advisory-db = { 38 | url = "github:rustsec/advisory-db"; 39 | flake = false; 40 | }; 41 | 42 | treefmt-nix = { 43 | url = "github:numtide/treefmt-nix"; 44 | inputs.nixpkgs.follows = "nixpkgs"; 45 | }; 46 | 47 | rust-overlay = { 48 | url = "github:oxalica/rust-overlay"; 49 | inputs = { 50 | nixpkgs.follows = "nixpkgs"; 51 | }; 52 | }; 53 | 54 | pre-commit-hooks = { 55 | url = "github:cachix/git-hooks.nix"; 56 | inputs = { 57 | nixpkgs.follows = "nixpkgs"; 58 | nixpkgs-stable.follows = "nixpkgs-stable"; 59 | flake-compat.follows = "flake-compat"; 60 | gitignore.follows = "gitignore"; 61 | }; 62 | }; 63 | 64 | }; 65 | 66 | outputs = 67 | { 68 | self, 69 | nixpkgs, 70 | crane, 71 | treefmt-nix, 72 | fenix, 73 | flake-utils, 74 | rust-overlay, 75 | advisory-db, 76 | pre-commit-hooks, 77 | lix-module, 78 | ... 79 | }: 80 | flake-utils.lib.eachDefaultSystem ( 81 | system: 82 | let 83 | overlays = [ (import rust-overlay) ]; 84 | 85 | pkgs = (import nixpkgs) { inherit system overlays; }; 86 | 87 | inherit (pkgs) lib; 88 | 89 | toolchain = pkgs.rust-bin.fromRustupToolchainFile ./.config/rust-toolchain.toml; 90 | 91 | craneLib = (crane.mkLib pkgs).overrideToolchain toolchain; 92 | src = craneLib.cleanCargoSource ./.; 93 | 94 | # Common arguments can be set here to avoid repeating them later 95 | commonArgs = { 96 | inherit src; 97 | strictDeps = true; 98 | 99 | nativeBuildInputs = [ pkgs.pkg-config ]; 100 | 101 | buildInputs = 102 | [ 103 | pkgs.openssl.dev 104 | pkgs.installShellFiles 105 | ] 106 | ++ lib.optionals pkgs.stdenv.isDarwin [ 107 | # Additional darwin specific inputs can be set here 108 | pkgs.libiconv 109 | pkgs.darwin.apple_sdk.frameworks.Security 110 | pkgs.darwin.apple_sdk.frameworks.SystemConfiguration 111 | ]; 112 | 113 | # Additional environment variables can be set directly 114 | # MY_CUSTOM_VAR = "some value"; 115 | }; 116 | 117 | craneLibLLvmTools = craneLib.overrideToolchain ( 118 | fenix.packages.${system}.complete.withComponents [ 119 | "cargo" 120 | "llvm-tools" 121 | "rustc" 122 | ] 123 | ); 124 | 125 | # Build *just* the cargo dependencies (of the entire workspace), 126 | # so we can reuse all of that work (e.g. via cachix) when running in CI 127 | # It is *highly* recommended to use something like cargo-hakari to avoid 128 | # cache misses when building individual top-level-crates 129 | cargoArtifacts = craneLib.buildDepsOnly commonArgs; 130 | 131 | individualCrateArgs = commonArgs // { 132 | inherit cargoArtifacts; 133 | inherit (craneLib.crateNameFromCargoToml { inherit src; }) version; 134 | # NB: we disable tests since we'll run them all via cargo-nextest 135 | doCheck = false; 136 | }; 137 | 138 | fileSetForCrate = 139 | crate: 140 | lib.fileset.toSource { 141 | root = ./.; 142 | fileset = lib.fileset.unions [ 143 | ./Cargo.toml 144 | ./Cargo.lock 145 | ./crates/common 146 | ./crates/workspace-hack 147 | crate 148 | ]; 149 | }; 150 | 151 | # Build the top-level crates of the workspace as individual derivations. 152 | # This allows consumers to only depend on (and build) only what they need. 153 | # Though it is possible to build the entire workspace as a single derivation, 154 | # so this is left up to you on how to organize things 155 | nix-weather = craneLib.buildPackage ( 156 | individualCrateArgs 157 | // { 158 | pname = "nix-weather"; 159 | cargoExtraArgs = "-p nix-weather"; 160 | src = fileSetForCrate ./crates/nix-weather; 161 | MAN_OUT = "./man"; 162 | 163 | preInstall = '' 164 | cd crates/nix-weather 165 | installManPage man/nix-weather.1 166 | installShellCompletion \ 167 | --fish man/nix-weather.fish \ 168 | --bash man/nix-weather.bash \ 169 | --zsh man/_nix-weather 170 | mkdir -p $out 171 | cd ../.. 172 | ''; 173 | 174 | meta = { 175 | mainProgram = "nix-weather"; 176 | }; 177 | } 178 | ); 179 | 180 | treefmtEval = treefmt-nix.lib.evalModule pkgs .config/treefmt.nix; 181 | in 182 | { 183 | formatter = treefmtEval.config.build.wrapper; 184 | 185 | checks = { 186 | # Build the crates as part of `nix flake check` for convenience 187 | inherit nix-weather; 188 | 189 | # Run clippy (and deny all warnings) on the workspace source, 190 | # again, reusing the dependency artifacts from above. 191 | # 192 | # Note that this is done as a separate derivation so that 193 | # we can block the CI if there are issues here, but not 194 | # prevent downstream consumers from building our crate by itself. 195 | cargo-workspace-clippy = craneLib.cargoClippy ( 196 | commonArgs 197 | // { 198 | inherit cargoArtifacts; 199 | cargoClippyExtraArgs = "--all-targets -- --deny warnings"; 200 | } 201 | ); 202 | 203 | cargo-workspace-doc = craneLib.cargoDoc (commonArgs // { inherit cargoArtifacts; }); 204 | 205 | # Check formatting 206 | cargo-workspace-fmt = craneLib.cargoFmt { inherit src; }; 207 | 208 | # Audit dependencies 209 | cargo-workspace-audit = craneLib.cargoAudit { inherit src advisory-db; }; 210 | 211 | # Audit licenses 212 | cargo-workspace-deny = craneLib.cargoDeny { inherit src; }; 213 | 214 | # Run tests with cargo-nextest 215 | # Consider setting `doCheck = false` on other crate derivations 216 | # if you do not want the tests to run twice 217 | cargo-workspace-nextest = craneLib.cargoNextest ( 218 | commonArgs 219 | // { 220 | inherit cargoArtifacts; 221 | partitions = 1; 222 | partitionType = "count"; 223 | } 224 | ); 225 | 226 | # Ensure that cargo-hakari is up to date 227 | cargo-workspace-hakari = craneLib.mkCargoDerivation { 228 | inherit src; 229 | pname = "cargo-workspace-hakari"; 230 | cargoArtifacts = null; 231 | doInstallCargoArtifacts = false; 232 | 233 | buildPhaseCargoCommand = '' 234 | cargo hakari generate --diff # workspace-hack Cargo.toml is up-to-date 235 | cargo hakari manage-deps --dry-run # all workspace crates depend on workspace-hack 236 | cargo hakari verify 237 | ''; 238 | 239 | nativeBuildInputs = [ pkgs.cargo-hakari ]; 240 | }; 241 | pre-commit-check = 242 | let 243 | # some treefmt formatters are not supported in pre-commit-hooks we filter them out for now. 244 | toFilter = [ 245 | "yamlfmt" 246 | "nixfmt" 247 | ]; 248 | filterFn = n: _v: (!builtins.elem n toFilter); 249 | treefmtFormatters = pkgs.lib.mapAttrs (_n: v: { inherit (v) enable; }) ( 250 | pkgs.lib.filterAttrs filterFn (import ./.config/treefmt.nix).programs 251 | ); 252 | in 253 | pre-commit-hooks.lib.${system}.run { 254 | src = ./.; 255 | hooks = treefmtFormatters // { 256 | # not in treefmt 257 | convco.enable = true; 258 | # named nixfmt in treefmt (which defaults to nixfmt-classic for pre-commit-hooks) 259 | nixfmt-rfc-style.enable = true; 260 | reuse = { 261 | enable = true; 262 | name = "reuse"; 263 | entry = with pkgs; "${reuse}/bin/reuse lint"; 264 | pass_filenames = false; 265 | }; 266 | }; 267 | }; 268 | formatting = treefmtEval.config.build.check self; 269 | }; 270 | 271 | packages = 272 | { 273 | inherit nix-weather; 274 | default = nix-weather; 275 | } 276 | // lib.optionalAttrs (!pkgs.stdenv.isDarwin) { 277 | cargo-workspace-llvm-coverage = craneLibLLvmTools.cargoLlvmCov ( 278 | commonArgs // { inherit cargoArtifacts; } 279 | ); 280 | }; 281 | 282 | apps = { 283 | nix-weather = flake-utils.lib.mkApp { drv = nix-weather; }; 284 | }; 285 | 286 | # For `nix develop`: 287 | devShells.default = craneLib.devShell { 288 | # Inherit inputs from checks. 289 | checks = self.checks.${system}; 290 | 291 | # Additional dev-shell environment variables can be set directly 292 | # MY_CUSTOM_DEVELOPMENT_VAR = "something else"; 293 | 294 | # Extra inputs can be added here; cargo and rustc are provided by default. 295 | packages = [ 296 | toolchain 297 | pkgs.fd 298 | pkgs.rustup 299 | pkgs.cargo-hakari 300 | pkgs.reuse 301 | pkgs.just 302 | lix-module.packages.${system}.default 303 | # TODO: deduplicate 304 | pkgs.openssl.dev 305 | pkgs.pkg-config 306 | ]; 307 | 308 | inherit (self.checks.${system}.pre-commit-check) shellHook; 309 | }; 310 | } 311 | ); 312 | nixConfig = { 313 | experimental-features = [ 314 | "nix-command" 315 | "flakes" 316 | "pipe-operator" 317 | "repl-flake" 318 | ]; 319 | }; 320 | } 321 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | EUROPEAN UNION PUBLIC LICENCE v. 1.2 2 | EUPL © the European Union 2007, 2016 3 | 4 | This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined below) which is provided under the 5 | terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such 6 | use is covered by a right of the copyright holder of the Work). 7 | The Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following 8 | notice immediately following the copyright notice for the Work: 9 | Licensed under the EUPL 10 | or has expressed by any other means his willingness to license under the EUPL. 11 | 12 | 1.Definitions 13 | In this Licence, the following terms have the following meaning: 14 | — ‘The Licence’:this Licence. 15 | — ‘The Original Work’:the work or software distributed or communicated by the Licensor under this Licence, available 16 | as Source Code and also as Executable Code as the case may be. 17 | — ‘Derivative Works’:the works or software that could be created by the Licensee, based upon the Original Work or 18 | modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work 19 | required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in 20 | the country mentioned in Article 15. 21 | — ‘The Work’:the Original Work or its Derivative Works. 22 | — ‘The Source Code’:the human-readable form of the Work which is the most convenient for people to study and 23 | modify. 24 | — ‘The Executable Code’:any code which has generally been compiled and which is meant to be interpreted by 25 | a computer as a program. 26 | — ‘The Licensor’:the natural or legal person that distributes or communicates the Work under the Licence. 27 | — ‘Contributor(s)’:any natural or legal person who modifies the Work under the Licence, or otherwise contributes to 28 | the creation of a Derivative Work. 29 | — ‘The Licensee’ or ‘You’:any natural or legal person who makes any usage of the Work under the terms of the 30 | Licence. 31 | — ‘Distribution’ or ‘Communication’:any act of selling, giving, lending, renting, distributing, communicating, 32 | transmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential 33 | functionalities at the disposal of any other natural or legal person. 34 | 35 | 2.Scope of the rights granted by the Licence 36 | The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for 37 | the duration of copyright vested in the Original Work: 38 | — use the Work in any circumstance and for all usage, 39 | — reproduce the Work, 40 | — modify the Work, and make Derivative Works based upon the Work, 41 | — communicate to the public, including the right to make available or display the Work or copies thereof to the public 42 | and perform publicly, as the case may be, the Work, 43 | — distribute the Work or copies thereof, 44 | — lend and rent the Work or copies thereof, 45 | — sublicense rights in the Work or copies thereof. 46 | Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the 47 | applicable law permits so. 48 | In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed 49 | by law in order to make effective the licence of the economic rights here above listed. 50 | The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the 51 | extent necessary to make use of the rights granted on the Work under this Licence. 52 | 53 | 3.Communication of the Source Code 54 | The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as 55 | Executable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with 56 | each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to 57 | the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to 58 | distribute or communicate the Work. 59 | 60 | 4.Limitations on copyright 61 | Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the 62 | exclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations 63 | thereto. 64 | 65 | 5.Obligations of the Licensee 66 | The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those 67 | obligations are the following: 68 | 69 | Attribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to 70 | the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the 71 | Licence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work 72 | to carry prominent notices stating that the Work has been modified and the date of modification. 73 | 74 | Copyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this 75 | Distribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless 76 | the Original Work is expressly distributed only under this version of the Licence — for example by communicating 77 | ‘EUPL v. 1.2 only’. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the 78 | Work or Derivative Work that alter or restrict the terms of the Licence. 79 | 80 | Compatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both 81 | the Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done 82 | under the terms of this Compatible Licence. For the sake of this clause, ‘Compatible Licence’ refers to the licences listed 83 | in the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with 84 | his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail. 85 | 86 | Provision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide 87 | a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available 88 | for as long as the Licensee continues to distribute or communicate the Work. 89 | Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names 90 | of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and 91 | reproducing the content of the copyright notice. 92 | 93 | 6.Chain of Authorship 94 | The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or 95 | licensed to him/her and that he/she has the power and authority to grant the Licence. 96 | Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or 97 | licensed to him/her and that he/she has the power and authority to grant the Licence. 98 | Each time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions 99 | to the Work, under the terms of this Licence. 100 | 101 | 7.Disclaimer of Warranty 102 | The Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work 103 | and may therefore contain defects or ‘bugs’ inherent to this type of development. 104 | For the above reason, the Work is provided under the Licence on an ‘as is’ basis and without warranties of any kind 105 | concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or 106 | errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this 107 | Licence. 108 | This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work. 109 | 110 | 8.Disclaimer of Liability 111 | Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be 112 | liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the 113 | Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss 114 | of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However, 115 | the Licensor will be liable under statutory product liability laws as far such laws apply to the Work. 116 | 117 | 9.Additional agreements 118 | While distributing the Work, You may choose to conclude an additional agreement, defining obligations or services 119 | consistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole 120 | responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify, 121 | defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by 122 | the fact You have accepted any warranty or additional liability. 123 | 124 | 10.Acceptance of the Licence 125 | The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ placed under the bottom of a window 126 | displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of 127 | applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms 128 | and conditions. 129 | Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You 130 | by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution 131 | or Communication by You of the Work or copies thereof. 132 | 133 | 11.Information to the public 134 | In case of any Distribution or Communication of the Work by means of electronic communication by You (for example, 135 | by offering to download the Work from a remote location) the distribution channel or media (for example, a website) 136 | must at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence 137 | and the way it may be accessible, concluded, stored and reproduced by the Licensee. 138 | 139 | 12.Termination of the Licence 140 | The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms 141 | of the Licence. 142 | Such a termination will not terminate the licences of any person who has received the Work from the Licensee under 143 | the Licence, provided such persons remain in full compliance with the Licence. 144 | 145 | 13.Miscellaneous 146 | Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the 147 | Work. 148 | If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or 149 | enforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid 150 | and enforceable. 151 | The European Commission may publish other linguistic versions or new versions of this Licence or updated versions of 152 | the Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence. 153 | New versions of the Licence will be published with a unique version number. 154 | All linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take 155 | advantage of the linguistic version of their choice. 156 | 157 | 14.Jurisdiction 158 | Without prejudice to specific agreement between parties, 159 | — any litigation resulting from the interpretation of this License, arising between the European Union institutions, 160 | bodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice 161 | of the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union, 162 | — any litigation arising between other parties and resulting from the interpretation of this License, will be subject to 163 | the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business. 164 | 165 | 15.Applicable Law 166 | Without prejudice to specific agreement between parties, 167 | — this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat, 168 | resides or has his registered office, 169 | — this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside 170 | a European Union Member State. 171 | 172 | 173 | Appendix 174 | 175 | ‘Compatible Licences’ according to Article 5 EUPL are: 176 | — GNU General Public License (GPL) v. 2, v. 3 177 | — GNU Affero General Public License (AGPL) v. 3 178 | — Open Software License (OSL) v. 2.1, v. 3.0 179 | — Eclipse Public License (EPL) v. 1.0 180 | — CeCILL v. 2.0, v. 2.1 181 | — Mozilla Public Licence (MPL) v. 2 182 | — GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 183 | — Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software 184 | — European Union Public Licence (EUPL) v. 1.1, v. 1.2 185 | — Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+). 186 | 187 | The European Commission may update this Appendix to later versions of the above licences without producing 188 | a new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the 189 | covered Source Code from exclusive appropriation. 190 | All other changes or additions to this Appendix require the production of a new EUPL version. 191 | -------------------------------------------------------------------------------- /LICENSES/EUPL-1.2.txt: -------------------------------------------------------------------------------- 1 | EUROPEAN UNION PUBLIC LICENCE v. 1.2 2 | EUPL © the European Union 2007, 2016 3 | 4 | This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined below) which is provided under the 5 | terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such 6 | use is covered by a right of the copyright holder of the Work). 7 | The Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following 8 | notice immediately following the copyright notice for the Work: 9 | Licensed under the EUPL 10 | or has expressed by any other means his willingness to license under the EUPL. 11 | 12 | 1.Definitions 13 | In this Licence, the following terms have the following meaning: 14 | — ‘The Licence’:this Licence. 15 | — ‘The Original Work’:the work or software distributed or communicated by the Licensor under this Licence, available 16 | as Source Code and also as Executable Code as the case may be. 17 | — ‘Derivative Works’:the works or software that could be created by the Licensee, based upon the Original Work or 18 | modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work 19 | required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in 20 | the country mentioned in Article 15. 21 | — ‘The Work’:the Original Work or its Derivative Works. 22 | — ‘The Source Code’:the human-readable form of the Work which is the most convenient for people to study and 23 | modify. 24 | — ‘The Executable Code’:any code which has generally been compiled and which is meant to be interpreted by 25 | a computer as a program. 26 | — ‘The Licensor’:the natural or legal person that distributes or communicates the Work under the Licence. 27 | — ‘Contributor(s)’:any natural or legal person who modifies the Work under the Licence, or otherwise contributes to 28 | the creation of a Derivative Work. 29 | — ‘The Licensee’ or ‘You’:any natural or legal person who makes any usage of the Work under the terms of the 30 | Licence. 31 | — ‘Distribution’ or ‘Communication’:any act of selling, giving, lending, renting, distributing, communicating, 32 | transmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential 33 | functionalities at the disposal of any other natural or legal person. 34 | 35 | 2.Scope of the rights granted by the Licence 36 | The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for 37 | the duration of copyright vested in the Original Work: 38 | — use the Work in any circumstance and for all usage, 39 | — reproduce the Work, 40 | — modify the Work, and make Derivative Works based upon the Work, 41 | — communicate to the public, including the right to make available or display the Work or copies thereof to the public 42 | and perform publicly, as the case may be, the Work, 43 | — distribute the Work or copies thereof, 44 | — lend and rent the Work or copies thereof, 45 | — sublicense rights in the Work or copies thereof. 46 | Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the 47 | applicable law permits so. 48 | In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed 49 | by law in order to make effective the licence of the economic rights here above listed. 50 | The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the 51 | extent necessary to make use of the rights granted on the Work under this Licence. 52 | 53 | 3.Communication of the Source Code 54 | The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as 55 | Executable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with 56 | each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to 57 | the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to 58 | distribute or communicate the Work. 59 | 60 | 4.Limitations on copyright 61 | Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the 62 | exclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations 63 | thereto. 64 | 65 | 5.Obligations of the Licensee 66 | The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those 67 | obligations are the following: 68 | 69 | Attribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to 70 | the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the 71 | Licence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work 72 | to carry prominent notices stating that the Work has been modified and the date of modification. 73 | 74 | Copyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this 75 | Distribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless 76 | the Original Work is expressly distributed only under this version of the Licence — for example by communicating 77 | ‘EUPL v. 1.2 only’. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the 78 | Work or Derivative Work that alter or restrict the terms of the Licence. 79 | 80 | Compatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both 81 | the Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done 82 | under the terms of this Compatible Licence. For the sake of this clause, ‘Compatible Licence’ refers to the licences listed 83 | in the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with 84 | his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail. 85 | 86 | Provision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide 87 | a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available 88 | for as long as the Licensee continues to distribute or communicate the Work. 89 | Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names 90 | of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and 91 | reproducing the content of the copyright notice. 92 | 93 | 6.Chain of Authorship 94 | The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or 95 | licensed to him/her and that he/she has the power and authority to grant the Licence. 96 | Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or 97 | licensed to him/her and that he/she has the power and authority to grant the Licence. 98 | Each time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions 99 | to the Work, under the terms of this Licence. 100 | 101 | 7.Disclaimer of Warranty 102 | The Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work 103 | and may therefore contain defects or ‘bugs’ inherent to this type of development. 104 | For the above reason, the Work is provided under the Licence on an ‘as is’ basis and without warranties of any kind 105 | concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or 106 | errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this 107 | Licence. 108 | This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work. 109 | 110 | 8.Disclaimer of Liability 111 | Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be 112 | liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the 113 | Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss 114 | of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However, 115 | the Licensor will be liable under statutory product liability laws as far such laws apply to the Work. 116 | 117 | 9.Additional agreements 118 | While distributing the Work, You may choose to conclude an additional agreement, defining obligations or services 119 | consistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole 120 | responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify, 121 | defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by 122 | the fact You have accepted any warranty or additional liability. 123 | 124 | 10.Acceptance of the Licence 125 | The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ placed under the bottom of a window 126 | displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of 127 | applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms 128 | and conditions. 129 | Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You 130 | by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution 131 | or Communication by You of the Work or copies thereof. 132 | 133 | 11.Information to the public 134 | In case of any Distribution or Communication of the Work by means of electronic communication by You (for example, 135 | by offering to download the Work from a remote location) the distribution channel or media (for example, a website) 136 | must at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence 137 | and the way it may be accessible, concluded, stored and reproduced by the Licensee. 138 | 139 | 12.Termination of the Licence 140 | The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms 141 | of the Licence. 142 | Such a termination will not terminate the licences of any person who has received the Work from the Licensee under 143 | the Licence, provided such persons remain in full compliance with the Licence. 144 | 145 | 13.Miscellaneous 146 | Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the 147 | Work. 148 | If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or 149 | enforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid 150 | and enforceable. 151 | The European Commission may publish other linguistic versions or new versions of this Licence or updated versions of 152 | the Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence. 153 | New versions of the Licence will be published with a unique version number. 154 | All linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take 155 | advantage of the linguistic version of their choice. 156 | 157 | 14.Jurisdiction 158 | Without prejudice to specific agreement between parties, 159 | — any litigation resulting from the interpretation of this License, arising between the European Union institutions, 160 | bodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice 161 | of the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union, 162 | — any litigation arising between other parties and resulting from the interpretation of this License, will be subject to 163 | the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business. 164 | 165 | 15.Applicable Law 166 | Without prejudice to specific agreement between parties, 167 | — this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat, 168 | resides or has his registered office, 169 | — this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside 170 | a European Union Member State. 171 | 172 | 173 | Appendix 174 | 175 | ‘Compatible Licences’ according to Article 5 EUPL are: 176 | — GNU General Public License (GPL) v. 2, v. 3 177 | — GNU Affero General Public License (AGPL) v. 3 178 | — Open Software License (OSL) v. 2.1, v. 3.0 179 | — Eclipse Public License (EPL) v. 1.0 180 | — CeCILL v. 2.0, v. 2.1 181 | — Mozilla Public Licence (MPL) v. 2 182 | — GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 183 | — Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software 184 | — European Union Public Licence (EUPL) v. 1.1, v. 1.2 185 | — Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+). 186 | 187 | The European Commission may update this Appendix to later versions of the above licences without producing 188 | a new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the 189 | covered Source Code from exclusive appropriation. 190 | All other changes or additions to this Appendix require the production of a new EUPL version. 191 | -------------------------------------------------------------------------------- /LICENSES/CC-BY-4.0.txt: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution 4.0 International 2 | 3 | Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. 4 | 5 | Using Creative Commons Public Licenses 6 | 7 | Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. 8 | 9 | Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. 10 | 11 | Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. 12 | 13 | Creative Commons Attribution 4.0 International Public License 14 | 15 | By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. 16 | 17 | Section 1 – Definitions. 18 | 19 | a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. 20 | 21 | b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. 22 | 23 | c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. 24 | 25 | d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. 26 | 27 | e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. 28 | 29 | f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. 30 | 31 | g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. 32 | 33 | h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. 34 | 35 | i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. 36 | 37 | j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. 38 | 39 | k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. 40 | 41 | Section 2 – Scope. 42 | 43 | a. License grant. 44 | 45 | 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: 46 | 47 | A. reproduce and Share the Licensed Material, in whole or in part; and 48 | 49 | B. produce, reproduce, and Share Adapted Material. 50 | 51 | 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 52 | 53 | 3. Term. The term of this Public License is specified in Section 6(a). 54 | 55 | 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. 56 | 57 | 5. Downstream recipients. 58 | 59 | A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. 60 | 61 | B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 62 | 63 | 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). 64 | 65 | b. Other rights. 66 | 67 | 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 68 | 69 | 2. Patent and trademark rights are not licensed under this Public License. 70 | 71 | 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. 72 | 73 | Section 3 – License Conditions. 74 | 75 | Your exercise of the Licensed Rights is expressly made subject to the following conditions. 76 | 77 | a. Attribution. 78 | 79 | 1. If You Share the Licensed Material (including in modified form), You must: 80 | 81 | A. retain the following if it is supplied by the Licensor with the Licensed Material: 82 | 83 | i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); 84 | 85 | ii. a copyright notice; 86 | 87 | iii. a notice that refers to this Public License; 88 | 89 | iv. a notice that refers to the disclaimer of warranties; 90 | 91 | v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; 92 | 93 | B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and 94 | 95 | C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 96 | 97 | 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 98 | 99 | 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 100 | 101 | 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. 102 | 103 | Section 4 – Sui Generis Database Rights. 104 | 105 | Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: 106 | 107 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; 108 | 109 | b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and 110 | 111 | c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. 112 | For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. 113 | 114 | Section 5 – Disclaimer of Warranties and Limitation of Liability. 115 | 116 | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. 117 | 118 | b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. 119 | 120 | c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. 121 | 122 | Section 6 – Term and Termination. 123 | 124 | a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. 125 | 126 | b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 127 | 128 | 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 129 | 130 | 2. upon express reinstatement by the Licensor. 131 | 132 | c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. 133 | 134 | d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. 135 | 136 | e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. 137 | 138 | Section 7 – Other Terms and Conditions. 139 | 140 | a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. 141 | 142 | b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. 143 | 144 | Section 8 – Interpretation. 145 | 146 | a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. 147 | 148 | b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. 149 | 150 | c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. 151 | 152 | d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. 153 | 154 | Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. 155 | 156 | Creative Commons may be contacted at creativecommons.org. 157 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.22.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "adler2" 22 | version = "2.0.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 25 | 26 | [[package]] 27 | name = "ahash" 28 | version = "0.8.11" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 31 | dependencies = [ 32 | "cfg-if", 33 | "getrandom", 34 | "once_cell", 35 | "version_check", 36 | "zerocopy", 37 | ] 38 | 39 | [[package]] 40 | name = "aho-corasick" 41 | version = "1.1.3" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 44 | dependencies = [ 45 | "memchr", 46 | ] 47 | 48 | [[package]] 49 | name = "anstream" 50 | version = "0.6.15" 51 | source = "registry+https://github.com/rust-lang/crates.io-index" 52 | checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" 53 | dependencies = [ 54 | "anstyle", 55 | "anstyle-parse", 56 | "anstyle-query", 57 | "anstyle-wincon", 58 | "colorchoice", 59 | "is_terminal_polyfill", 60 | "utf8parse", 61 | ] 62 | 63 | [[package]] 64 | name = "anstyle" 65 | version = "1.0.8" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" 68 | 69 | [[package]] 70 | name = "anstyle-parse" 71 | version = "0.2.5" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" 74 | dependencies = [ 75 | "utf8parse", 76 | ] 77 | 78 | [[package]] 79 | name = "anstyle-query" 80 | version = "1.1.1" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" 83 | dependencies = [ 84 | "windows-sys 0.52.0", 85 | ] 86 | 87 | [[package]] 88 | name = "anstyle-wincon" 89 | version = "3.0.4" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" 92 | dependencies = [ 93 | "anstyle", 94 | "windows-sys 0.52.0", 95 | ] 96 | 97 | [[package]] 98 | name = "anyhow" 99 | version = "1.0.86" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" 102 | 103 | [[package]] 104 | name = "async-stream" 105 | version = "0.3.5" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" 108 | dependencies = [ 109 | "async-stream-impl", 110 | "futures-core", 111 | "pin-project-lite", 112 | ] 113 | 114 | [[package]] 115 | name = "async-stream-impl" 116 | version = "0.3.5" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" 119 | dependencies = [ 120 | "proc-macro2", 121 | "quote", 122 | "syn 2.0.77", 123 | ] 124 | 125 | [[package]] 126 | name = "async-trait" 127 | version = "0.1.82" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" 130 | dependencies = [ 131 | "proc-macro2", 132 | "quote", 133 | "syn 2.0.77", 134 | ] 135 | 136 | [[package]] 137 | name = "atomic-waker" 138 | version = "1.1.2" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 141 | 142 | [[package]] 143 | name = "autocfg" 144 | version = "1.3.0" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 147 | 148 | [[package]] 149 | name = "axum" 150 | version = "0.6.20" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" 153 | dependencies = [ 154 | "async-trait", 155 | "axum-core", 156 | "bitflags 1.3.2", 157 | "bytes", 158 | "futures-util", 159 | "http 0.2.12", 160 | "http-body 0.4.6", 161 | "hyper 0.14.30", 162 | "itoa", 163 | "matchit", 164 | "memchr", 165 | "mime", 166 | "percent-encoding", 167 | "pin-project-lite", 168 | "rustversion", 169 | "serde", 170 | "sync_wrapper 0.1.2", 171 | "tower", 172 | "tower-layer", 173 | "tower-service", 174 | ] 175 | 176 | [[package]] 177 | name = "axum-core" 178 | version = "0.3.4" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" 181 | dependencies = [ 182 | "async-trait", 183 | "bytes", 184 | "futures-util", 185 | "http 0.2.12", 186 | "http-body 0.4.6", 187 | "mime", 188 | "rustversion", 189 | "tower-layer", 190 | "tower-service", 191 | ] 192 | 193 | [[package]] 194 | name = "backtrace" 195 | version = "0.3.73" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" 198 | dependencies = [ 199 | "addr2line", 200 | "cc", 201 | "cfg-if", 202 | "libc", 203 | "miniz_oxide 0.7.4", 204 | "object", 205 | "rustc-demangle", 206 | ] 207 | 208 | [[package]] 209 | name = "base64" 210 | version = "0.21.7" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 213 | 214 | [[package]] 215 | name = "base64" 216 | version = "0.22.1" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 219 | 220 | [[package]] 221 | name = "bitflags" 222 | version = "1.3.2" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 225 | 226 | [[package]] 227 | name = "bitflags" 228 | version = "2.6.0" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 231 | 232 | [[package]] 233 | name = "bumpalo" 234 | version = "3.16.0" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 237 | 238 | [[package]] 239 | name = "byteorder" 240 | version = "1.5.0" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 243 | 244 | [[package]] 245 | name = "bytes" 246 | version = "1.7.1" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" 249 | 250 | [[package]] 251 | name = "cc" 252 | version = "1.1.16" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" 255 | dependencies = [ 256 | "shlex", 257 | ] 258 | 259 | [[package]] 260 | name = "cfg-if" 261 | version = "1.0.0" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 264 | 265 | [[package]] 266 | name = "clap" 267 | version = "4.5.16" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" 270 | dependencies = [ 271 | "clap_builder", 272 | ] 273 | 274 | [[package]] 275 | name = "clap_builder" 276 | version = "4.5.15" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" 279 | dependencies = [ 280 | "anstream", 281 | "anstyle", 282 | "clap_lex", 283 | "strsim", 284 | ] 285 | 286 | [[package]] 287 | name = "clap_complete" 288 | version = "4.5.25" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | checksum = "18d7f143a7e709cbe6c34853dcd3bb1370c7e1bb4d9e7310ca8cb40b490ae035" 291 | dependencies = [ 292 | "clap", 293 | ] 294 | 295 | [[package]] 296 | name = "clap_lex" 297 | version = "0.7.2" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" 300 | 301 | [[package]] 302 | name = "clap_mangen" 303 | version = "0.2.23" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "f17415fd4dfbea46e3274fcd8d368284519b358654772afb700dc2e8d2b24eeb" 306 | dependencies = [ 307 | "clap", 308 | "roff", 309 | ] 310 | 311 | [[package]] 312 | name = "colorchoice" 313 | version = "1.0.2" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" 316 | 317 | [[package]] 318 | name = "common" 319 | version = "0.0.4" 320 | dependencies = [ 321 | "workspace-hack", 322 | ] 323 | 324 | [[package]] 325 | name = "console-api" 326 | version = "0.6.0" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" 329 | dependencies = [ 330 | "futures-core", 331 | "prost", 332 | "prost-types", 333 | "tonic", 334 | "tracing-core", 335 | ] 336 | 337 | [[package]] 338 | name = "console-subscriber" 339 | version = "0.2.0" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" 342 | dependencies = [ 343 | "console-api", 344 | "crossbeam-channel", 345 | "crossbeam-utils", 346 | "futures-task", 347 | "hdrhistogram", 348 | "humantime", 349 | "prost-types", 350 | "serde", 351 | "serde_json", 352 | "thread_local", 353 | "tokio", 354 | "tokio-stream", 355 | "tonic", 356 | "tracing", 357 | "tracing-core", 358 | "tracing-subscriber", 359 | ] 360 | 361 | [[package]] 362 | name = "core-foundation" 363 | version = "0.9.4" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 366 | dependencies = [ 367 | "core-foundation-sys", 368 | "libc", 369 | ] 370 | 371 | [[package]] 372 | name = "core-foundation-sys" 373 | version = "0.8.7" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 376 | 377 | [[package]] 378 | name = "crc32fast" 379 | version = "1.4.2" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 382 | dependencies = [ 383 | "cfg-if", 384 | ] 385 | 386 | [[package]] 387 | name = "crossbeam-channel" 388 | version = "0.5.13" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" 391 | dependencies = [ 392 | "crossbeam-utils", 393 | ] 394 | 395 | [[package]] 396 | name = "crossbeam-deque" 397 | version = "0.8.5" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 400 | dependencies = [ 401 | "crossbeam-epoch", 402 | "crossbeam-utils", 403 | ] 404 | 405 | [[package]] 406 | name = "crossbeam-epoch" 407 | version = "0.9.18" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 410 | dependencies = [ 411 | "crossbeam-utils", 412 | ] 413 | 414 | [[package]] 415 | name = "crossbeam-utils" 416 | version = "0.8.20" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 419 | 420 | [[package]] 421 | name = "cssparser" 422 | version = "0.31.2" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "5b3df4f93e5fbbe73ec01ec8d3f68bba73107993a5b1e7519273c32db9b0d5be" 425 | dependencies = [ 426 | "cssparser-macros", 427 | "dtoa-short", 428 | "itoa", 429 | "phf 0.11.2", 430 | "smallvec", 431 | ] 432 | 433 | [[package]] 434 | name = "cssparser-macros" 435 | version = "0.6.1" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 438 | dependencies = [ 439 | "quote", 440 | "syn 2.0.77", 441 | ] 442 | 443 | [[package]] 444 | name = "deranged" 445 | version = "0.3.11" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 448 | dependencies = [ 449 | "powerfmt", 450 | ] 451 | 452 | [[package]] 453 | name = "derive_more" 454 | version = "0.99.18" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" 457 | dependencies = [ 458 | "proc-macro2", 459 | "quote", 460 | "syn 2.0.77", 461 | ] 462 | 463 | [[package]] 464 | name = "dns-lookup" 465 | version = "2.0.4" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "e5766087c2235fec47fafa4cfecc81e494ee679d0fd4a59887ea0919bfb0e4fc" 468 | dependencies = [ 469 | "cfg-if", 470 | "libc", 471 | "socket2", 472 | "windows-sys 0.48.0", 473 | ] 474 | 475 | [[package]] 476 | name = "domain" 477 | version = "0.9.3" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "e853e3f6d4c6e52a4d73a94c1810c66ad71958fbe24934a7119b447f425aed76" 480 | dependencies = [ 481 | "bytes", 482 | "futures-util", 483 | "libc", 484 | "octseq", 485 | "rand", 486 | "smallvec", 487 | "time", 488 | "tokio", 489 | ] 490 | 491 | [[package]] 492 | name = "dtoa" 493 | version = "1.0.9" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" 496 | 497 | [[package]] 498 | name = "dtoa-short" 499 | version = "0.3.5" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" 502 | dependencies = [ 503 | "dtoa", 504 | ] 505 | 506 | [[package]] 507 | name = "ego-tree" 508 | version = "0.6.3" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "12a0bb14ac04a9fcf170d0bbbef949b44cc492f4452bd20c095636956f653642" 511 | 512 | [[package]] 513 | name = "either" 514 | version = "1.13.0" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 517 | 518 | [[package]] 519 | name = "encoding_rs" 520 | version = "0.8.34" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 523 | dependencies = [ 524 | "cfg-if", 525 | ] 526 | 527 | [[package]] 528 | name = "env_logger" 529 | version = "0.10.2" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" 532 | dependencies = [ 533 | "humantime", 534 | "is-terminal", 535 | "log", 536 | "regex", 537 | "termcolor", 538 | ] 539 | 540 | [[package]] 541 | name = "equivalent" 542 | version = "1.0.1" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 545 | 546 | [[package]] 547 | name = "errno" 548 | version = "0.3.9" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 551 | dependencies = [ 552 | "libc", 553 | "windows-sys 0.52.0", 554 | ] 555 | 556 | [[package]] 557 | name = "fastrand" 558 | version = "2.1.1" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" 561 | 562 | [[package]] 563 | name = "flate2" 564 | version = "1.0.33" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" 567 | dependencies = [ 568 | "crc32fast", 569 | "miniz_oxide 0.8.0", 570 | ] 571 | 572 | [[package]] 573 | name = "fnv" 574 | version = "1.0.7" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 577 | 578 | [[package]] 579 | name = "foreign-types" 580 | version = "0.3.2" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 583 | dependencies = [ 584 | "foreign-types-shared", 585 | ] 586 | 587 | [[package]] 588 | name = "foreign-types-shared" 589 | version = "0.1.1" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 592 | 593 | [[package]] 594 | name = "form_urlencoded" 595 | version = "1.2.1" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 598 | dependencies = [ 599 | "percent-encoding", 600 | ] 601 | 602 | [[package]] 603 | name = "futf" 604 | version = "0.1.5" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 607 | dependencies = [ 608 | "mac", 609 | "new_debug_unreachable", 610 | ] 611 | 612 | [[package]] 613 | name = "futures" 614 | version = "0.3.30" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 617 | dependencies = [ 618 | "futures-channel", 619 | "futures-core", 620 | "futures-executor", 621 | "futures-io", 622 | "futures-sink", 623 | "futures-task", 624 | "futures-util", 625 | ] 626 | 627 | [[package]] 628 | name = "futures-channel" 629 | version = "0.3.30" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 632 | dependencies = [ 633 | "futures-core", 634 | "futures-sink", 635 | ] 636 | 637 | [[package]] 638 | name = "futures-core" 639 | version = "0.3.30" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 642 | 643 | [[package]] 644 | name = "futures-executor" 645 | version = "0.3.30" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 648 | dependencies = [ 649 | "futures-core", 650 | "futures-task", 651 | "futures-util", 652 | ] 653 | 654 | [[package]] 655 | name = "futures-io" 656 | version = "0.3.30" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 659 | 660 | [[package]] 661 | name = "futures-macro" 662 | version = "0.3.30" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 665 | dependencies = [ 666 | "proc-macro2", 667 | "quote", 668 | "syn 2.0.77", 669 | ] 670 | 671 | [[package]] 672 | name = "futures-sink" 673 | version = "0.3.30" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 676 | 677 | [[package]] 678 | name = "futures-task" 679 | version = "0.3.30" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 682 | 683 | [[package]] 684 | name = "futures-util" 685 | version = "0.3.30" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 688 | dependencies = [ 689 | "futures-channel", 690 | "futures-core", 691 | "futures-io", 692 | "futures-macro", 693 | "futures-sink", 694 | "futures-task", 695 | "memchr", 696 | "pin-project-lite", 697 | "pin-utils", 698 | "slab", 699 | ] 700 | 701 | [[package]] 702 | name = "fxhash" 703 | version = "0.2.1" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 706 | dependencies = [ 707 | "byteorder", 708 | ] 709 | 710 | [[package]] 711 | name = "gethostname" 712 | version = "0.4.3" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 715 | dependencies = [ 716 | "libc", 717 | "windows-targets 0.48.5", 718 | ] 719 | 720 | [[package]] 721 | name = "getopts" 722 | version = "0.2.21" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 725 | dependencies = [ 726 | "unicode-width", 727 | ] 728 | 729 | [[package]] 730 | name = "getrandom" 731 | version = "0.2.15" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 734 | dependencies = [ 735 | "cfg-if", 736 | "libc", 737 | "wasi", 738 | ] 739 | 740 | [[package]] 741 | name = "gimli" 742 | version = "0.29.0" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" 745 | 746 | [[package]] 747 | name = "h2" 748 | version = "0.3.26" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 751 | dependencies = [ 752 | "bytes", 753 | "fnv", 754 | "futures-core", 755 | "futures-sink", 756 | "futures-util", 757 | "http 0.2.12", 758 | "indexmap 2.5.0", 759 | "slab", 760 | "tokio", 761 | "tokio-util", 762 | "tracing", 763 | ] 764 | 765 | [[package]] 766 | name = "h2" 767 | version = "0.4.6" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" 770 | dependencies = [ 771 | "atomic-waker", 772 | "bytes", 773 | "fnv", 774 | "futures-core", 775 | "futures-sink", 776 | "http 1.1.0", 777 | "indexmap 2.5.0", 778 | "slab", 779 | "tokio", 780 | "tokio-util", 781 | "tracing", 782 | ] 783 | 784 | [[package]] 785 | name = "hashbrown" 786 | version = "0.12.3" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 789 | 790 | [[package]] 791 | name = "hashbrown" 792 | version = "0.14.5" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 795 | 796 | [[package]] 797 | name = "hdrhistogram" 798 | version = "7.5.4" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" 801 | dependencies = [ 802 | "base64 0.21.7", 803 | "byteorder", 804 | "flate2", 805 | "nom", 806 | "num-traits", 807 | ] 808 | 809 | [[package]] 810 | name = "hermit-abi" 811 | version = "0.3.9" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 814 | 815 | [[package]] 816 | name = "hermit-abi" 817 | version = "0.4.0" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 820 | 821 | [[package]] 822 | name = "html5ever" 823 | version = "0.26.0" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" 826 | dependencies = [ 827 | "log", 828 | "mac", 829 | "markup5ever", 830 | "proc-macro2", 831 | "quote", 832 | "syn 1.0.109", 833 | ] 834 | 835 | [[package]] 836 | name = "http" 837 | version = "0.2.12" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 840 | dependencies = [ 841 | "bytes", 842 | "fnv", 843 | "itoa", 844 | ] 845 | 846 | [[package]] 847 | name = "http" 848 | version = "1.1.0" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 851 | dependencies = [ 852 | "bytes", 853 | "fnv", 854 | "itoa", 855 | ] 856 | 857 | [[package]] 858 | name = "http-body" 859 | version = "0.4.6" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 862 | dependencies = [ 863 | "bytes", 864 | "http 0.2.12", 865 | "pin-project-lite", 866 | ] 867 | 868 | [[package]] 869 | name = "http-body" 870 | version = "1.0.1" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 873 | dependencies = [ 874 | "bytes", 875 | "http 1.1.0", 876 | ] 877 | 878 | [[package]] 879 | name = "http-body-util" 880 | version = "0.1.2" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 883 | dependencies = [ 884 | "bytes", 885 | "futures-util", 886 | "http 1.1.0", 887 | "http-body 1.0.1", 888 | "pin-project-lite", 889 | ] 890 | 891 | [[package]] 892 | name = "httparse" 893 | version = "1.9.4" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" 896 | 897 | [[package]] 898 | name = "httpdate" 899 | version = "1.0.3" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 902 | 903 | [[package]] 904 | name = "humantime" 905 | version = "2.1.0" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 908 | 909 | [[package]] 910 | name = "hyper" 911 | version = "0.14.30" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" 914 | dependencies = [ 915 | "bytes", 916 | "futures-channel", 917 | "futures-core", 918 | "futures-util", 919 | "h2 0.3.26", 920 | "http 0.2.12", 921 | "http-body 0.4.6", 922 | "httparse", 923 | "httpdate", 924 | "itoa", 925 | "pin-project-lite", 926 | "socket2", 927 | "tokio", 928 | "tower-service", 929 | "tracing", 930 | "want", 931 | ] 932 | 933 | [[package]] 934 | name = "hyper" 935 | version = "1.5.0" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" 938 | dependencies = [ 939 | "bytes", 940 | "futures-channel", 941 | "futures-util", 942 | "h2 0.4.6", 943 | "http 1.1.0", 944 | "http-body 1.0.1", 945 | "httparse", 946 | "itoa", 947 | "pin-project-lite", 948 | "smallvec", 949 | "tokio", 950 | "want", 951 | ] 952 | 953 | [[package]] 954 | name = "hyper-rustls" 955 | version = "0.27.3" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" 958 | dependencies = [ 959 | "futures-util", 960 | "http 1.1.0", 961 | "hyper 1.5.0", 962 | "hyper-util", 963 | "rustls", 964 | "rustls-pki-types", 965 | "tokio", 966 | "tokio-rustls", 967 | "tower-service", 968 | ] 969 | 970 | [[package]] 971 | name = "hyper-timeout" 972 | version = "0.4.1" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" 975 | dependencies = [ 976 | "hyper 0.14.30", 977 | "pin-project-lite", 978 | "tokio", 979 | "tokio-io-timeout", 980 | ] 981 | 982 | [[package]] 983 | name = "hyper-tls" 984 | version = "0.6.0" 985 | source = "registry+https://github.com/rust-lang/crates.io-index" 986 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 987 | dependencies = [ 988 | "bytes", 989 | "http-body-util", 990 | "hyper 1.5.0", 991 | "hyper-util", 992 | "native-tls", 993 | "tokio", 994 | "tokio-native-tls", 995 | "tower-service", 996 | ] 997 | 998 | [[package]] 999 | name = "hyper-util" 1000 | version = "0.1.9" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" 1003 | dependencies = [ 1004 | "bytes", 1005 | "futures-channel", 1006 | "futures-util", 1007 | "http 1.1.0", 1008 | "http-body 1.0.1", 1009 | "hyper 1.5.0", 1010 | "pin-project-lite", 1011 | "socket2", 1012 | "tokio", 1013 | "tower-service", 1014 | "tracing", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "idna" 1019 | version = "0.5.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1022 | dependencies = [ 1023 | "unicode-bidi", 1024 | "unicode-normalization", 1025 | ] 1026 | 1027 | [[package]] 1028 | name = "indexmap" 1029 | version = "1.9.3" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1032 | dependencies = [ 1033 | "autocfg", 1034 | "hashbrown 0.12.3", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "indexmap" 1039 | version = "2.5.0" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" 1042 | dependencies = [ 1043 | "equivalent", 1044 | "hashbrown 0.14.5", 1045 | ] 1046 | 1047 | [[package]] 1048 | name = "ipnet" 1049 | version = "2.9.0" 1050 | source = "registry+https://github.com/rust-lang/crates.io-index" 1051 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 1052 | 1053 | [[package]] 1054 | name = "is-terminal" 1055 | version = "0.4.13" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" 1058 | dependencies = [ 1059 | "hermit-abi 0.4.0", 1060 | "libc", 1061 | "windows-sys 0.52.0", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "is_terminal_polyfill" 1066 | version = "1.70.1" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1069 | 1070 | [[package]] 1071 | name = "itertools" 1072 | version = "0.12.1" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 1075 | dependencies = [ 1076 | "either", 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "itoa" 1081 | version = "1.0.11" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 1084 | 1085 | [[package]] 1086 | name = "js-sys" 1087 | version = "0.3.70" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" 1090 | dependencies = [ 1091 | "wasm-bindgen", 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "lazy_static" 1096 | version = "1.5.0" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1099 | 1100 | [[package]] 1101 | name = "libc" 1102 | version = "0.2.158" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" 1105 | 1106 | [[package]] 1107 | name = "linux-raw-sys" 1108 | version = "0.4.14" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 1111 | 1112 | [[package]] 1113 | name = "lock_api" 1114 | version = "0.4.12" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1117 | dependencies = [ 1118 | "autocfg", 1119 | "scopeguard", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "log" 1124 | version = "0.4.22" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 1127 | 1128 | [[package]] 1129 | name = "mac" 1130 | version = "0.1.1" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1133 | 1134 | [[package]] 1135 | name = "markup5ever" 1136 | version = "0.11.0" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" 1139 | dependencies = [ 1140 | "log", 1141 | "phf 0.10.1", 1142 | "phf_codegen", 1143 | "string_cache", 1144 | "string_cache_codegen", 1145 | "tendril", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "matchers" 1150 | version = "0.1.0" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1153 | dependencies = [ 1154 | "regex-automata 0.1.10", 1155 | ] 1156 | 1157 | [[package]] 1158 | name = "matchit" 1159 | version = "0.7.3" 1160 | source = "registry+https://github.com/rust-lang/crates.io-index" 1161 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 1162 | 1163 | [[package]] 1164 | name = "memchr" 1165 | version = "2.7.4" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1168 | 1169 | [[package]] 1170 | name = "mime" 1171 | version = "0.3.17" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1174 | 1175 | [[package]] 1176 | name = "minimal-lexical" 1177 | version = "0.2.1" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1180 | 1181 | [[package]] 1182 | name = "miniz_oxide" 1183 | version = "0.7.4" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" 1186 | dependencies = [ 1187 | "adler", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "miniz_oxide" 1192 | version = "0.8.0" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" 1195 | dependencies = [ 1196 | "adler2", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "mio" 1201 | version = "1.0.2" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" 1204 | dependencies = [ 1205 | "hermit-abi 0.3.9", 1206 | "libc", 1207 | "wasi", 1208 | "windows-sys 0.52.0", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "native-tls" 1213 | version = "0.2.12" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" 1216 | dependencies = [ 1217 | "libc", 1218 | "log", 1219 | "openssl", 1220 | "openssl-probe", 1221 | "openssl-sys", 1222 | "schannel", 1223 | "security-framework", 1224 | "security-framework-sys", 1225 | "tempfile", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "new_debug_unreachable" 1230 | version = "1.0.6" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 1233 | 1234 | [[package]] 1235 | name = "nix-weather" 1236 | version = "0.0.4" 1237 | dependencies = [ 1238 | "clap", 1239 | "clap_complete", 1240 | "clap_mangen", 1241 | "console-subscriber", 1242 | "dns-lookup", 1243 | "domain", 1244 | "futures", 1245 | "gethostname", 1246 | "itertools", 1247 | "log", 1248 | "openssl", 1249 | "pretty_env_logger", 1250 | "rayon", 1251 | "reqwest", 1252 | "rlimit", 1253 | "scraper", 1254 | "serde", 1255 | "serde_json", 1256 | "tokio", 1257 | "workspace-hack", 1258 | ] 1259 | 1260 | [[package]] 1261 | name = "nom" 1262 | version = "7.1.3" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1265 | dependencies = [ 1266 | "memchr", 1267 | "minimal-lexical", 1268 | ] 1269 | 1270 | [[package]] 1271 | name = "num-conv" 1272 | version = "0.1.0" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1275 | 1276 | [[package]] 1277 | name = "num-traits" 1278 | version = "0.2.19" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1281 | dependencies = [ 1282 | "autocfg", 1283 | ] 1284 | 1285 | [[package]] 1286 | name = "object" 1287 | version = "0.36.4" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" 1290 | dependencies = [ 1291 | "memchr", 1292 | ] 1293 | 1294 | [[package]] 1295 | name = "octseq" 1296 | version = "0.3.2" 1297 | source = "registry+https://github.com/rust-lang/crates.io-index" 1298 | checksum = "d92b38a4aabbacf619b8083841713216e7668178422decfe06bbc70643024c5d" 1299 | dependencies = [ 1300 | "bytes", 1301 | "smallvec", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "once_cell" 1306 | version = "1.19.0" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1309 | 1310 | [[package]] 1311 | name = "openssl" 1312 | version = "0.10.66" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" 1315 | dependencies = [ 1316 | "bitflags 2.6.0", 1317 | "cfg-if", 1318 | "foreign-types", 1319 | "libc", 1320 | "once_cell", 1321 | "openssl-macros", 1322 | "openssl-sys", 1323 | ] 1324 | 1325 | [[package]] 1326 | name = "openssl-macros" 1327 | version = "0.1.1" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1330 | dependencies = [ 1331 | "proc-macro2", 1332 | "quote", 1333 | "syn 2.0.77", 1334 | ] 1335 | 1336 | [[package]] 1337 | name = "openssl-probe" 1338 | version = "0.1.5" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1341 | 1342 | [[package]] 1343 | name = "openssl-sys" 1344 | version = "0.9.103" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" 1347 | dependencies = [ 1348 | "cc", 1349 | "libc", 1350 | "pkg-config", 1351 | "vcpkg", 1352 | ] 1353 | 1354 | [[package]] 1355 | name = "parking_lot" 1356 | version = "0.12.3" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1359 | dependencies = [ 1360 | "lock_api", 1361 | "parking_lot_core", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "parking_lot_core" 1366 | version = "0.9.10" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1369 | dependencies = [ 1370 | "cfg-if", 1371 | "libc", 1372 | "redox_syscall", 1373 | "smallvec", 1374 | "windows-targets 0.52.6", 1375 | ] 1376 | 1377 | [[package]] 1378 | name = "percent-encoding" 1379 | version = "2.3.1" 1380 | source = "registry+https://github.com/rust-lang/crates.io-index" 1381 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1382 | 1383 | [[package]] 1384 | name = "phf" 1385 | version = "0.10.1" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1388 | dependencies = [ 1389 | "phf_shared 0.10.0", 1390 | ] 1391 | 1392 | [[package]] 1393 | name = "phf" 1394 | version = "0.11.2" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 1397 | dependencies = [ 1398 | "phf_macros", 1399 | "phf_shared 0.11.2", 1400 | ] 1401 | 1402 | [[package]] 1403 | name = "phf_codegen" 1404 | version = "0.10.0" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" 1407 | dependencies = [ 1408 | "phf_generator 0.10.0", 1409 | "phf_shared 0.10.0", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "phf_generator" 1414 | version = "0.10.0" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1417 | dependencies = [ 1418 | "phf_shared 0.10.0", 1419 | "rand", 1420 | ] 1421 | 1422 | [[package]] 1423 | name = "phf_generator" 1424 | version = "0.11.2" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 1427 | dependencies = [ 1428 | "phf_shared 0.11.2", 1429 | "rand", 1430 | ] 1431 | 1432 | [[package]] 1433 | name = "phf_macros" 1434 | version = "0.11.2" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 1437 | dependencies = [ 1438 | "phf_generator 0.11.2", 1439 | "phf_shared 0.11.2", 1440 | "proc-macro2", 1441 | "quote", 1442 | "syn 2.0.77", 1443 | ] 1444 | 1445 | [[package]] 1446 | name = "phf_shared" 1447 | version = "0.10.0" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1450 | dependencies = [ 1451 | "siphasher", 1452 | ] 1453 | 1454 | [[package]] 1455 | name = "phf_shared" 1456 | version = "0.11.2" 1457 | source = "registry+https://github.com/rust-lang/crates.io-index" 1458 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 1459 | dependencies = [ 1460 | "siphasher", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "pin-project" 1465 | version = "1.1.5" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 1468 | dependencies = [ 1469 | "pin-project-internal", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "pin-project-internal" 1474 | version = "1.1.5" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1477 | dependencies = [ 1478 | "proc-macro2", 1479 | "quote", 1480 | "syn 2.0.77", 1481 | ] 1482 | 1483 | [[package]] 1484 | name = "pin-project-lite" 1485 | version = "0.2.14" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1488 | 1489 | [[package]] 1490 | name = "pin-utils" 1491 | version = "0.1.0" 1492 | source = "registry+https://github.com/rust-lang/crates.io-index" 1493 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1494 | 1495 | [[package]] 1496 | name = "pkg-config" 1497 | version = "0.3.30" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1500 | 1501 | [[package]] 1502 | name = "powerfmt" 1503 | version = "0.2.0" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1506 | 1507 | [[package]] 1508 | name = "ppv-lite86" 1509 | version = "0.2.20" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1512 | dependencies = [ 1513 | "zerocopy", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "precomputed-hash" 1518 | version = "0.1.1" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 1521 | 1522 | [[package]] 1523 | name = "pretty_env_logger" 1524 | version = "0.5.0" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" 1527 | dependencies = [ 1528 | "env_logger", 1529 | "log", 1530 | ] 1531 | 1532 | [[package]] 1533 | name = "proc-macro2" 1534 | version = "1.0.86" 1535 | source = "registry+https://github.com/rust-lang/crates.io-index" 1536 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 1537 | dependencies = [ 1538 | "unicode-ident", 1539 | ] 1540 | 1541 | [[package]] 1542 | name = "prost" 1543 | version = "0.12.6" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" 1546 | dependencies = [ 1547 | "bytes", 1548 | "prost-derive", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "prost-derive" 1553 | version = "0.12.6" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" 1556 | dependencies = [ 1557 | "anyhow", 1558 | "itertools", 1559 | "proc-macro2", 1560 | "quote", 1561 | "syn 2.0.77", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "prost-types" 1566 | version = "0.12.6" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" 1569 | dependencies = [ 1570 | "prost", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "quote" 1575 | version = "1.0.37" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 1578 | dependencies = [ 1579 | "proc-macro2", 1580 | ] 1581 | 1582 | [[package]] 1583 | name = "rand" 1584 | version = "0.8.5" 1585 | source = "registry+https://github.com/rust-lang/crates.io-index" 1586 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1587 | dependencies = [ 1588 | "libc", 1589 | "rand_chacha", 1590 | "rand_core", 1591 | ] 1592 | 1593 | [[package]] 1594 | name = "rand_chacha" 1595 | version = "0.3.1" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1598 | dependencies = [ 1599 | "ppv-lite86", 1600 | "rand_core", 1601 | ] 1602 | 1603 | [[package]] 1604 | name = "rand_core" 1605 | version = "0.6.4" 1606 | source = "registry+https://github.com/rust-lang/crates.io-index" 1607 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1608 | dependencies = [ 1609 | "getrandom", 1610 | ] 1611 | 1612 | [[package]] 1613 | name = "rayon" 1614 | version = "1.10.0" 1615 | source = "registry+https://github.com/rust-lang/crates.io-index" 1616 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1617 | dependencies = [ 1618 | "either", 1619 | "rayon-core", 1620 | ] 1621 | 1622 | [[package]] 1623 | name = "rayon-core" 1624 | version = "1.12.1" 1625 | source = "registry+https://github.com/rust-lang/crates.io-index" 1626 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1627 | dependencies = [ 1628 | "crossbeam-deque", 1629 | "crossbeam-utils", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "redox_syscall" 1634 | version = "0.5.3" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" 1637 | dependencies = [ 1638 | "bitflags 2.6.0", 1639 | ] 1640 | 1641 | [[package]] 1642 | name = "regex" 1643 | version = "1.10.6" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" 1646 | dependencies = [ 1647 | "aho-corasick", 1648 | "memchr", 1649 | "regex-automata 0.4.7", 1650 | "regex-syntax 0.8.4", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "regex-automata" 1655 | version = "0.1.10" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1658 | dependencies = [ 1659 | "regex-syntax 0.6.29", 1660 | ] 1661 | 1662 | [[package]] 1663 | name = "regex-automata" 1664 | version = "0.4.7" 1665 | source = "registry+https://github.com/rust-lang/crates.io-index" 1666 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 1667 | dependencies = [ 1668 | "aho-corasick", 1669 | "memchr", 1670 | "regex-syntax 0.8.4", 1671 | ] 1672 | 1673 | [[package]] 1674 | name = "regex-syntax" 1675 | version = "0.6.29" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 1678 | 1679 | [[package]] 1680 | name = "regex-syntax" 1681 | version = "0.8.4" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 1684 | 1685 | [[package]] 1686 | name = "reqwest" 1687 | version = "0.12.8" 1688 | source = "registry+https://github.com/rust-lang/crates.io-index" 1689 | checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" 1690 | dependencies = [ 1691 | "base64 0.22.1", 1692 | "bytes", 1693 | "encoding_rs", 1694 | "futures-channel", 1695 | "futures-core", 1696 | "futures-util", 1697 | "h2 0.4.6", 1698 | "http 1.1.0", 1699 | "http-body 1.0.1", 1700 | "http-body-util", 1701 | "hyper 1.5.0", 1702 | "hyper-rustls", 1703 | "hyper-tls", 1704 | "hyper-util", 1705 | "ipnet", 1706 | "js-sys", 1707 | "log", 1708 | "mime", 1709 | "native-tls", 1710 | "once_cell", 1711 | "percent-encoding", 1712 | "pin-project-lite", 1713 | "rustls-pemfile", 1714 | "serde", 1715 | "serde_json", 1716 | "serde_urlencoded", 1717 | "sync_wrapper 1.0.1", 1718 | "system-configuration", 1719 | "tokio", 1720 | "tokio-native-tls", 1721 | "tower-service", 1722 | "url", 1723 | "wasm-bindgen", 1724 | "wasm-bindgen-futures", 1725 | "web-sys", 1726 | "windows-registry", 1727 | ] 1728 | 1729 | [[package]] 1730 | name = "ring" 1731 | version = "0.17.8" 1732 | source = "registry+https://github.com/rust-lang/crates.io-index" 1733 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1734 | dependencies = [ 1735 | "cc", 1736 | "cfg-if", 1737 | "getrandom", 1738 | "libc", 1739 | "spin", 1740 | "untrusted", 1741 | "windows-sys 0.52.0", 1742 | ] 1743 | 1744 | [[package]] 1745 | name = "rlimit" 1746 | version = "0.10.2" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" 1749 | dependencies = [ 1750 | "libc", 1751 | ] 1752 | 1753 | [[package]] 1754 | name = "roff" 1755 | version = "0.2.2" 1756 | source = "registry+https://github.com/rust-lang/crates.io-index" 1757 | checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" 1758 | 1759 | [[package]] 1760 | name = "rustc-demangle" 1761 | version = "0.1.24" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1764 | 1765 | [[package]] 1766 | name = "rustix" 1767 | version = "0.38.35" 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" 1769 | checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" 1770 | dependencies = [ 1771 | "bitflags 2.6.0", 1772 | "errno", 1773 | "libc", 1774 | "linux-raw-sys", 1775 | "windows-sys 0.52.0", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "rustls" 1780 | version = "0.23.15" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" 1783 | dependencies = [ 1784 | "once_cell", 1785 | "rustls-pki-types", 1786 | "rustls-webpki", 1787 | "subtle", 1788 | "zeroize", 1789 | ] 1790 | 1791 | [[package]] 1792 | name = "rustls-pemfile" 1793 | version = "2.2.0" 1794 | source = "registry+https://github.com/rust-lang/crates.io-index" 1795 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1796 | dependencies = [ 1797 | "rustls-pki-types", 1798 | ] 1799 | 1800 | [[package]] 1801 | name = "rustls-pki-types" 1802 | version = "1.10.0" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" 1805 | 1806 | [[package]] 1807 | name = "rustls-webpki" 1808 | version = "0.102.8" 1809 | source = "registry+https://github.com/rust-lang/crates.io-index" 1810 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 1811 | dependencies = [ 1812 | "ring", 1813 | "rustls-pki-types", 1814 | "untrusted", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "rustversion" 1819 | version = "1.0.17" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" 1822 | 1823 | [[package]] 1824 | name = "ryu" 1825 | version = "1.0.18" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1828 | 1829 | [[package]] 1830 | name = "schannel" 1831 | version = "0.1.23" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1834 | dependencies = [ 1835 | "windows-sys 0.52.0", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "scopeguard" 1840 | version = "1.2.0" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1843 | 1844 | [[package]] 1845 | name = "scraper" 1846 | version = "0.18.1" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "585480e3719b311b78a573db1c9d9c4c1f8010c2dee4cc59c2efe58ea4dbc3e1" 1849 | dependencies = [ 1850 | "ahash", 1851 | "cssparser", 1852 | "ego-tree", 1853 | "getopts", 1854 | "html5ever", 1855 | "once_cell", 1856 | "selectors", 1857 | "tendril", 1858 | ] 1859 | 1860 | [[package]] 1861 | name = "security-framework" 1862 | version = "2.11.1" 1863 | source = "registry+https://github.com/rust-lang/crates.io-index" 1864 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1865 | dependencies = [ 1866 | "bitflags 2.6.0", 1867 | "core-foundation", 1868 | "core-foundation-sys", 1869 | "libc", 1870 | "security-framework-sys", 1871 | ] 1872 | 1873 | [[package]] 1874 | name = "security-framework-sys" 1875 | version = "2.11.1" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" 1878 | dependencies = [ 1879 | "core-foundation-sys", 1880 | "libc", 1881 | ] 1882 | 1883 | [[package]] 1884 | name = "selectors" 1885 | version = "0.25.0" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" 1888 | dependencies = [ 1889 | "bitflags 2.6.0", 1890 | "cssparser", 1891 | "derive_more", 1892 | "fxhash", 1893 | "log", 1894 | "new_debug_unreachable", 1895 | "phf 0.10.1", 1896 | "phf_codegen", 1897 | "precomputed-hash", 1898 | "servo_arc", 1899 | "smallvec", 1900 | ] 1901 | 1902 | [[package]] 1903 | name = "serde" 1904 | version = "1.0.209" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" 1907 | dependencies = [ 1908 | "serde_derive", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "serde_derive" 1913 | version = "1.0.209" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" 1916 | dependencies = [ 1917 | "proc-macro2", 1918 | "quote", 1919 | "syn 2.0.77", 1920 | ] 1921 | 1922 | [[package]] 1923 | name = "serde_json" 1924 | version = "1.0.128" 1925 | source = "registry+https://github.com/rust-lang/crates.io-index" 1926 | checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" 1927 | dependencies = [ 1928 | "itoa", 1929 | "memchr", 1930 | "ryu", 1931 | "serde", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "serde_urlencoded" 1936 | version = "0.7.1" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1939 | dependencies = [ 1940 | "form_urlencoded", 1941 | "itoa", 1942 | "ryu", 1943 | "serde", 1944 | ] 1945 | 1946 | [[package]] 1947 | name = "servo_arc" 1948 | version = "0.3.0" 1949 | source = "registry+https://github.com/rust-lang/crates.io-index" 1950 | checksum = "d036d71a959e00c77a63538b90a6c2390969f9772b096ea837205c6bd0491a44" 1951 | dependencies = [ 1952 | "stable_deref_trait", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "sharded-slab" 1957 | version = "0.1.7" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1960 | dependencies = [ 1961 | "lazy_static", 1962 | ] 1963 | 1964 | [[package]] 1965 | name = "shlex" 1966 | version = "1.3.0" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1969 | 1970 | [[package]] 1971 | name = "signal-hook-registry" 1972 | version = "1.4.2" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1975 | dependencies = [ 1976 | "libc", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "siphasher" 1981 | version = "0.3.11" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 1984 | 1985 | [[package]] 1986 | name = "slab" 1987 | version = "0.4.9" 1988 | source = "registry+https://github.com/rust-lang/crates.io-index" 1989 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1990 | dependencies = [ 1991 | "autocfg", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "smallvec" 1996 | version = "1.13.2" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1999 | 2000 | [[package]] 2001 | name = "socket2" 2002 | version = "0.5.7" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 2005 | dependencies = [ 2006 | "libc", 2007 | "windows-sys 0.52.0", 2008 | ] 2009 | 2010 | [[package]] 2011 | name = "spin" 2012 | version = "0.9.8" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2015 | 2016 | [[package]] 2017 | name = "stable_deref_trait" 2018 | version = "1.2.0" 2019 | source = "registry+https://github.com/rust-lang/crates.io-index" 2020 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2021 | 2022 | [[package]] 2023 | name = "string_cache" 2024 | version = "0.8.7" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" 2027 | dependencies = [ 2028 | "new_debug_unreachable", 2029 | "once_cell", 2030 | "parking_lot", 2031 | "phf_shared 0.10.0", 2032 | "precomputed-hash", 2033 | "serde", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "string_cache_codegen" 2038 | version = "0.5.2" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" 2041 | dependencies = [ 2042 | "phf_generator 0.10.0", 2043 | "phf_shared 0.10.0", 2044 | "proc-macro2", 2045 | "quote", 2046 | ] 2047 | 2048 | [[package]] 2049 | name = "strsim" 2050 | version = "0.11.1" 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" 2052 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2053 | 2054 | [[package]] 2055 | name = "subtle" 2056 | version = "2.6.1" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2059 | 2060 | [[package]] 2061 | name = "syn" 2062 | version = "1.0.109" 2063 | source = "registry+https://github.com/rust-lang/crates.io-index" 2064 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2065 | dependencies = [ 2066 | "proc-macro2", 2067 | "quote", 2068 | "unicode-ident", 2069 | ] 2070 | 2071 | [[package]] 2072 | name = "syn" 2073 | version = "2.0.77" 2074 | source = "registry+https://github.com/rust-lang/crates.io-index" 2075 | checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" 2076 | dependencies = [ 2077 | "proc-macro2", 2078 | "quote", 2079 | "unicode-ident", 2080 | ] 2081 | 2082 | [[package]] 2083 | name = "sync_wrapper" 2084 | version = "0.1.2" 2085 | source = "registry+https://github.com/rust-lang/crates.io-index" 2086 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 2087 | 2088 | [[package]] 2089 | name = "sync_wrapper" 2090 | version = "1.0.1" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 2093 | dependencies = [ 2094 | "futures-core", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "system-configuration" 2099 | version = "0.6.1" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 2102 | dependencies = [ 2103 | "bitflags 2.6.0", 2104 | "core-foundation", 2105 | "system-configuration-sys", 2106 | ] 2107 | 2108 | [[package]] 2109 | name = "system-configuration-sys" 2110 | version = "0.6.0" 2111 | source = "registry+https://github.com/rust-lang/crates.io-index" 2112 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 2113 | dependencies = [ 2114 | "core-foundation-sys", 2115 | "libc", 2116 | ] 2117 | 2118 | [[package]] 2119 | name = "tempfile" 2120 | version = "3.12.0" 2121 | source = "registry+https://github.com/rust-lang/crates.io-index" 2122 | checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" 2123 | dependencies = [ 2124 | "cfg-if", 2125 | "fastrand", 2126 | "once_cell", 2127 | "rustix", 2128 | "windows-sys 0.59.0", 2129 | ] 2130 | 2131 | [[package]] 2132 | name = "tendril" 2133 | version = "0.4.3" 2134 | source = "registry+https://github.com/rust-lang/crates.io-index" 2135 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 2136 | dependencies = [ 2137 | "futf", 2138 | "mac", 2139 | "utf-8", 2140 | ] 2141 | 2142 | [[package]] 2143 | name = "termcolor" 2144 | version = "1.4.1" 2145 | source = "registry+https://github.com/rust-lang/crates.io-index" 2146 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 2147 | dependencies = [ 2148 | "winapi-util", 2149 | ] 2150 | 2151 | [[package]] 2152 | name = "thread_local" 2153 | version = "1.1.8" 2154 | source = "registry+https://github.com/rust-lang/crates.io-index" 2155 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2156 | dependencies = [ 2157 | "cfg-if", 2158 | "once_cell", 2159 | ] 2160 | 2161 | [[package]] 2162 | name = "time" 2163 | version = "0.3.36" 2164 | source = "registry+https://github.com/rust-lang/crates.io-index" 2165 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 2166 | dependencies = [ 2167 | "deranged", 2168 | "num-conv", 2169 | "powerfmt", 2170 | "serde", 2171 | "time-core", 2172 | ] 2173 | 2174 | [[package]] 2175 | name = "time-core" 2176 | version = "0.1.2" 2177 | source = "registry+https://github.com/rust-lang/crates.io-index" 2178 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2179 | 2180 | [[package]] 2181 | name = "tinyvec" 2182 | version = "1.8.0" 2183 | source = "registry+https://github.com/rust-lang/crates.io-index" 2184 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 2185 | dependencies = [ 2186 | "tinyvec_macros", 2187 | ] 2188 | 2189 | [[package]] 2190 | name = "tinyvec_macros" 2191 | version = "0.1.1" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2194 | 2195 | [[package]] 2196 | name = "tokio" 2197 | version = "1.40.0" 2198 | source = "registry+https://github.com/rust-lang/crates.io-index" 2199 | checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" 2200 | dependencies = [ 2201 | "backtrace", 2202 | "bytes", 2203 | "libc", 2204 | "mio", 2205 | "parking_lot", 2206 | "pin-project-lite", 2207 | "signal-hook-registry", 2208 | "socket2", 2209 | "tokio-macros", 2210 | "tracing", 2211 | "windows-sys 0.52.0", 2212 | ] 2213 | 2214 | [[package]] 2215 | name = "tokio-io-timeout" 2216 | version = "1.2.0" 2217 | source = "registry+https://github.com/rust-lang/crates.io-index" 2218 | checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" 2219 | dependencies = [ 2220 | "pin-project-lite", 2221 | "tokio", 2222 | ] 2223 | 2224 | [[package]] 2225 | name = "tokio-macros" 2226 | version = "2.4.0" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" 2229 | dependencies = [ 2230 | "proc-macro2", 2231 | "quote", 2232 | "syn 2.0.77", 2233 | ] 2234 | 2235 | [[package]] 2236 | name = "tokio-native-tls" 2237 | version = "0.3.1" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2240 | dependencies = [ 2241 | "native-tls", 2242 | "tokio", 2243 | ] 2244 | 2245 | [[package]] 2246 | name = "tokio-rustls" 2247 | version = "0.26.0" 2248 | source = "registry+https://github.com/rust-lang/crates.io-index" 2249 | checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" 2250 | dependencies = [ 2251 | "rustls", 2252 | "rustls-pki-types", 2253 | "tokio", 2254 | ] 2255 | 2256 | [[package]] 2257 | name = "tokio-stream" 2258 | version = "0.1.15" 2259 | source = "registry+https://github.com/rust-lang/crates.io-index" 2260 | checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" 2261 | dependencies = [ 2262 | "futures-core", 2263 | "pin-project-lite", 2264 | "tokio", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "tokio-util" 2269 | version = "0.7.12" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" 2272 | dependencies = [ 2273 | "bytes", 2274 | "futures-core", 2275 | "futures-sink", 2276 | "pin-project-lite", 2277 | "tokio", 2278 | ] 2279 | 2280 | [[package]] 2281 | name = "tonic" 2282 | version = "0.10.2" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" 2285 | dependencies = [ 2286 | "async-stream", 2287 | "async-trait", 2288 | "axum", 2289 | "base64 0.21.7", 2290 | "bytes", 2291 | "h2 0.3.26", 2292 | "http 0.2.12", 2293 | "http-body 0.4.6", 2294 | "hyper 0.14.30", 2295 | "hyper-timeout", 2296 | "percent-encoding", 2297 | "pin-project", 2298 | "prost", 2299 | "tokio", 2300 | "tokio-stream", 2301 | "tower", 2302 | "tower-layer", 2303 | "tower-service", 2304 | "tracing", 2305 | ] 2306 | 2307 | [[package]] 2308 | name = "tower" 2309 | version = "0.4.13" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2312 | dependencies = [ 2313 | "futures-core", 2314 | "futures-util", 2315 | "indexmap 1.9.3", 2316 | "pin-project", 2317 | "pin-project-lite", 2318 | "rand", 2319 | "slab", 2320 | "tokio", 2321 | "tokio-util", 2322 | "tower-layer", 2323 | "tower-service", 2324 | "tracing", 2325 | ] 2326 | 2327 | [[package]] 2328 | name = "tower-layer" 2329 | version = "0.3.3" 2330 | source = "registry+https://github.com/rust-lang/crates.io-index" 2331 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2332 | 2333 | [[package]] 2334 | name = "tower-service" 2335 | version = "0.3.3" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2338 | 2339 | [[package]] 2340 | name = "tracing" 2341 | version = "0.1.40" 2342 | source = "registry+https://github.com/rust-lang/crates.io-index" 2343 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2344 | dependencies = [ 2345 | "pin-project-lite", 2346 | "tracing-attributes", 2347 | "tracing-core", 2348 | ] 2349 | 2350 | [[package]] 2351 | name = "tracing-attributes" 2352 | version = "0.1.27" 2353 | source = "registry+https://github.com/rust-lang/crates.io-index" 2354 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2355 | dependencies = [ 2356 | "proc-macro2", 2357 | "quote", 2358 | "syn 2.0.77", 2359 | ] 2360 | 2361 | [[package]] 2362 | name = "tracing-core" 2363 | version = "0.1.32" 2364 | source = "registry+https://github.com/rust-lang/crates.io-index" 2365 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2366 | dependencies = [ 2367 | "once_cell", 2368 | "valuable", 2369 | ] 2370 | 2371 | [[package]] 2372 | name = "tracing-subscriber" 2373 | version = "0.3.18" 2374 | source = "registry+https://github.com/rust-lang/crates.io-index" 2375 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2376 | dependencies = [ 2377 | "matchers", 2378 | "once_cell", 2379 | "regex", 2380 | "sharded-slab", 2381 | "thread_local", 2382 | "tracing", 2383 | "tracing-core", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "try-lock" 2388 | version = "0.2.5" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2391 | 2392 | [[package]] 2393 | name = "unicode-bidi" 2394 | version = "0.3.15" 2395 | source = "registry+https://github.com/rust-lang/crates.io-index" 2396 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2397 | 2398 | [[package]] 2399 | name = "unicode-ident" 2400 | version = "1.0.12" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2403 | 2404 | [[package]] 2405 | name = "unicode-normalization" 2406 | version = "0.1.23" 2407 | source = "registry+https://github.com/rust-lang/crates.io-index" 2408 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 2409 | dependencies = [ 2410 | "tinyvec", 2411 | ] 2412 | 2413 | [[package]] 2414 | name = "unicode-width" 2415 | version = "0.1.13" 2416 | source = "registry+https://github.com/rust-lang/crates.io-index" 2417 | checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" 2418 | 2419 | [[package]] 2420 | name = "untrusted" 2421 | version = "0.9.0" 2422 | source = "registry+https://github.com/rust-lang/crates.io-index" 2423 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2424 | 2425 | [[package]] 2426 | name = "url" 2427 | version = "2.5.2" 2428 | source = "registry+https://github.com/rust-lang/crates.io-index" 2429 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 2430 | dependencies = [ 2431 | "form_urlencoded", 2432 | "idna", 2433 | "percent-encoding", 2434 | ] 2435 | 2436 | [[package]] 2437 | name = "utf-8" 2438 | version = "0.7.6" 2439 | source = "registry+https://github.com/rust-lang/crates.io-index" 2440 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2441 | 2442 | [[package]] 2443 | name = "utf8parse" 2444 | version = "0.2.2" 2445 | source = "registry+https://github.com/rust-lang/crates.io-index" 2446 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2447 | 2448 | [[package]] 2449 | name = "valuable" 2450 | version = "0.1.0" 2451 | source = "registry+https://github.com/rust-lang/crates.io-index" 2452 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2453 | 2454 | [[package]] 2455 | name = "vcpkg" 2456 | version = "0.2.15" 2457 | source = "registry+https://github.com/rust-lang/crates.io-index" 2458 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2459 | 2460 | [[package]] 2461 | name = "version_check" 2462 | version = "0.9.5" 2463 | source = "registry+https://github.com/rust-lang/crates.io-index" 2464 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2465 | 2466 | [[package]] 2467 | name = "want" 2468 | version = "0.3.1" 2469 | source = "registry+https://github.com/rust-lang/crates.io-index" 2470 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2471 | dependencies = [ 2472 | "try-lock", 2473 | ] 2474 | 2475 | [[package]] 2476 | name = "wasi" 2477 | version = "0.11.0+wasi-snapshot-preview1" 2478 | source = "registry+https://github.com/rust-lang/crates.io-index" 2479 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2480 | 2481 | [[package]] 2482 | name = "wasm-bindgen" 2483 | version = "0.2.93" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" 2486 | dependencies = [ 2487 | "cfg-if", 2488 | "once_cell", 2489 | "wasm-bindgen-macro", 2490 | ] 2491 | 2492 | [[package]] 2493 | name = "wasm-bindgen-backend" 2494 | version = "0.2.93" 2495 | source = "registry+https://github.com/rust-lang/crates.io-index" 2496 | checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" 2497 | dependencies = [ 2498 | "bumpalo", 2499 | "log", 2500 | "once_cell", 2501 | "proc-macro2", 2502 | "quote", 2503 | "syn 2.0.77", 2504 | "wasm-bindgen-shared", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "wasm-bindgen-futures" 2509 | version = "0.4.43" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" 2512 | dependencies = [ 2513 | "cfg-if", 2514 | "js-sys", 2515 | "wasm-bindgen", 2516 | "web-sys", 2517 | ] 2518 | 2519 | [[package]] 2520 | name = "wasm-bindgen-macro" 2521 | version = "0.2.93" 2522 | source = "registry+https://github.com/rust-lang/crates.io-index" 2523 | checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" 2524 | dependencies = [ 2525 | "quote", 2526 | "wasm-bindgen-macro-support", 2527 | ] 2528 | 2529 | [[package]] 2530 | name = "wasm-bindgen-macro-support" 2531 | version = "0.2.93" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" 2534 | dependencies = [ 2535 | "proc-macro2", 2536 | "quote", 2537 | "syn 2.0.77", 2538 | "wasm-bindgen-backend", 2539 | "wasm-bindgen-shared", 2540 | ] 2541 | 2542 | [[package]] 2543 | name = "wasm-bindgen-shared" 2544 | version = "0.2.93" 2545 | source = "registry+https://github.com/rust-lang/crates.io-index" 2546 | checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" 2547 | 2548 | [[package]] 2549 | name = "web-sys" 2550 | version = "0.3.70" 2551 | source = "registry+https://github.com/rust-lang/crates.io-index" 2552 | checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" 2553 | dependencies = [ 2554 | "js-sys", 2555 | "wasm-bindgen", 2556 | ] 2557 | 2558 | [[package]] 2559 | name = "winapi-util" 2560 | version = "0.1.9" 2561 | source = "registry+https://github.com/rust-lang/crates.io-index" 2562 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2563 | dependencies = [ 2564 | "windows-sys 0.59.0", 2565 | ] 2566 | 2567 | [[package]] 2568 | name = "windows-registry" 2569 | version = "0.2.0" 2570 | source = "registry+https://github.com/rust-lang/crates.io-index" 2571 | checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" 2572 | dependencies = [ 2573 | "windows-result", 2574 | "windows-strings", 2575 | "windows-targets 0.52.6", 2576 | ] 2577 | 2578 | [[package]] 2579 | name = "windows-result" 2580 | version = "0.2.0" 2581 | source = "registry+https://github.com/rust-lang/crates.io-index" 2582 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 2583 | dependencies = [ 2584 | "windows-targets 0.52.6", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "windows-strings" 2589 | version = "0.1.0" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 2592 | dependencies = [ 2593 | "windows-result", 2594 | "windows-targets 0.52.6", 2595 | ] 2596 | 2597 | [[package]] 2598 | name = "windows-sys" 2599 | version = "0.48.0" 2600 | source = "registry+https://github.com/rust-lang/crates.io-index" 2601 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2602 | dependencies = [ 2603 | "windows-targets 0.48.5", 2604 | ] 2605 | 2606 | [[package]] 2607 | name = "windows-sys" 2608 | version = "0.52.0" 2609 | source = "registry+https://github.com/rust-lang/crates.io-index" 2610 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2611 | dependencies = [ 2612 | "windows-targets 0.52.6", 2613 | ] 2614 | 2615 | [[package]] 2616 | name = "windows-sys" 2617 | version = "0.59.0" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2620 | dependencies = [ 2621 | "windows-targets 0.52.6", 2622 | ] 2623 | 2624 | [[package]] 2625 | name = "windows-targets" 2626 | version = "0.48.5" 2627 | source = "registry+https://github.com/rust-lang/crates.io-index" 2628 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2629 | dependencies = [ 2630 | "windows_aarch64_gnullvm 0.48.5", 2631 | "windows_aarch64_msvc 0.48.5", 2632 | "windows_i686_gnu 0.48.5", 2633 | "windows_i686_msvc 0.48.5", 2634 | "windows_x86_64_gnu 0.48.5", 2635 | "windows_x86_64_gnullvm 0.48.5", 2636 | "windows_x86_64_msvc 0.48.5", 2637 | ] 2638 | 2639 | [[package]] 2640 | name = "windows-targets" 2641 | version = "0.52.6" 2642 | source = "registry+https://github.com/rust-lang/crates.io-index" 2643 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2644 | dependencies = [ 2645 | "windows_aarch64_gnullvm 0.52.6", 2646 | "windows_aarch64_msvc 0.52.6", 2647 | "windows_i686_gnu 0.52.6", 2648 | "windows_i686_gnullvm", 2649 | "windows_i686_msvc 0.52.6", 2650 | "windows_x86_64_gnu 0.52.6", 2651 | "windows_x86_64_gnullvm 0.52.6", 2652 | "windows_x86_64_msvc 0.52.6", 2653 | ] 2654 | 2655 | [[package]] 2656 | name = "windows_aarch64_gnullvm" 2657 | version = "0.48.5" 2658 | source = "registry+https://github.com/rust-lang/crates.io-index" 2659 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2660 | 2661 | [[package]] 2662 | name = "windows_aarch64_gnullvm" 2663 | version = "0.52.6" 2664 | source = "registry+https://github.com/rust-lang/crates.io-index" 2665 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2666 | 2667 | [[package]] 2668 | name = "windows_aarch64_msvc" 2669 | version = "0.48.5" 2670 | source = "registry+https://github.com/rust-lang/crates.io-index" 2671 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2672 | 2673 | [[package]] 2674 | name = "windows_aarch64_msvc" 2675 | version = "0.52.6" 2676 | source = "registry+https://github.com/rust-lang/crates.io-index" 2677 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2678 | 2679 | [[package]] 2680 | name = "windows_i686_gnu" 2681 | version = "0.48.5" 2682 | source = "registry+https://github.com/rust-lang/crates.io-index" 2683 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2684 | 2685 | [[package]] 2686 | name = "windows_i686_gnu" 2687 | version = "0.52.6" 2688 | source = "registry+https://github.com/rust-lang/crates.io-index" 2689 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2690 | 2691 | [[package]] 2692 | name = "windows_i686_gnullvm" 2693 | version = "0.52.6" 2694 | source = "registry+https://github.com/rust-lang/crates.io-index" 2695 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2696 | 2697 | [[package]] 2698 | name = "windows_i686_msvc" 2699 | version = "0.48.5" 2700 | source = "registry+https://github.com/rust-lang/crates.io-index" 2701 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2702 | 2703 | [[package]] 2704 | name = "windows_i686_msvc" 2705 | version = "0.52.6" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2708 | 2709 | [[package]] 2710 | name = "windows_x86_64_gnu" 2711 | version = "0.48.5" 2712 | source = "registry+https://github.com/rust-lang/crates.io-index" 2713 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2714 | 2715 | [[package]] 2716 | name = "windows_x86_64_gnu" 2717 | version = "0.52.6" 2718 | source = "registry+https://github.com/rust-lang/crates.io-index" 2719 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2720 | 2721 | [[package]] 2722 | name = "windows_x86_64_gnullvm" 2723 | version = "0.48.5" 2724 | source = "registry+https://github.com/rust-lang/crates.io-index" 2725 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2726 | 2727 | [[package]] 2728 | name = "windows_x86_64_gnullvm" 2729 | version = "0.52.6" 2730 | source = "registry+https://github.com/rust-lang/crates.io-index" 2731 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2732 | 2733 | [[package]] 2734 | name = "windows_x86_64_msvc" 2735 | version = "0.48.5" 2736 | source = "registry+https://github.com/rust-lang/crates.io-index" 2737 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2738 | 2739 | [[package]] 2740 | name = "windows_x86_64_msvc" 2741 | version = "0.52.6" 2742 | source = "registry+https://github.com/rust-lang/crates.io-index" 2743 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2744 | 2745 | [[package]] 2746 | name = "workspace-hack" 2747 | version = "0.1.0" 2748 | dependencies = [ 2749 | "byteorder", 2750 | "clap", 2751 | "clap_builder", 2752 | "either", 2753 | "itertools", 2754 | "phf_shared 0.11.2", 2755 | ] 2756 | 2757 | [[package]] 2758 | name = "zerocopy" 2759 | version = "0.7.35" 2760 | source = "registry+https://github.com/rust-lang/crates.io-index" 2761 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2762 | dependencies = [ 2763 | "byteorder", 2764 | "zerocopy-derive", 2765 | ] 2766 | 2767 | [[package]] 2768 | name = "zerocopy-derive" 2769 | version = "0.7.35" 2770 | source = "registry+https://github.com/rust-lang/crates.io-index" 2771 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2772 | dependencies = [ 2773 | "proc-macro2", 2774 | "quote", 2775 | "syn 2.0.77", 2776 | ] 2777 | 2778 | [[package]] 2779 | name = "zeroize" 2780 | version = "1.8.1" 2781 | source = "registry+https://github.com/rust-lang/crates.io-index" 2782 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2783 | --------------------------------------------------------------------------------