├── .envrc ├── .clippy.toml ├── .cargo ├── audit.toml └── config.toml ├── release.toml ├── rust-toolchain.toml ├── arfur-rev ├── .gitignore ├── src │ ├── lib.rs │ └── controllers.rs └── Cargo.toml ├── arfur-wpilib ├── .gitignore ├── src │ ├── shim.h │ ├── shim.cc │ ├── util.rs │ ├── error.rs │ ├── lib.rs │ └── robot.rs ├── build.rs └── Cargo.toml ├── xtask ├── src │ ├── main.rs │ ├── cli.rs │ └── bindgen.rs └── Cargo.toml ├── assets ├── logo.svg └── banner.svg ├── src └── lib.rs ├── arfur-build ├── src │ ├── library.rs │ ├── lib.rs │ ├── file.rs │ └── runner.rs └── Cargo.toml ├── examples ├── rev.rs ├── spawn_observer.rs ├── initialization.rs └── raw_usage.rs ├── .github └── workflows │ ├── audit.yml │ ├── clippy.yml │ ├── tarpaulin.yml │ └── msrv.yml ├── .gitignore ├── nix └── wpilib-toolchain.nix ├── Cargo.toml ├── flake.nix ├── cliff.toml ├── LICENSE.md ├── README.md ├── flake.lock └── Cargo.lock /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | -------------------------------------------------------------------------------- /.clippy.toml: -------------------------------------------------------------------------------- 1 | msrv = "1.62" 2 | -------------------------------------------------------------------------------- /.cargo/audit.toml: -------------------------------------------------------------------------------- 1 | [advisories] 2 | ignore = ["RUSTSEC-2020-0071"] 3 | -------------------------------------------------------------------------------- /release.toml: -------------------------------------------------------------------------------- 1 | pre-release-commit-message = "chore(release): prepare for release" 2 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "stable" 3 | targets = [ "arm-unknown-linux-gnueabi" ] 4 | -------------------------------------------------------------------------------- /arfur-rev/.gitignore: -------------------------------------------------------------------------------- 1 | # These files are a result of the manual `xtask` generation. 2 | 3 | src/raw/ 4 | arfur.complete 5 | -------------------------------------------------------------------------------- /arfur-wpilib/.gitignore: -------------------------------------------------------------------------------- 1 | # These files are a result of the manual `xtask` generation. 2 | 3 | src/raw/ 4 | arfur.complete 5 | -------------------------------------------------------------------------------- /arfur-wpilib/src/shim.h: -------------------------------------------------------------------------------- 1 | #include "frc/ADXRS450_Gyro.h" 2 | 3 | namespace frc { 4 | std::unique_ptr new_ADXRS450_Gyro(); 5 | } 6 | -------------------------------------------------------------------------------- /xtask/src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | use color_eyre::Result; 3 | 4 | mod bindgen; 5 | mod cli; 6 | 7 | #[tokio::main] 8 | async fn main() -> Result<()> { 9 | let cli = cli::Cli::parse(); 10 | cli.exec().await 11 | } 12 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | # TODO: could we build to x86-64 too via sim? 3 | target = ["arm-unknown-linux-gnueabi"] 4 | 5 | [target.arm-unknown-linux-gnueabi] 6 | linker = "arm-frc2023-linux-gnueabi-gcc" 7 | rustflags = [ 8 | "-C", "target-cpu=cortex-a9", 9 | ] 10 | 11 | [alias] 12 | xtask = "run --package xtask --" 13 | -------------------------------------------------------------------------------- /assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | 3 | #[cfg(feature = "arfur-rev")] 4 | #[doc(inline)] 5 | pub use arfur_rev as rev; 6 | #[cfg(feature = "arfur-wpilib")] 7 | #[doc(inline)] 8 | pub use arfur_wpilib as wpilib; 9 | 10 | /* 11 | pub mod prelude { 12 | pub use crate::rev::prelude::*; 13 | pub use crate::wpilib::prelude::*; 14 | } 15 | */ 16 | -------------------------------------------------------------------------------- /arfur-build/src/library.rs: -------------------------------------------------------------------------------- 1 | //! Interface for online libraries. 2 | 3 | use std::fmt::Debug; 4 | 5 | /// A library is a link or a set of links to downloadable libraries online. 6 | pub trait Library: Debug { 7 | /// Given a reference to self, resolve the link that needs to be downloaded. 8 | fn get_link(&self, version: &str, ni_version: &str) -> String; 9 | } 10 | -------------------------------------------------------------------------------- /examples/rev.rs: -------------------------------------------------------------------------------- 1 | //! Example usage of a REV SparkMax wired at CAN ID 16. 2 | 3 | use arfur_rev::prelude::*; 4 | use arfur_wpilib::prelude::*; 5 | 6 | fn main() -> Result<()> { 7 | let robot = RobotBuilder::default().initialize()?; 8 | let mut spark = SparkMax::new(robot, 16); 9 | 10 | spark.set_percentage(0.5); 11 | 12 | loop {} 13 | } 14 | 15 | struct MyRobot; 16 | -------------------------------------------------------------------------------- /arfur-build/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! A build runner for Arfur. 2 | //! 3 | //! This tool is for internal use. Never consider this library's functionality 4 | //! stable, but expect semantic versioning gaurantees. 5 | //! 6 | //! The only scenario in which you may want to use this library is when 7 | //! implementing support for an FRC-related library. 8 | 9 | pub mod file; 10 | pub mod library; 11 | pub mod runner; 12 | -------------------------------------------------------------------------------- /xtask/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "xtask" 3 | version = "0.1.0" 4 | edition = "2021" 5 | publish = false 6 | 7 | [dependencies] 8 | arfur-build = { version = "0.0.2", path = "../arfur-build", features = ["bindgen"] } 9 | clap = { version = "4.4.2", features = ["derive"] } 10 | color-eyre = "0.6.2" 11 | tracing = "0.1.37" 12 | tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } 13 | 14 | [dependencies.tokio] 15 | version = "1.32.0" 16 | features = ["macros", "rt-multi-thread"] 17 | -------------------------------------------------------------------------------- /.github/workflows/audit.yml: -------------------------------------------------------------------------------- 1 | name: Security audit 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**/Cargo.toml' 7 | - '**/Cargo.lock' 8 | pull_request: 9 | 10 | jobs: 11 | audit: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - name: Install dependencies 16 | run: sudo apt-get install -y gcc-arm-linux-gnueabi pkg-config libssl-dev libc++-dev clang 17 | - uses: actions-rs/audit-check@v1 18 | with: 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | -------------------------------------------------------------------------------- /examples/spawn_observer.rs: -------------------------------------------------------------------------------- 1 | use arfur::prelude::*; 2 | 3 | fn main() -> Result<()> { 4 | let _robot = RobotBuilder::default().initialize(); 5 | 6 | // The above works great, but alone, the DS will disable immediately. The 7 | // DS wants constant approval that the program is working. This is why we 8 | // spawn a special utility task in the background, that runs the 9 | // corresponding observe functions every 50 ms. 10 | std::thread::spawn(arfur::wpilib::util::create_observer()); 11 | 12 | loop {} 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/clippy.yml: -------------------------------------------------------------------------------- 1 | name: Clippy 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | clippy_check: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v3 10 | - name: Install dependencies 11 | run: sudo apt-get install -y gcc-arm-linux-gnueabi pkg-config libssl-dev libc++-dev clang 12 | - uses: actions-rs/toolchain@v1 13 | with: 14 | toolchain: stable 15 | components: clippy 16 | override: true 17 | - uses: actions-rs/clippy@master 18 | -------------------------------------------------------------------------------- /examples/initialization.rs: -------------------------------------------------------------------------------- 1 | use arfur_wpilib::prelude::*; 2 | 3 | fn main() -> Result<()> { 4 | let _robot = RobotBuilder::default().initialize()?; 5 | println!("Initialized successfully."); 6 | 7 | // That's it - it's that simple! However, if you try running this on a RIO 8 | // right now, the robot code light will be red. Read ./spawn_observer.rs to 9 | // understand why. 10 | 11 | // We could choose to return Ok(()) here, but let's loop instead. This will 12 | // keep our program running. 13 | loop {} 14 | } 15 | -------------------------------------------------------------------------------- /arfur-build/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "arfur-build" 3 | description = "Internal build tool for Arfur. Not for public use." 4 | version = "0.0.2" 5 | 6 | license = "MIT" 7 | repository = "https://github.com/arfur-rs/arfur/" 8 | 9 | edition = "2021" 10 | rust-version = "1.62" 11 | 12 | [package.metadata.nix] 13 | build = true 14 | 15 | [dependencies] 16 | color-eyre = "0.6.2" 17 | once_cell = "1.18.0" 18 | reqwest = "0.11.18" 19 | seahash = "4.1.0" 20 | tracing = "0.1.37" 21 | zip-extract = "0.1.2" 22 | 23 | [dependencies.bindgen] 24 | version = "0.66.1" 25 | optional = true 26 | -------------------------------------------------------------------------------- /arfur-wpilib/src/shim.cc: -------------------------------------------------------------------------------- 1 | /** 2 | * Basic compatibility code for Rust WPILib <-> C++ WPILib. 3 | * 4 | * Ideally, this file wouldn't exist, and `cxx` would be smart enough to handle 5 | * things such as constructor generation for us, but as of the time of writing, 6 | * it does not. This file may be replaced as cxx issues such as 7 | * [280](https://github.com/dtolnay/cxx/issues/280) are resolved. 8 | */ 9 | 10 | #include "frc/ADXRS450_Gyro.h" 11 | 12 | namespace frc { 13 | std::unique_ptr new_ADXRS450_Gyro() { 14 | return std::unique_ptr(new ADXRS450_Gyro()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /examples/raw_usage.rs: -------------------------------------------------------------------------------- 1 | //! Example usage of raw WPILib foreign types. 2 | 3 | use arfur::prelude::*; 4 | use arfur::wpilib::ffi; 5 | 6 | fn main() -> Result<()> { 7 | let _robot = RobotBuilder::default().initialize(); 8 | 9 | unsafe { 10 | let mut gyro = ffi::frc_ADXRS450_Gyro::new(); 11 | 12 | loop { 13 | let angle = 14 | ffi::frc_ADXRS450_Gyro_GetAngle(&mut gyro as *mut _ as *mut std::ffi::c_void); 15 | println!("Found angle to be {}", angle); 16 | 17 | std::thread::sleep(std::time::Duration::from_secs(1)); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /xtask/src/cli.rs: -------------------------------------------------------------------------------- 1 | use clap::{Parser, Subcommand}; 2 | use color_eyre::Result; 3 | 4 | #[derive(Parser, Debug)] 5 | #[clap(author, version, about, long_about = None)] 6 | #[clap(propagate_version = true)] 7 | pub struct Cli { 8 | #[clap(subcommand)] 9 | pub command: Command, 10 | } 11 | 12 | #[derive(Subcommand, Debug)] 13 | #[clap(bin_name = "cargo")] 14 | pub enum Command { 15 | Bindgen(crate::bindgen::BindgenArgs), 16 | } 17 | 18 | impl Cli { 19 | pub async fn exec(self) -> Result<()> { 20 | match self.command { 21 | Command::Bindgen(x) => x.exec().await, 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/rust,direnv 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=rust,direnv 3 | 4 | ### direnv ### 5 | .direnv 6 | .envrc 7 | 8 | ### Rust ### 9 | # Generated by Cargo 10 | # will have compiled files and executables 11 | debug/ 12 | target/ 13 | 14 | # These are backup files generated by rustfmt 15 | **/*.rs.bk 16 | 17 | # MSVC Windows builds of rustc generate these, which store debugging information 18 | *.pdb 19 | 20 | # End of https://www.toptal.com/developers/gitignore/api/rust,direnv 21 | 22 | # Additional ignore rules 23 | 24 | ### Nix ### 25 | result* 26 | -------------------------------------------------------------------------------- /arfur-rev/src/lib.rs: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | pub mod controllers; 4 | 5 | pub mod prelude { 6 | pub use crate::controllers::sparkmax::SparkMax; 7 | } 8 | 9 | #[allow( 10 | rustdoc::broken_intra_doc_links, 11 | rustdoc::bare_urls, 12 | rustdoc::invalid_rust_codeblocks 13 | )] 14 | pub mod ffi { 15 | //! A raw interface to any RevLib function. 16 | //! 17 | //! All of these functions should be considered unsafe and difficult to use. 18 | #[cfg(feature = "bindgen")] 19 | #[allow(rustdoc::all)] 20 | include!(concat!(env!("OUT_DIR"), "/bindings.rs")); 21 | 22 | #[cfg(not(feature = "bindgen"))] 23 | include!("./bindings.rs"); 24 | } 25 | 26 | */ 27 | -------------------------------------------------------------------------------- /arfur-wpilib/build.rs: -------------------------------------------------------------------------------- 1 | use miette::Result; 2 | 3 | fn main() -> Result<()> { 4 | let src = std::path::PathBuf::from("src"); 5 | let raw = std::path::PathBuf::from("src/raw"); 6 | 7 | let mut b = autocxx_build::Builder::new("src/lib.rs", &[&src, &raw]) 8 | .extra_clang_args(&["-std=c++17"]) 9 | .build()?; 10 | 11 | b.std("c++17") 12 | .flag("-std=c++17") 13 | .flag("-fpermissive") // TODO: this is a workaround. 14 | .cpp(true) 15 | .compiler("arm-frc2023-linux-gnueabi-g++") 16 | .compile("arfur-wpilib"); 17 | 18 | println!("cargo:rerun-if-changed=src/lib.rs"); 19 | println!("cargo:rerun-if-changed=src/raw/frc/*"); 20 | 21 | Ok(()) 22 | } 23 | -------------------------------------------------------------------------------- /arfur-rev/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "arfur-rev" 3 | description = "Bindings to the REV framework." 4 | version = "0.0.1" 5 | 6 | license = "MIT" 7 | repository = "https://github.com/arfur-rs/arfur/" 8 | 9 | edition = "2021" 10 | rust-version = "1.62" 11 | 12 | [package.metadata.nix] 13 | build = true 14 | 15 | [features] 16 | bindgen = ["arfur-build/bindgen", "arfur-wpilib/bindgen"] 17 | 18 | [dependencies] 19 | arfur-wpilib = { version = "0.0.2", path = "../arfur-wpilib" } 20 | derive_builder = "0.12.0" 21 | thiserror = "1.0.48" 22 | tracing = "0.1.37" 23 | 24 | [build-dependencies] 25 | color-eyre = "0.6.2" 26 | 27 | [build-dependencies.arfur-build] 28 | version = "0.0.2" 29 | path = "../arfur-build" 30 | 31 | [build-dependencies.tokio] 32 | version = "1.29.1" 33 | features = ["macros", "rt-multi-thread"] 34 | -------------------------------------------------------------------------------- /arfur-wpilib/src/util.rs: -------------------------------------------------------------------------------- 1 | //! Small, miscellaneous, useful tools. 2 | 3 | use crate::ffi; 4 | 5 | /// The DS asks for an obervation that the program is running every 50 ms, 6 | /// otherwise disabling the robot. This is a simple thread that asks for the 7 | /// robot state and responds with the corresponding observation every 50 ms. 8 | /// 9 | /// You are, of course, able to make your own calls to the observation library, 10 | /// provided you know what you're doing. 11 | pub fn create_observer() -> impl Fn() -> () { 12 | || { 13 | // TODO: actually read the current state. 14 | loop { 15 | unsafe { 16 | let packet = ffi::root::HAL_WaitForDSDataTimeout(1.); 17 | if packet != 0 { 18 | // Do something here? 19 | } 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /arfur-wpilib/src/error.rs: -------------------------------------------------------------------------------- 1 | //! Library-wide error types. 2 | //! 3 | //! This stores two important types: [`enum@Error`], which can be made from any error 4 | //! type in this crate, and [`Result`], which is a type alias to `Result`. 6 | //! 7 | //! Any error in this library can be losslessly converted to this type. 8 | 9 | use thiserror::Error; 10 | 11 | /// A generic error type for all `arfur`-related errors. Implements `From` where `E` is an error type from this crate. 12 | #[derive(Error, Clone, Debug, PartialEq, Eq)] 13 | pub enum Error { 14 | #[error(transparent)] 15 | InitializationError(#[from] super::robot::InitializationError), 16 | #[error("unknown")] 17 | Unknown, 18 | } 19 | 20 | /// A wrapper around [`std::result::Result`] that uses [`enum@Error`] as the error type. 21 | pub type Result = std::result::Result; 22 | -------------------------------------------------------------------------------- /nix/wpilib-toolchain.nix: -------------------------------------------------------------------------------- 1 | { 2 | config, 3 | lib, 4 | pkgs, 5 | ... 6 | }: 7 | pkgs.stdenv.mkDerivation rec { 8 | name = "wpilib-cross-compiler"; 9 | version = "2023-9"; 10 | 11 | nativeBuildInputs = with pkgs; [ 12 | # Patch our binaries! 13 | autoPatchelfHook 14 | 15 | # Binary dependencies (patched during build) 16 | # TODO: make sure we actually need each of these deps 17 | ncurses5.dev 18 | zlib.dev 19 | expat.dev 20 | xz.dev 21 | python3 22 | libclang.dev 23 | mpfr.dev 24 | ]; 25 | 26 | src = builtins.fetchTarball { 27 | url = "https://github.com/wpilibsuite/opensdk/releases/download/v2023-9/cortexa9_vfpv3-roborio-academic-2023-x86_64-linux-gnu-Toolchain-12.1.0.tgz"; 28 | sha256 = "0h7c1qc0jmw3a3jb1v1d40ld6yz0fr65pn9xjxb51f8zm0q3k02l"; 29 | }; 30 | 31 | installPhase = '' 32 | mkdir $out 33 | cp -r . $out 34 | ''; 35 | } 36 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "arfur" 3 | description = "A set of bindings and a framework that builds on top of the WPILib suite, enabling Rust-based robot programs in FRC." 4 | version = "0.0.2" 5 | 6 | license = "MIT" 7 | repository = "https://github.com/arfur-rs/arfur/" 8 | 9 | edition = "2021" 10 | rust-version = "1.62" 11 | 12 | [package.metadata.nix] 13 | build = true 14 | 15 | [features] 16 | default = ["arfur-wpilib", "arfur-rev"] 17 | 18 | bindgen = ["arfur-wpilib/bindgen", "arfur-rev/bindgen"] 19 | 20 | [dependencies] 21 | 22 | [dependencies.arfur-wpilib] 23 | path = "./arfur-wpilib" 24 | version = "0.0.2" 25 | optional = true 26 | 27 | [dependencies.arfur-rev] 28 | path = "./arfur-rev" 29 | version = "0.0.1" 30 | optional = true 31 | 32 | [workspace] 33 | members = [ "." 34 | , "arfur-wpilib" 35 | , "arfur-rev" 36 | , "arfur-build" 37 | , "xtask" 38 | ] 39 | 40 | -------------------------------------------------------------------------------- /arfur-wpilib/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "arfur-wpilib" 3 | description = "Bindings to the WPILib suite." 4 | version = "0.0.2" 5 | 6 | license = "MIT" 7 | repository = "https://github.com/arfur-rs/arfur/" 8 | 9 | edition = "2021" 10 | rust-version = "1.62" 11 | 12 | [package.metadata.nix] 13 | build = true 14 | 15 | [features] 16 | bindgen = ["arfur-build/bindgen"] 17 | 18 | [dependencies] 19 | autocxx = "0.26.0" 20 | cxx = "1.0.107" 21 | derive_builder = "0.12.0" 22 | miette = "5.10.0" 23 | thiserror = "1.0.48" 24 | tracing = "0.1.37" 25 | 26 | [build-dependencies] 27 | autocxx-build = "0.26.0" 28 | cxx-build = "1.0.107" 29 | miette = { version = "5.10.0", features = ["fancy"] } 30 | tracing = "0.1.37" 31 | tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } 32 | 33 | [build-dependencies.arfur-build] 34 | version = "0.0.2" 35 | path = "../arfur-build" 36 | 37 | [build-dependencies.tokio] 38 | version = "1.29.1" 39 | features = ["macros", "rt-multi-thread"] 40 | -------------------------------------------------------------------------------- /.github/workflows/tarpaulin.yml: -------------------------------------------------------------------------------- 1 | # name: Coverage 2 | 3 | # on: [push] 4 | 5 | # jobs: 6 | # check: 7 | # runs-on: ubuntu-latest 8 | # steps: 9 | # - name: Checkout repository 10 | # uses: actions/checkout@v3 11 | 12 | # - name: Install dependencies 13 | # run: sudo apt-get install -y gcc-arm-linux-gnueabi pkg-config libssl-dev libc++-dev clang 14 | 15 | # - name: Install stable toolchain 16 | # uses: actions-rs/toolchain@v1 17 | # with: 18 | # toolchain: stable 19 | # override: true 20 | 21 | # - name: Run cargo-tarpaulin 22 | # uses: actions-rs/tarpaulin@v0.1 23 | # with: 24 | # version: '0.15.0' 25 | # args: '-- --test-threads 1' 26 | 27 | # - name: Upload to codecov.io 28 | # uses: codecov/codecov-action@v3 29 | 30 | # - name: Archive code coverage results 31 | # uses: actions/upload-artifact@v1 32 | # with: 33 | # name: code-coverage-report 34 | # path: cobertura.xml 35 | -------------------------------------------------------------------------------- /xtask/src/bindgen.rs: -------------------------------------------------------------------------------- 1 | use clap::Args; 2 | use color_eyre::Result; 3 | use tracing_subscriber::prelude::*; 4 | use tracing_subscriber::{fmt, EnvFilter}; 5 | 6 | #[derive(Args, Debug)] 7 | pub struct BindgenArgs { 8 | #[arg(short, long)] 9 | verbose: bool, 10 | } 11 | 12 | impl BindgenArgs { 13 | pub async fn exec(self) -> Result<()> { 14 | let fmt_layer = fmt::layer().with_target(false); 15 | 16 | let filter_layer = if self.verbose { 17 | EnvFilter::try_from_default_env() 18 | .or_else(|_| EnvFilter::try_new("trace")) 19 | .unwrap() 20 | } else { 21 | EnvFilter::try_from_default_env() 22 | .or_else(|_| EnvFilter::try_new("info")) 23 | .unwrap() 24 | }; 25 | 26 | tracing_subscriber::registry() 27 | .with(filter_layer) 28 | .with(fmt_layer) 29 | .init(); 30 | 31 | arfur_build::runners::wpilib::run(false).await?; 32 | arfur_build::runners::rev::run(false).await?; 33 | 34 | Ok(()) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /arfur-wpilib/src/lib.rs: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | pub mod error; 4 | pub mod robot; 5 | pub mod util; 6 | 7 | pub mod prelude { 8 | //! Common re-exports. 9 | 10 | pub use crate::error::{Error, Result}; 11 | pub use crate::robot::{Robot, RobotBuilder}; 12 | } 13 | 14 | */ 15 | 16 | use autocxx::prelude::*; 17 | 18 | // \ls arfur-wpilib/src/raw/frc/*.h | sed -s 's/arfur-wpilib\/src\/raw\///g' | sed -e 's/\(.*\)/"\1"/' | sed -e 's/\(.*\)/#include \1/' 19 | include_cpp! { 20 | #include "units/angle.h" 21 | #include "frc/interfaces/Gyro.h" 22 | 23 | safety!(unsafe) 24 | 25 | extern_cpp_opaque_type!("frc::SPI", manualffi::SPI) 26 | extern_cpp_opaque_type!("frc::ADXRS450_Gyro", manualffi::ADXRS450_Gyro) 27 | 28 | generate!("units::angle::radian_t") 29 | generate!("units::angle::degree_t") 30 | instantiable!("units::angle::radian_t") 31 | instantiable!("units::angle::degree_t") 32 | 33 | generate!("frc::Gyro") 34 | generate!("frc::Rotation2d") 35 | } 36 | 37 | // TODO: can also move the namespace down to the unsafe extern, see docs. 38 | #[cxx::bridge(namespace = "frc")] 39 | mod manualffi { 40 | unsafe extern "C++" { 41 | include!("shim.h"); 42 | 43 | include!("frc/SPI.h"); 44 | include!("frc/ADXRS450_Gyro.h"); 45 | type SPI; 46 | 47 | type ADXRS450_Gyro; 48 | pub fn new_ADXRS450_Gyro() -> UniquePtr; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /arfur-rev/src/controllers.rs: -------------------------------------------------------------------------------- 1 | pub mod sparkmax { 2 | use std::ffi::c_int; 3 | 4 | use arfur_wpilib::robot::Robot; 5 | 6 | use crate::ffi::root::rev::{CANSparkMax, CANSparkMax_Set}; 7 | 8 | /// A handle to a REV CAN SparkMax motor controller. 9 | #[derive(Debug)] 10 | pub struct SparkMax { 11 | handle: CANSparkMax, 12 | } 13 | 14 | impl SparkMax { 15 | /// Create a new CAN brushless SparkMax. 16 | /// 17 | /// # Safety 18 | /// `id` is a valid CAN id, the motor type is internally ensured. 19 | pub fn new(_: Robot, id: i32) -> Self { 20 | let handle = unsafe { CANSparkMax::new(id as c_int, 0 as c_int) }; 21 | 22 | Self { handle } 23 | } 24 | 25 | #[tracing::instrument] 26 | pub fn reset(&mut self) { 27 | unsafe { 28 | self.handle._base.RestoreFactoryDefaults(true); 29 | } 30 | } 31 | 32 | /// Set the percentage output. 33 | /// 34 | /// Safety: the percentage is a number from -1 to 1. 35 | #[tracing::instrument] 36 | pub fn set_percentage(&mut self, percentage: f64) { 37 | unsafe { 38 | CANSparkMax_Set( 39 | &mut self.handle as *mut _ as *mut std::ffi::c_void, 40 | percentage, 41 | ); 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /arfur-build/src/file.rs: -------------------------------------------------------------------------------- 1 | //! Interface for downloadable files, i.e. a file online that can be resolved 2 | //! to a local file when necessary. 3 | 4 | use std::{io::Cursor, path::PathBuf}; 5 | 6 | use tracing::trace; 7 | 8 | /// A downloadable file. Given a URL, resolve a local file when requested via 9 | /// [`DownloadableFile::get`]. 10 | /// 11 | /// `DownloadableFile`s cache automatically based on URL, meaning files will 12 | /// not download twice. 13 | pub struct DownloadableFile<'a> { 14 | url: &'a str, 15 | } 16 | 17 | impl<'a> DownloadableFile<'a> { 18 | /// Create a new `DownloadableFile` at some URL. 19 | pub fn new(url: &'a str) -> Self { 20 | Self { url } 21 | } 22 | 23 | /// Get the path to the file. Will download if not cached already. Download 24 | /// process is asynchronous. 25 | pub async fn get(&self) -> PathBuf { 26 | let path = PathBuf::new() 27 | .join("/tmp/arfur/") 28 | .join(seahash::hash(self.url.as_bytes()).to_string()); 29 | 30 | if path.exists() { 31 | // We already have it cached. 32 | trace!("{path:?} was already cached."); 33 | } else { 34 | // We don't have this path. Download it and save it. 35 | trace!("{path:?} was not found, downloading..."); 36 | 37 | let zipped = reqwest::get(self.url).await.unwrap().bytes().await.unwrap(); 38 | let _unzipped = zip_extract::extract(Cursor::new(zipped), &path, false).unwrap(); 39 | 40 | trace!("Extracted {path:?} succesfully."); 41 | } 42 | 43 | return path; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | inputs = { 3 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; 4 | 5 | parts.url = "github:hercules-ci/flake-parts"; 6 | 7 | nci.url = "github:yusdacra/nix-cargo-integration"; 8 | devshell.url = "github:numtide/devshell"; 9 | }; 10 | outputs = { 11 | self, 12 | parts, 13 | nci, 14 | devshell, 15 | ... 16 | } @ inputs: 17 | parts.lib.mkFlake {inherit inputs;} { 18 | systems = ["x86_64-linux"]; 19 | 20 | imports = [ 21 | nci.flakeModule 22 | devshell.flakeModule 23 | ]; 24 | 25 | perSystem = { 26 | config, 27 | pkgs, 28 | ... 29 | }: { 30 | nci.projects.arfur.relPath = ""; 31 | 32 | devShells.default = config.nci.outputs.arfur.devShell.overrideAttrs (rust: { 33 | packages = with pkgs; [ 34 | (pkgs.callPackage ./nix/wpilib-toolchain.nix {}) 35 | 36 | pkg-config 37 | openssl.dev 38 | cargo-outdated 39 | cargo-audit 40 | cargo-release 41 | cargo-edit 42 | cargo-expand 43 | git-cliff 44 | glibc_multi 45 | rust-analyzer 46 | ]; 47 | 48 | env."LIBCLANG_PATH" = "${pkgs.libclang.lib}/lib"; 49 | env."BINDGEN_EXTRA_CLANG_ARGS" = with pkgs; '' 50 | ${builtins.readFile "${stdenv.cc}/nix-support/libc-crt1-cflags"} 51 | ${builtins.readFile "${stdenv.cc}/nix-support/libc-cflags"} 52 | ${builtins.readFile "${stdenv.cc}/nix-support/cc-cflags"} 53 | ${builtins.readFile "${stdenv.cc}/nix-support/libcxx-cxxflags"} 54 | 55 | ${lib.optionalString stdenv.cc.isClang "-idirafter ${stdenv.cc.cc}/lib/clang/${lib.getVersion stdenv.cc.cc}/include"} 56 | ${lib.optionalString stdenv.cc.isGNU "-isystem ${stdenv.cc.cc}/include/c++/${lib.getVersion stdenv.cc.cc} -isystem ${stdenv.cc.cc}/include/c++/${lib.getVersion stdenv.cc.cc}/${stdenv.hostPlatform.config} -idirafter ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${lib.getVersion stdenv.cc.cc}/include"} 57 | -I ${glibc_multi.dev}/include/ -L ${glibc_multi}/lib 58 | ''; 59 | env."TARGET_CXX" = "arm-frc2023-linux-gnueabi-g++"; 60 | }); 61 | }; 62 | }; 63 | } 64 | -------------------------------------------------------------------------------- /.github/workflows/msrv.yml: -------------------------------------------------------------------------------- 1 | name: MSRV 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | # check: 7 | # name: Check 8 | # runs-on: ubuntu-latest 9 | # strategy: 10 | # matrix: 11 | # rust: 12 | # - stable 13 | # - nightly 14 | # - 1.62.0 15 | # steps: 16 | # - name: Checkout sources 17 | # uses: actions/checkout@v3 18 | 19 | # - name: Install dependencies 20 | # run: sudo apt-get install -y gcc-arm-linux-gnueabi pkg-config libssl-dev libc++-dev clang 21 | 22 | # - name: Install toolchain 23 | # uses: actions-rs/toolchain@v1 24 | # with: 25 | # toolchain: ${{ matrix.rust }} 26 | # override: true 27 | 28 | # - name: Run cargo check 29 | # uses: actions-rs/cargo@v1 30 | # with: 31 | # command: check 32 | 33 | # test: 34 | # name: Test Suite 35 | # runs-on: ubuntu-latest 36 | # strategy: 37 | # matrix: 38 | # rust: 39 | # - stable 40 | # - nightly 41 | # - 1.62.0 42 | # steps: 43 | # - name: Checkout sources 44 | # uses: actions/checkout@v3 45 | 46 | # - name: Install dependencies 47 | # run: sudo apt-get install -y gcc-arm-linux-gnueabi pkg-config libssl-dev libc++-dev clang 48 | 49 | # - name: Install toolchain 50 | # uses: actions-rs/toolchain@v1 51 | # with: 52 | # toolchain: ${{ matrix.rust }} 53 | # override: true 54 | 55 | # - name: Run cargo test 56 | # uses: actions-rs/cargo@v1 57 | # with: 58 | # command: test 59 | 60 | fmt: 61 | name: Rustfmt 62 | runs-on: ubuntu-latest 63 | strategy: 64 | matrix: 65 | rust: 66 | - stable 67 | - nightly 68 | - nightly 69 | - 1.62.0 70 | steps: 71 | - name: Checkout sources 72 | uses: actions/checkout@v3 73 | 74 | - name: Install dependencies 75 | run: sudo apt-get install -y gcc-arm-linux-gnueabi pkg-config libssl-dev libc++-dev clang 76 | 77 | - name: Install toolchain 78 | uses: actions-rs/toolchain@v1 79 | with: 80 | toolchain: ${{ matrix.rust }} 81 | override: true 82 | 83 | - name: Install rustfmt 84 | run: rustup component add rustfmt 85 | 86 | - name: Run cargo fmt 87 | uses: actions-rs/cargo@v1 88 | with: 89 | command: fmt 90 | args: --all -- --check 91 | -------------------------------------------------------------------------------- /cliff.toml: -------------------------------------------------------------------------------- 1 | # configuration file for git-cliff (0.1.0) 2 | 3 | [changelog] 4 | # changelog header 5 | header = """ 6 | # Changelog\n 7 | All notable changes to this project will be documented in this file.\n 8 | """ 9 | # template for the changelog body 10 | # https://tera.netlify.app/docs/#introduction 11 | body = """ 12 | {% if version %}\ 13 | ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} 14 | {% else %}\ 15 | ## [unreleased] 16 | {% endif %}\ 17 | {% for group, commits in commits | group_by(attribute="group") %} 18 | ### {{ group | upper_first }} 19 | {% for commit in commits %} 20 | - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\ 21 | {% endfor %} 22 | {% endfor %}\n 23 | """ 24 | # remove the leading and trailing whitespace from the template 25 | trim = true 26 | # changelog footer 27 | footer = """ 28 | 29 | """ 30 | 31 | [git] 32 | # parse the commits based on https://www.conventionalcommits.org 33 | conventional_commits = true 34 | # filter out the commits that are not conventional 35 | filter_unconventional = true 36 | # process each line of a commit as an individual commit 37 | split_commits = false 38 | # regex for preprocessing the commit messages 39 | commit_preprocessors = [ 40 | { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](https://github.com/orhun/git-cliff/issues/${2}))"}, 41 | ] 42 | # regex for parsing and grouping commits 43 | commit_parsers = [ 44 | { message = "^feat", group = "Features"}, 45 | { message = "^fix", group = "Bug Fixes"}, 46 | { message = "^doc", group = "Documentation"}, 47 | { message = "^perf", group = "Performance"}, 48 | { message = "^refactor", group = "Refactor"}, 49 | { message = "^style", group = "Styling"}, 50 | { message = "^test", group = "Testing"}, 51 | { message = "^chore\\(release\\): prepare for", skip = true}, 52 | { message = "^chore", group = "Miscellaneous Tasks"}, 53 | { body = ".*security", group = "Security"}, 54 | ] 55 | # filter out the commits that are not matched by commit parsers 56 | filter_commits = false 57 | # glob pattern for matching git tags 58 | tag_pattern = "v[0-9]*" 59 | # regex for skipping tags 60 | skip_tags = "v0.1.0-beta.1" 61 | # regex for ignoring tags 62 | ignore_tags = "" 63 | # sort the tags chronologically 64 | date_order = false 65 | # sort the commits inside sections by oldest/newest order 66 | sort_commits = "oldest" 67 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Arfur 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | Furthermore, the binary distribution of WPILib is licensed under the following terms: 24 | 25 | Copyright (c) 2009-2022 FIRST and other WPILib contributors 26 | All rights reserved. 27 | 28 | Redistribution and use in source and binary forms, with or without 29 | modification, are permitted provided that the following conditions are met: 30 | * Redistributions of source code must retain the above copyright 31 | notice, this list of conditions and the following disclaimer. 32 | * Redistributions in binary form must reproduce the above copyright 33 | notice, this list of conditions and the following disclaimer in the 34 | documentation and/or other materials provided with the distribution. 35 | * Neither the name of FIRST, WPILib, nor the names of other WPILib 36 | contributors may be used to endorse or promote products derived from 37 | this software without specific prior written permission. 38 | 39 | THIS SOFTWARE IS PROVIDED BY FIRST AND OTHER WPILIB CONTRIBUTORS "AS IS" AND 40 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 41 | WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR 42 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR 43 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 44 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 45 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 46 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 47 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 48 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Arfur](./assets/banner.svg) 2 | 3 |
4 | License 5 | · Docs 6 |
7 | 8 |

9 | Crates.io 10 | docs.rs 11 |

12 | 13 | **Arfur** is a set of bindings and a framework that builds on top of the [WPILib](https://wpilib.org/) suite, enabling Rust-based robot programs in [FRC](https://www.firstinspires.org/robotics/frc). 14 | 15 |
16 | 17 | ```rust 18 | use arfur::prelude::*; 19 | 20 | fn main() -> Result<()> { 21 | let robot: Robot = RobotBuilder::default().initialize()?; 22 | 23 | // Having a `Robot` type is proof that the HAL has been initialized. We can 24 | // use to construct all kinds of handles! 25 | 26 | Ok(()) 27 | } 28 | ``` 29 | 30 | ## Features 31 | 32 | * Rust bindings to WPILib: Arfur is a set of bindings, not a reimplementation, 33 | meaning you can expect the reliability of the official WPILib C++ 34 | implementation. 35 | 36 | * Type safety at its finest: The public API is idiomatically Rust, meaning you 37 | have type-level gaurantees that undefined behaviour will not and *cannot* 38 | occur. 39 | 40 | * An efficient robot: Keep the runtime speed provided by C++. Arfur is low- to 41 | zero- overhead. 42 | 43 | * A powerful ecosystem: Hook into Rust's ecosystem for logging, mathematical 44 | computations, and more! 45 | 46 | ## Requirements 47 | 48 | What do you need to get started? 49 | 50 | 51 | 52 | * **Rust** 53 | * MSRV: `1.72.0` 54 | * Toolchain: `stable` 55 | * **ARM Compiler Toolchain**: Since you're building to the RoboRIO, which uses 56 | a different architecture than most personal computers, you'll need a 57 | toolchain that can build to ARM. 58 | * Option 1: install a generic ARM toolchain. 59 | * Option 2: install the 60 | [FRC ARM toolchain](https://github.com/wpilibsuite/opensdk/). 61 | * MSRV: `2023-9` 62 | * Don't forget to point Arfur to your toolchain executable. 63 | * (optional) **Nix**: Use [Nix](https://nixos.org/) to ditch both requirements 64 | mentioned above. 65 | * Your choice of Rust installation method. 66 | * Use the Nix derivation in `./nix` to grab the FRC ARM toolchain. 67 | 68 | 69 | 70 | ## Getting started 71 | 72 | Arfur is still highly in development. Do not consider this project stable by 73 | any means. 74 | 75 | A complete guide is, unfortunately, still in the works. For now, sift through 76 | the crate's [examples](https://github.com/arfur-rs/arfur/tree/main/examples) 77 | and [documentation](https://docs.rs/arfur). There's more to come! 78 | 79 | ## Development 80 | 81 | So, you want to help out with this project? We'd love to chat about the 82 | project, just open an issue or make a PR. 83 | 84 | Due to the inherently complex nature of generate bindings for large projects, 85 | Arfur uses `xtask` to manage the project. After getting access to the source 86 | code (presumably via cloning the git repository), run: 87 | 88 | ``` 89 | cargo xtask bindgen 90 | ``` 91 | 92 | This will generate the bindings as necessary. Then, run: 93 | 94 | ``` 95 | cargo b --example raw_usage --target arm-unknown-linux-gnueabi 96 | ``` 97 | 98 | To build an example. 99 | -------------------------------------------------------------------------------- /arfur-wpilib/src/robot.rs: -------------------------------------------------------------------------------- 1 | //! Robot marker types. 2 | 3 | use tracing::trace; 4 | 5 | /// A robot marker type. 6 | /// 7 | /// In short, a [`Robot`] is simply a marker that you have initialized the HAL. 8 | /// This is necessary because running HAL methods without initialization is UD. 9 | /// **Owning a `Robot` proves that the HAL is in working order**. 10 | /// 11 | /// You can get your hands on a [`Robot`] in one of two ways: 12 | /// 13 | /// * Construct a [`RobotBuilder`], and run its `initialize` method, or 14 | /// * Unsafely construct it without initializing the HAL with [`Self::unsafe_new`]. 15 | /// 16 | /// ``` 17 | /// # fn main() { 18 | /// let robot: Robot = RobotBuilder::new().initialize(); 19 | /// # } 20 | /// ``` 21 | /// 22 | /// Keep in mind that [`Self::unsafe_new`] defeats the point of the builder's 23 | /// `initialize` method. It does not run the necessary HAL initialization code. 24 | /// Only use this method if you are absolutely sure you need it. Using the 25 | /// builder pattern more than once is perfectly fine - WPILib gaurds for double 26 | /// initialization of the HAL internally. 27 | /// 28 | /// See: [`RobotBuilder`] 29 | #[derive(derive_builder::Builder, Clone, Copy, Debug, PartialEq, Eq)] 30 | #[builder( 31 | pattern = "owned", 32 | build_fn( 33 | name = "initialize", 34 | error = "InitializationError", 35 | validate = "Self::validate" 36 | ), 37 | derive(PartialEq, Eq) 38 | )] 39 | pub struct Robot { 40 | /// The timeout argument provided to the HAL. The HAL will try to initialize 41 | /// for `hal_timeout` ms. The default value is 500. 42 | #[builder(default = "500")] 43 | hal_timeout: i32, 44 | /// The mode argument provided to the HAL. See [`HALMode`]. 45 | #[builder(default)] 46 | hal_mode: HALMode, 47 | #[builder(default, setter(skip))] 48 | pub(self) _private: (), 49 | } 50 | 51 | impl Robot { 52 | /// Unsafely construct a [`Robot`] type. 53 | /// 54 | /// You most probably don't want to use this, because creating a Robot 55 | /// without initializing the HAL is undefined behaviour. Unless strictly 56 | /// necessary, try using [`RobotBuilder`] instead. 57 | pub unsafe fn unsafe_new(hal_timeout: i32, hal_mode: HALMode) -> Self { 58 | Self { 59 | hal_timeout, 60 | hal_mode, 61 | _private: (), 62 | } 63 | } 64 | } 65 | 66 | impl RobotBuilder { 67 | /// Validates the builder by initializing the HAL and observing user program 68 | /// start. 69 | fn validate(&self) -> Result<(), InitializationError> { 70 | unsafe { 71 | use crate::ffi::root::{HAL_Initialize, HAL_ObserveUserProgramStarting}; 72 | 73 | // Initialize the HAL. 74 | // TODO: why do we unwrap the hal values? 75 | let status = HAL_Initialize(self.hal_timeout.unwrap(), self.hal_mode.unwrap() as i32); 76 | if status != 1 { 77 | return Err(InitializationError::HALInitializationError); 78 | } 79 | 80 | // Observe the start to the driver station, or else it will 81 | // disable automatically. 82 | // 83 | // This itself is actually a wrapper around NI's NetComm library's 84 | // report() interface. 85 | HAL_ObserveUserProgramStarting(); 86 | } 87 | 88 | println!("Instantiated."); 89 | trace!("Successfully instantiated robot!"); 90 | 91 | Ok(()) 92 | } 93 | } 94 | 95 | /// Error type for initialization. 96 | #[derive(thiserror::Error, Clone, Debug, PartialEq, Eq)] 97 | pub enum InitializationError { 98 | #[error("tried to set the robot instance twice")] 99 | DoubleInitialization, 100 | #[error("failed to initilize HAL (for an unknown reason)")] 101 | HALInitializationError, 102 | #[error("failed to create a c-based string, this is probably a bug in Arfur itself and should be reported immediately")] 103 | CStringConversionError(#[from] std::ffi::NulError), 104 | #[error("uninitialized field found while building")] 105 | UninitializedFieldError(String), 106 | } 107 | 108 | impl From for InitializationError { 109 | fn from(e: derive_builder::UninitializedFieldError) -> Self { 110 | Self::UninitializedFieldError(e.field_name().to_string()) 111 | } 112 | } 113 | 114 | /// A mode for the HAL to start up in. 115 | #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)] 116 | pub enum HALMode { 117 | /// Try to kill an existing HAL from another program, if not successful, error. 118 | #[default] 119 | Kill = 0, 120 | /// Force kill a HAL from another program. 121 | ForceKill = 1, 122 | /// Just warn if another hal exists and cannot be killed. Will likely result in undefined behavior. 123 | Warn = 2, 124 | } 125 | -------------------------------------------------------------------------------- /arfur-build/src/runner.rs: -------------------------------------------------------------------------------- 1 | //! Build script runner. Given a set of libraries to be installed as well as 2 | //! some meta information such as versions, allowlists, etc., the `Runner` type 3 | //! will create a runnable script (started with [`Runner::run`]) that will 4 | //! install and generate bindings to all aforementioned libraries. 5 | 6 | #[cfg(unix)] 7 | use std::os::unix::fs::PermissionsExt; 8 | use std::{fs, io::Cursor, path::Path}; 9 | 10 | use crate::library::Library; 11 | 12 | use color_eyre::{Help, Result}; 13 | use tracing::{info, trace}; 14 | 15 | /// The main build script runner. See [`Self::run`] for more details. 16 | #[derive(Debug)] 17 | pub struct Runner<'a, T: Library> { 18 | /// The desired WPILib version. 19 | version: &'a str, 20 | 21 | /// The desired NI libraries' version. 22 | ni_version: &'a str, 23 | 24 | /// A list of libraries it should install. 25 | libraries: Vec, 26 | 27 | /// The contents of the header file that bindgen will build. 28 | header_contents: &'a str, 29 | 30 | /// The allowlist that will be passed to bindgen. 31 | allowlist: &'a str, 32 | 33 | /// A list of library names we should link to. 34 | lib_list: &'a [&'a str], 35 | 36 | /// The output directory. Among other things, runner will output the .rs 37 | /// bindings here. 38 | output_directory: &'a Path, 39 | 40 | /// Additional arguments passed to clang during bindgen. 41 | clang_args: String, 42 | } 43 | 44 | impl<'a, T: Library> Runner<'a, T> { 45 | /// Create a new [`Runner`]. 46 | pub fn new( 47 | version: &'a str, 48 | ni_version: &'a str, 49 | libraries: Vec, 50 | header_contents: &'a str, 51 | allowlist: &'a str, 52 | lib_list: &'a [&'a str], 53 | output_directory: &'a Path, 54 | clang_args: String, 55 | ) -> Self { 56 | Self { 57 | version, 58 | ni_version, 59 | libraries, 60 | header_contents, 61 | allowlist, 62 | lib_list, 63 | output_directory, 64 | clang_args, 65 | } 66 | } 67 | 68 | /// Run the build script. 69 | pub async fn run(&mut self, link_only: bool) -> Result<()> { 70 | trace!("Running the build script. {self:?}, link_only: {link_only}"); 71 | 72 | let complete_marker_path = self.output_directory.join("arfur.complete"); 73 | 74 | if !complete_marker_path.exists() && !link_only { 75 | info!("Downloading, installing, and linking libraries..."); 76 | 77 | self.download_libraries() 78 | .await 79 | .note("Failed to download libraries.")?; 80 | 81 | self.install_libraries() 82 | .await 83 | .note("Failed to install libraries.")?; 84 | 85 | self.link_libraries() 86 | .note("Failed to ask Cargo to link to libraries.")?; 87 | } 88 | 89 | #[cfg(feature = "bindgen")] 90 | self.generate_bindings() 91 | .await 92 | .note("Failed to generate bindings.")?; 93 | 94 | self.cleanup().note("Failed to clean up after build.")?; 95 | 96 | Ok(()) 97 | } 98 | 99 | /// Download the libraries from the FRC Maven JFrog repository. This method 100 | /// downloads to {output_directory}/raw/. If this function succeeds, every 101 | /// FRC-related library should be available (unzipped) in this directory. 102 | pub async fn download_libraries(&mut self) -> Result<()> { 103 | let extracted_dir = self.output_directory.join("raw"); 104 | 105 | for library in &self.libraries { 106 | let link = library.get_link(self.version, self.ni_version); 107 | 108 | let zipped = reqwest::get(link) 109 | .await 110 | .note("Failed to download archive.")? 111 | .bytes() 112 | .await 113 | .note("Failed to convert archive into bytes.")?; 114 | 115 | zip_extract::extract(Cursor::new(zipped), &extracted_dir, false) 116 | .note("Failed to extract zip file.")?; 117 | } 118 | 119 | Ok(()) 120 | } 121 | 122 | /// Ready the libraries for linking. While in theory this step should also 123 | /// move them to a separate directory, it's much easier to keep them in 124 | /// their existing directory and make changes on that. 125 | /// 126 | /// This method will set all .so files to executable, remove the .debug 127 | /// files, and rename malformed files (e.g. libX.so.22.0.0 to libX.so). 128 | pub async fn install_libraries(&mut self) -> Result<()> { 129 | let dynamic_library_dir = self 130 | .output_directory 131 | .join("raw") 132 | .join("linux") 133 | .join("athena") 134 | .join("shared"); 135 | 136 | #[cfg(unix)] 137 | { 138 | fs::set_permissions(&dynamic_library_dir, fs::Permissions::from_mode(0o755))?; 139 | } 140 | for file in fs::read_dir(&dynamic_library_dir)? { 141 | let file = file?; 142 | #[cfg(unix)] 143 | { 144 | fs::set_permissions(&file.path(), fs::Permissions::from_mode(0o755))?; 145 | } 146 | 147 | if file.file_name().to_str().unwrap().ends_with(".debug") { 148 | // If it's a debug file, just delete it. 149 | fs::remove_file(file.path())?; 150 | } else if !&file.file_name().to_str().unwrap().ends_with(".so") { 151 | // The file does not end with .so, so rename it by popping the 152 | // last 7 characters. 153 | // 154 | // Turns `libX.so.22.0.0` to `libX.so`. 155 | 156 | let name = file.file_name(); 157 | let mut name = name.to_str().unwrap().chars(); 158 | for _ in 1..8 { 159 | name.next_back(); 160 | } 161 | let name = name.as_str(); 162 | let mut new_name = file.path(); 163 | new_name.set_file_name(name); 164 | fs::rename(file.path(), new_name)?; 165 | } 166 | } 167 | 168 | Ok(()) 169 | } 170 | 171 | /// Ask Cargo to link to the dynamic libraries. 172 | pub fn link_libraries(&mut self) -> Result<()> { 173 | let dynamic_library_dir = self 174 | .output_directory 175 | .join("raw") 176 | .join("linux") 177 | .join("athena") 178 | .join("shared"); 179 | 180 | for lib in self.lib_list.iter() { 181 | println!("cargo:rustc-link-lib=dylib={}", lib); 182 | } 183 | 184 | println!( 185 | "cargo:rustc-link-search=native={dynamic_library_dir}", 186 | dynamic_library_dir = dynamic_library_dir.to_str().unwrap() 187 | ); 188 | 189 | Ok(()) 190 | } 191 | 192 | /// Use `bindgen` to generate bindings. 193 | #[cfg(feature = "bindgen")] 194 | pub async fn generate_bindings(&mut self) -> Result<()> { 195 | let raw_directory = self.output_directory.join("raw"); 196 | 197 | let bindings = bindgen::Builder::default() 198 | // TODO: check if this works with more than one runner. 199 | .header_contents("runner-header", self.header_contents) 200 | .parse_callbacks(Box::new(bindgen::CargoCallbacks)) 201 | .enable_cxx_namespaces() 202 | .allowlist_function(self.allowlist) 203 | .allowlist_type(self.allowlist) 204 | .allowlist_var(self.allowlist) 205 | .manually_drop_union(".*") 206 | .default_non_copy_union_style(bindgen::NonCopyUnionStyle::ManuallyDrop) 207 | .clang_arg(format!("-I{}", raw_directory.to_str().unwrap())) 208 | .clang_arg(self.clang_args.clone()) 209 | .clang_arg("-std=c++17") 210 | .clang_args(&["-x", "c++"]); 211 | 212 | trace!("clang command: {:?}", bindings.command_line_flags()); 213 | 214 | bindings 215 | .generate() 216 | .note("Failed to generate bindings...")? 217 | .write_to_file(self.output_directory.join("bindings.rs")) 218 | .note("Failed to write bindings file...")?; 219 | 220 | Ok(()) 221 | } 222 | 223 | /// Clean up after a run. 224 | pub fn cleanup(&mut self) -> Result<()> { 225 | let complete_marker_path = self.output_directory.join("arfur.complete"); 226 | 227 | fs::File::create(complete_marker_path)?; 228 | 229 | Ok(()) 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "crane": { 4 | "flake": false, 5 | "locked": { 6 | "lastModified": 1681175776, 7 | "narHash": "sha256-7SsUy9114fryHAZ8p1L6G6YSu7jjz55FddEwa2U8XZc=", 8 | "owner": "ipetkov", 9 | "repo": "crane", 10 | "rev": "445a3d222947632b5593112bb817850e8a9cf737", 11 | "type": "github" 12 | }, 13 | "original": { 14 | "owner": "ipetkov", 15 | "ref": "v0.12.1", 16 | "repo": "crane", 17 | "type": "github" 18 | } 19 | }, 20 | "devshell": { 21 | "inputs": { 22 | "nixpkgs": "nixpkgs", 23 | "systems": "systems" 24 | }, 25 | "locked": { 26 | "lastModified": 1692793255, 27 | "narHash": "sha256-yVyj0AE280JkccDHuG1XO9oGxN6bW8ksr/xttXcXzK0=", 28 | "owner": "numtide", 29 | "repo": "devshell", 30 | "rev": "2aa26972b951bc05c3632d4e5ae683cb6771a7c6", 31 | "type": "github" 32 | }, 33 | "original": { 34 | "owner": "numtide", 35 | "repo": "devshell", 36 | "type": "github" 37 | } 38 | }, 39 | "dream2nix": { 40 | "inputs": { 41 | "all-cabal-json": [ 42 | "nci" 43 | ], 44 | "crane": "crane", 45 | "devshell": [ 46 | "nci" 47 | ], 48 | "drv-parts": "drv-parts", 49 | "flake-compat": "flake-compat", 50 | "flake-parts": [ 51 | "nci", 52 | "parts" 53 | ], 54 | "flake-utils-pre-commit": [ 55 | "nci" 56 | ], 57 | "ghc-utils": [ 58 | "nci" 59 | ], 60 | "gomod2nix": [ 61 | "nci" 62 | ], 63 | "mach-nix": [ 64 | "nci" 65 | ], 66 | "nix-pypi-fetcher": [ 67 | "nci" 68 | ], 69 | "nixpkgs": [ 70 | "nci", 71 | "nixpkgs" 72 | ], 73 | "nixpkgsV1": "nixpkgsV1", 74 | "poetry2nix": [ 75 | "nci" 76 | ], 77 | "pre-commit-hooks": [ 78 | "nci" 79 | ], 80 | "pruned-racket-catalog": [ 81 | "nci" 82 | ] 83 | }, 84 | "locked": { 85 | "lastModified": 1690660611, 86 | "narHash": "sha256-nfDb1koAB/bD2pzENgVe+q4lwi9tgwR772dZgaGR4Io=", 87 | "owner": "nix-community", 88 | "repo": "dream2nix", 89 | "rev": "ce7b3975b63062b9e440e48a75a5c12253231af5", 90 | "type": "github" 91 | }, 92 | "original": { 93 | "owner": "nix-community", 94 | "ref": "legacy", 95 | "repo": "dream2nix", 96 | "type": "github" 97 | } 98 | }, 99 | "drv-parts": { 100 | "inputs": { 101 | "flake-compat": [ 102 | "nci", 103 | "dream2nix", 104 | "flake-compat" 105 | ], 106 | "flake-parts": [ 107 | "nci", 108 | "dream2nix", 109 | "flake-parts" 110 | ], 111 | "nixpkgs": [ 112 | "nci", 113 | "dream2nix", 114 | "nixpkgs" 115 | ] 116 | }, 117 | "locked": { 118 | "lastModified": 1680698112, 119 | "narHash": "sha256-FgnobN/DvCjEsc0UAZEAdPLkL4IZi2ZMnu2K2bUaElc=", 120 | "owner": "davhau", 121 | "repo": "drv-parts", 122 | "rev": "e8c2ec1157dc1edb002989669a0dbd935f430201", 123 | "type": "github" 124 | }, 125 | "original": { 126 | "owner": "davhau", 127 | "repo": "drv-parts", 128 | "type": "github" 129 | } 130 | }, 131 | "flake-compat": { 132 | "flake": false, 133 | "locked": { 134 | "lastModified": 1673956053, 135 | "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", 136 | "owner": "edolstra", 137 | "repo": "flake-compat", 138 | "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", 139 | "type": "github" 140 | }, 141 | "original": { 142 | "owner": "edolstra", 143 | "repo": "flake-compat", 144 | "type": "github" 145 | } 146 | }, 147 | "mk-naked-shell": { 148 | "flake": false, 149 | "locked": { 150 | "lastModified": 1681286841, 151 | "narHash": "sha256-3XlJrwlR0nBiREnuogoa5i1b4+w/XPe0z8bbrJASw0g=", 152 | "owner": "yusdacra", 153 | "repo": "mk-naked-shell", 154 | "rev": "7612f828dd6f22b7fb332cc69440e839d7ffe6bd", 155 | "type": "github" 156 | }, 157 | "original": { 158 | "owner": "yusdacra", 159 | "repo": "mk-naked-shell", 160 | "type": "github" 161 | } 162 | }, 163 | "nci": { 164 | "inputs": { 165 | "dream2nix": "dream2nix", 166 | "mk-naked-shell": "mk-naked-shell", 167 | "nixpkgs": "nixpkgs_2", 168 | "parts": "parts", 169 | "rust-overlay": "rust-overlay", 170 | "treefmt": "treefmt" 171 | }, 172 | "locked": { 173 | "lastModified": 1693634961, 174 | "narHash": "sha256-sgEk40hLbWwAU59CZzOa7fJjKCgh9RRXhWoyApDVVHc=", 175 | "owner": "yusdacra", 176 | "repo": "nix-cargo-integration", 177 | "rev": "0f419cac4001e9af3ce1438a442aa5c98d9de0ad", 178 | "type": "github" 179 | }, 180 | "original": { 181 | "owner": "yusdacra", 182 | "repo": "nix-cargo-integration", 183 | "type": "github" 184 | } 185 | }, 186 | "nixpkgs": { 187 | "locked": { 188 | "lastModified": 1677383253, 189 | "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=", 190 | "owner": "NixOS", 191 | "repo": "nixpkgs", 192 | "rev": "9952d6bc395f5841262b006fbace8dd7e143b634", 193 | "type": "github" 194 | }, 195 | "original": { 196 | "owner": "NixOS", 197 | "ref": "nixpkgs-unstable", 198 | "repo": "nixpkgs", 199 | "type": "github" 200 | } 201 | }, 202 | "nixpkgs-lib": { 203 | "locked": { 204 | "dir": "lib", 205 | "lastModified": 1693471703, 206 | "narHash": "sha256-0l03ZBL8P1P6z8MaSDS/MvuU8E75rVxe5eE1N6gxeTo=", 207 | "owner": "NixOS", 208 | "repo": "nixpkgs", 209 | "rev": "3e52e76b70d5508f3cec70b882a29199f4d1ee85", 210 | "type": "github" 211 | }, 212 | "original": { 213 | "dir": "lib", 214 | "owner": "NixOS", 215 | "ref": "nixos-unstable", 216 | "repo": "nixpkgs", 217 | "type": "github" 218 | } 219 | }, 220 | "nixpkgsV1": { 221 | "locked": { 222 | "lastModified": 1686501370, 223 | "narHash": "sha256-G0WuM9fqTPRc2URKP9Lgi5nhZMqsfHGrdEbrLvAPJcg=", 224 | "owner": "NixOS", 225 | "repo": "nixpkgs", 226 | "rev": "75a5ebf473cd60148ba9aec0d219f72e5cf52519", 227 | "type": "github" 228 | }, 229 | "original": { 230 | "id": "nixpkgs", 231 | "ref": "nixos-unstable", 232 | "type": "indirect" 233 | } 234 | }, 235 | "nixpkgs_2": { 236 | "locked": { 237 | "lastModified": 1693565476, 238 | "narHash": "sha256-ya00zHt7YbPo3ve/wNZ/6nts61xt7wK/APa6aZAfey0=", 239 | "owner": "NixOS", 240 | "repo": "nixpkgs", 241 | "rev": "aa8aa7e2ea35ce655297e8322dc82bf77a31d04b", 242 | "type": "github" 243 | }, 244 | "original": { 245 | "owner": "NixOS", 246 | "ref": "nixos-unstable", 247 | "repo": "nixpkgs", 248 | "type": "github" 249 | } 250 | }, 251 | "nixpkgs_3": { 252 | "locked": { 253 | "lastModified": 1693565476, 254 | "narHash": "sha256-ya00zHt7YbPo3ve/wNZ/6nts61xt7wK/APa6aZAfey0=", 255 | "owner": "NixOS", 256 | "repo": "nixpkgs", 257 | "rev": "aa8aa7e2ea35ce655297e8322dc82bf77a31d04b", 258 | "type": "github" 259 | }, 260 | "original": { 261 | "owner": "NixOS", 262 | "ref": "nixos-unstable", 263 | "repo": "nixpkgs", 264 | "type": "github" 265 | } 266 | }, 267 | "parts": { 268 | "inputs": { 269 | "nixpkgs-lib": [ 270 | "nci", 271 | "nixpkgs" 272 | ] 273 | }, 274 | "locked": { 275 | "lastModified": 1693611461, 276 | "narHash": "sha256-aPODl8vAgGQ0ZYFIRisxYG5MOGSkIczvu2Cd8Gb9+1Y=", 277 | "owner": "hercules-ci", 278 | "repo": "flake-parts", 279 | "rev": "7f53fdb7bdc5bb237da7fefef12d099e4fd611ca", 280 | "type": "github" 281 | }, 282 | "original": { 283 | "owner": "hercules-ci", 284 | "repo": "flake-parts", 285 | "type": "github" 286 | } 287 | }, 288 | "parts_2": { 289 | "inputs": { 290 | "nixpkgs-lib": "nixpkgs-lib" 291 | }, 292 | "locked": { 293 | "lastModified": 1693611461, 294 | "narHash": "sha256-aPODl8vAgGQ0ZYFIRisxYG5MOGSkIczvu2Cd8Gb9+1Y=", 295 | "owner": "hercules-ci", 296 | "repo": "flake-parts", 297 | "rev": "7f53fdb7bdc5bb237da7fefef12d099e4fd611ca", 298 | "type": "github" 299 | }, 300 | "original": { 301 | "owner": "hercules-ci", 302 | "repo": "flake-parts", 303 | "type": "github" 304 | } 305 | }, 306 | "root": { 307 | "inputs": { 308 | "devshell": "devshell", 309 | "nci": "nci", 310 | "nixpkgs": "nixpkgs_3", 311 | "parts": "parts_2" 312 | } 313 | }, 314 | "rust-overlay": { 315 | "flake": false, 316 | "locked": { 317 | "lastModified": 1693620498, 318 | "narHash": "sha256-GPhAI2YayaSs3WYeVVbGN3K4mvRTbui/ii7YGoABZBs=", 319 | "owner": "oxalica", 320 | "repo": "rust-overlay", 321 | "rev": "cdf3b15af70f2db17d5f47822f12016f1a89bd73", 322 | "type": "github" 323 | }, 324 | "original": { 325 | "owner": "oxalica", 326 | "repo": "rust-overlay", 327 | "type": "github" 328 | } 329 | }, 330 | "systems": { 331 | "locked": { 332 | "lastModified": 1681028828, 333 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 334 | "owner": "nix-systems", 335 | "repo": "default", 336 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 337 | "type": "github" 338 | }, 339 | "original": { 340 | "owner": "nix-systems", 341 | "repo": "default", 342 | "type": "github" 343 | } 344 | }, 345 | "treefmt": { 346 | "inputs": { 347 | "nixpkgs": [ 348 | "nci", 349 | "nixpkgs" 350 | ] 351 | }, 352 | "locked": { 353 | "lastModified": 1693468138, 354 | "narHash": "sha256-DddblCahuTW8K0ncPOheTlG3igE8b15LJjafF1PWhOo=", 355 | "owner": "numtide", 356 | "repo": "treefmt-nix", 357 | "rev": "6930a5ba0a722385baf273885a03f561dcb1af67", 358 | "type": "github" 359 | }, 360 | "original": { 361 | "owner": "numtide", 362 | "repo": "treefmt-nix", 363 | "type": "github" 364 | } 365 | } 366 | }, 367 | "root": "root", 368 | "version": 7 369 | } 370 | -------------------------------------------------------------------------------- /assets/banner.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 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 = "aes" 22 | version = "0.8.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" 25 | dependencies = [ 26 | "cfg-if", 27 | "cipher", 28 | "cpufeatures", 29 | ] 30 | 31 | [[package]] 32 | name = "aho-corasick" 33 | version = "0.7.20" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" 36 | dependencies = [ 37 | "memchr", 38 | ] 39 | 40 | [[package]] 41 | name = "anstream" 42 | version = "0.5.0" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" 45 | dependencies = [ 46 | "anstyle", 47 | "anstyle-parse", 48 | "anstyle-query", 49 | "anstyle-wincon", 50 | "colorchoice", 51 | "utf8parse", 52 | ] 53 | 54 | [[package]] 55 | name = "anstyle" 56 | version = "1.0.2" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" 59 | 60 | [[package]] 61 | name = "anstyle-parse" 62 | version = "0.2.1" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" 65 | dependencies = [ 66 | "utf8parse", 67 | ] 68 | 69 | [[package]] 70 | name = "anstyle-query" 71 | version = "1.0.0" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" 74 | dependencies = [ 75 | "windows-sys", 76 | ] 77 | 78 | [[package]] 79 | name = "anstyle-wincon" 80 | version = "2.1.0" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" 83 | dependencies = [ 84 | "anstyle", 85 | "windows-sys", 86 | ] 87 | 88 | [[package]] 89 | name = "aquamarine" 90 | version = "0.1.12" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "a941c39708478e8eea39243b5983f1c42d2717b3620ee91f4a52115fd02ac43f" 93 | dependencies = [ 94 | "itertools 0.9.0", 95 | "proc-macro-error", 96 | "proc-macro2", 97 | "quote", 98 | "syn 1.0.109", 99 | ] 100 | 101 | [[package]] 102 | name = "arfur" 103 | version = "0.0.2" 104 | dependencies = [ 105 | "arfur-rev", 106 | "arfur-wpilib", 107 | ] 108 | 109 | [[package]] 110 | name = "arfur-build" 111 | version = "0.0.2" 112 | dependencies = [ 113 | "bindgen", 114 | "color-eyre", 115 | "once_cell", 116 | "reqwest", 117 | "seahash", 118 | "tracing", 119 | "zip-extract", 120 | ] 121 | 122 | [[package]] 123 | name = "arfur-rev" 124 | version = "0.0.1" 125 | dependencies = [ 126 | "arfur-build", 127 | "arfur-wpilib", 128 | "color-eyre", 129 | "derive_builder", 130 | "thiserror", 131 | "tokio", 132 | "tracing", 133 | ] 134 | 135 | [[package]] 136 | name = "arfur-wpilib" 137 | version = "0.0.2" 138 | dependencies = [ 139 | "arfur-build", 140 | "autocxx", 141 | "autocxx-build", 142 | "cxx", 143 | "cxx-build", 144 | "derive_builder", 145 | "miette", 146 | "thiserror", 147 | "tokio", 148 | "tracing", 149 | "tracing-subscriber", 150 | ] 151 | 152 | [[package]] 153 | name = "atty" 154 | version = "0.2.14" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 157 | dependencies = [ 158 | "hermit-abi 0.1.19", 159 | "libc", 160 | "winapi", 161 | ] 162 | 163 | [[package]] 164 | name = "autocfg" 165 | version = "1.1.0" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 168 | 169 | [[package]] 170 | name = "autocxx" 171 | version = "0.26.0" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "1ba64dd33efd8f09724143d45ab91b48aebcee52f4fb11add3464c998fab47dc" 174 | dependencies = [ 175 | "aquamarine", 176 | "autocxx-macro", 177 | "cxx", 178 | "moveit", 179 | ] 180 | 181 | [[package]] 182 | name = "autocxx-bindgen" 183 | version = "0.65.1" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "6c9fb7b8dd83a582e12157367773d8d1195f2dea54d4250aaf3426abae3237aa" 186 | dependencies = [ 187 | "bitflags 1.3.2", 188 | "cexpr", 189 | "clang-sys", 190 | "itertools 0.10.5", 191 | "lazy_static", 192 | "lazycell", 193 | "log", 194 | "peeking_take_while", 195 | "prettyplease", 196 | "proc-macro2", 197 | "quote", 198 | "regex", 199 | "rustc-hash", 200 | "shlex", 201 | "syn 2.0.29", 202 | "which", 203 | ] 204 | 205 | [[package]] 206 | name = "autocxx-build" 207 | version = "0.26.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "955e602d2d68b79ca5d674984259234fad2c8d869ad99011699e0a3cd76f38cd" 210 | dependencies = [ 211 | "autocxx-engine", 212 | "env_logger", 213 | "indexmap", 214 | "syn 2.0.29", 215 | ] 216 | 217 | [[package]] 218 | name = "autocxx-engine" 219 | version = "0.26.0" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "5918896fc1d44a647345fd5e8c74208424e394a76bdd2942398f4aff81ec7ab1" 222 | dependencies = [ 223 | "aquamarine", 224 | "autocxx-bindgen", 225 | "autocxx-parser", 226 | "cc", 227 | "cxx-gen", 228 | "indexmap", 229 | "indoc", 230 | "itertools 0.10.5", 231 | "log", 232 | "miette", 233 | "once_cell", 234 | "prettyplease", 235 | "proc-macro2", 236 | "quote", 237 | "regex", 238 | "rustversion", 239 | "serde_json", 240 | "strum_macros", 241 | "syn 2.0.29", 242 | "tempfile", 243 | "thiserror", 244 | "version_check", 245 | ] 246 | 247 | [[package]] 248 | name = "autocxx-macro" 249 | version = "0.26.0" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "8e594e68d030b6eb1ce7e2b40958f4f4ae7150c588c76d76b9f8178d41c47d80" 252 | dependencies = [ 253 | "autocxx-parser", 254 | "proc-macro-error", 255 | "proc-macro2", 256 | "quote", 257 | "syn 2.0.29", 258 | ] 259 | 260 | [[package]] 261 | name = "autocxx-parser" 262 | version = "0.26.0" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "2ef00b2fc378804c31c4fbd693a7fea93f8a90467dce331dae1e4ce41e542953" 265 | dependencies = [ 266 | "indexmap", 267 | "itertools 0.10.5", 268 | "log", 269 | "once_cell", 270 | "proc-macro2", 271 | "quote", 272 | "serde", 273 | "serde_json", 274 | "syn 2.0.29", 275 | "thiserror", 276 | ] 277 | 278 | [[package]] 279 | name = "backtrace" 280 | version = "0.3.69" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 283 | dependencies = [ 284 | "addr2line", 285 | "cc", 286 | "cfg-if", 287 | "libc", 288 | "miniz_oxide", 289 | "object", 290 | "rustc-demangle", 291 | ] 292 | 293 | [[package]] 294 | name = "backtrace-ext" 295 | version = "0.2.1" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" 298 | dependencies = [ 299 | "backtrace", 300 | ] 301 | 302 | [[package]] 303 | name = "base64" 304 | version = "0.21.3" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" 307 | 308 | [[package]] 309 | name = "base64ct" 310 | version = "1.6.0" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 313 | 314 | [[package]] 315 | name = "bindgen" 316 | version = "0.66.1" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" 319 | dependencies = [ 320 | "bitflags 2.4.0", 321 | "cexpr", 322 | "clang-sys", 323 | "lazy_static", 324 | "lazycell", 325 | "log", 326 | "peeking_take_while", 327 | "prettyplease", 328 | "proc-macro2", 329 | "quote", 330 | "regex", 331 | "rustc-hash", 332 | "shlex", 333 | "syn 2.0.29", 334 | "which", 335 | ] 336 | 337 | [[package]] 338 | name = "bitflags" 339 | version = "1.3.2" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 342 | 343 | [[package]] 344 | name = "bitflags" 345 | version = "2.4.0" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" 348 | 349 | [[package]] 350 | name = "block-buffer" 351 | version = "0.10.4" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 354 | dependencies = [ 355 | "generic-array", 356 | ] 357 | 358 | [[package]] 359 | name = "bumpalo" 360 | version = "3.13.0" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" 363 | 364 | [[package]] 365 | name = "byteorder" 366 | version = "1.4.3" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 369 | 370 | [[package]] 371 | name = "bytes" 372 | version = "1.4.0" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 375 | 376 | [[package]] 377 | name = "bzip2" 378 | version = "0.4.4" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" 381 | dependencies = [ 382 | "bzip2-sys", 383 | "libc", 384 | ] 385 | 386 | [[package]] 387 | name = "bzip2-sys" 388 | version = "0.1.11+1.0.8" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" 391 | dependencies = [ 392 | "cc", 393 | "libc", 394 | "pkg-config", 395 | ] 396 | 397 | [[package]] 398 | name = "cc" 399 | version = "1.0.83" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 402 | dependencies = [ 403 | "jobserver", 404 | "libc", 405 | ] 406 | 407 | [[package]] 408 | name = "cexpr" 409 | version = "0.6.0" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 412 | dependencies = [ 413 | "nom", 414 | ] 415 | 416 | [[package]] 417 | name = "cfg-if" 418 | version = "1.0.0" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 421 | 422 | [[package]] 423 | name = "cipher" 424 | version = "0.4.4" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 427 | dependencies = [ 428 | "crypto-common", 429 | "inout", 430 | ] 431 | 432 | [[package]] 433 | name = "clang-sys" 434 | version = "1.4.0" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3" 437 | dependencies = [ 438 | "glob", 439 | "libc", 440 | "libloading", 441 | ] 442 | 443 | [[package]] 444 | name = "clap" 445 | version = "4.4.2" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" 448 | dependencies = [ 449 | "clap_builder", 450 | "clap_derive", 451 | ] 452 | 453 | [[package]] 454 | name = "clap_builder" 455 | version = "4.4.2" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" 458 | dependencies = [ 459 | "anstream", 460 | "anstyle", 461 | "clap_lex", 462 | "strsim", 463 | ] 464 | 465 | [[package]] 466 | name = "clap_derive" 467 | version = "4.4.2" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" 470 | dependencies = [ 471 | "heck", 472 | "proc-macro2", 473 | "quote", 474 | "syn 2.0.29", 475 | ] 476 | 477 | [[package]] 478 | name = "clap_lex" 479 | version = "0.5.1" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" 482 | 483 | [[package]] 484 | name = "codespan-reporting" 485 | version = "0.11.1" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 488 | dependencies = [ 489 | "termcolor", 490 | "unicode-width", 491 | ] 492 | 493 | [[package]] 494 | name = "color-eyre" 495 | version = "0.6.2" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" 498 | dependencies = [ 499 | "backtrace", 500 | "color-spantrace", 501 | "eyre", 502 | "indenter", 503 | "once_cell", 504 | "owo-colors", 505 | "tracing-error", 506 | ] 507 | 508 | [[package]] 509 | name = "color-spantrace" 510 | version = "0.2.0" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" 513 | dependencies = [ 514 | "once_cell", 515 | "owo-colors", 516 | "tracing-core", 517 | "tracing-error", 518 | ] 519 | 520 | [[package]] 521 | name = "colorchoice" 522 | version = "1.0.0" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 525 | 526 | [[package]] 527 | name = "constant_time_eq" 528 | version = "0.1.5" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 531 | 532 | [[package]] 533 | name = "core-foundation" 534 | version = "0.9.3" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 537 | dependencies = [ 538 | "core-foundation-sys", 539 | "libc", 540 | ] 541 | 542 | [[package]] 543 | name = "core-foundation-sys" 544 | version = "0.8.4" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 547 | 548 | [[package]] 549 | name = "cpufeatures" 550 | version = "0.2.9" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" 553 | dependencies = [ 554 | "libc", 555 | ] 556 | 557 | [[package]] 558 | name = "crc32fast" 559 | version = "1.3.2" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 562 | dependencies = [ 563 | "cfg-if", 564 | ] 565 | 566 | [[package]] 567 | name = "crossbeam-utils" 568 | version = "0.8.16" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" 571 | dependencies = [ 572 | "cfg-if", 573 | ] 574 | 575 | [[package]] 576 | name = "crypto-common" 577 | version = "0.1.6" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 580 | dependencies = [ 581 | "generic-array", 582 | "typenum", 583 | ] 584 | 585 | [[package]] 586 | name = "cxx" 587 | version = "1.0.107" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "bbe98ba1789d56fb3db3bee5e032774d4f421b685de7ba703643584ba24effbe" 590 | dependencies = [ 591 | "cc", 592 | "cxxbridge-flags", 593 | "cxxbridge-macro", 594 | "link-cplusplus", 595 | ] 596 | 597 | [[package]] 598 | name = "cxx-build" 599 | version = "1.0.107" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "c4ce20f6b8433da4841b1dadfb9468709868022d829d5ca1f2ffbda928455ea3" 602 | dependencies = [ 603 | "cc", 604 | "codespan-reporting", 605 | "once_cell", 606 | "proc-macro2", 607 | "quote", 608 | "scratch", 609 | "syn 2.0.29", 610 | ] 611 | 612 | [[package]] 613 | name = "cxx-gen" 614 | version = "0.7.107" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "cb5062549c7a2c56d9e807eb0244e18c5750616d62e77fd78d9886a2877662d3" 617 | dependencies = [ 618 | "codespan-reporting", 619 | "proc-macro2", 620 | "quote", 621 | "syn 2.0.29", 622 | ] 623 | 624 | [[package]] 625 | name = "cxxbridge-flags" 626 | version = "1.0.107" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "20888d9e1d2298e2ff473cee30efe7d5036e437857ab68bbfea84c74dba91da2" 629 | 630 | [[package]] 631 | name = "cxxbridge-macro" 632 | version = "1.0.107" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "2fa16a70dd58129e4dfffdff535fb1bce66673f7bbeec4a5a1765a504e1ccd84" 635 | dependencies = [ 636 | "proc-macro2", 637 | "quote", 638 | "syn 2.0.29", 639 | ] 640 | 641 | [[package]] 642 | name = "darling" 643 | version = "0.14.4" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" 646 | dependencies = [ 647 | "darling_core", 648 | "darling_macro", 649 | ] 650 | 651 | [[package]] 652 | name = "darling_core" 653 | version = "0.14.4" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" 656 | dependencies = [ 657 | "fnv", 658 | "ident_case", 659 | "proc-macro2", 660 | "quote", 661 | "strsim", 662 | "syn 1.0.109", 663 | ] 664 | 665 | [[package]] 666 | name = "darling_macro" 667 | version = "0.14.4" 668 | source = "registry+https://github.com/rust-lang/crates.io-index" 669 | checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" 670 | dependencies = [ 671 | "darling_core", 672 | "quote", 673 | "syn 1.0.109", 674 | ] 675 | 676 | [[package]] 677 | name = "deranged" 678 | version = "0.3.8" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" 681 | 682 | [[package]] 683 | name = "derive_builder" 684 | version = "0.12.0" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" 687 | dependencies = [ 688 | "derive_builder_macro", 689 | ] 690 | 691 | [[package]] 692 | name = "derive_builder_core" 693 | version = "0.12.0" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" 696 | dependencies = [ 697 | "darling", 698 | "proc-macro2", 699 | "quote", 700 | "syn 1.0.109", 701 | ] 702 | 703 | [[package]] 704 | name = "derive_builder_macro" 705 | version = "0.12.0" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" 708 | dependencies = [ 709 | "derive_builder_core", 710 | "syn 1.0.109", 711 | ] 712 | 713 | [[package]] 714 | name = "digest" 715 | version = "0.10.7" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 718 | dependencies = [ 719 | "block-buffer", 720 | "crypto-common", 721 | "subtle", 722 | ] 723 | 724 | [[package]] 725 | name = "either" 726 | version = "1.8.0" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 729 | 730 | [[package]] 731 | name = "encoding_rs" 732 | version = "0.8.33" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 735 | dependencies = [ 736 | "cfg-if", 737 | ] 738 | 739 | [[package]] 740 | name = "env_logger" 741 | version = "0.9.3" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" 744 | dependencies = [ 745 | "atty", 746 | "humantime", 747 | "log", 748 | "regex", 749 | "termcolor", 750 | ] 751 | 752 | [[package]] 753 | name = "errno" 754 | version = "0.3.3" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" 757 | dependencies = [ 758 | "errno-dragonfly", 759 | "libc", 760 | "windows-sys", 761 | ] 762 | 763 | [[package]] 764 | name = "errno-dragonfly" 765 | version = "0.1.2" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 768 | dependencies = [ 769 | "cc", 770 | "libc", 771 | ] 772 | 773 | [[package]] 774 | name = "eyre" 775 | version = "0.6.8" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" 778 | dependencies = [ 779 | "indenter", 780 | "once_cell", 781 | ] 782 | 783 | [[package]] 784 | name = "fastrand" 785 | version = "2.0.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" 788 | 789 | [[package]] 790 | name = "flate2" 791 | version = "1.0.27" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" 794 | dependencies = [ 795 | "crc32fast", 796 | "miniz_oxide", 797 | ] 798 | 799 | [[package]] 800 | name = "fnv" 801 | version = "1.0.7" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 804 | 805 | [[package]] 806 | name = "foreign-types" 807 | version = "0.3.2" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 810 | dependencies = [ 811 | "foreign-types-shared", 812 | ] 813 | 814 | [[package]] 815 | name = "foreign-types-shared" 816 | version = "0.1.1" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 819 | 820 | [[package]] 821 | name = "form_urlencoded" 822 | version = "1.2.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" 825 | dependencies = [ 826 | "percent-encoding", 827 | ] 828 | 829 | [[package]] 830 | name = "futures-channel" 831 | version = "0.3.28" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" 834 | dependencies = [ 835 | "futures-core", 836 | ] 837 | 838 | [[package]] 839 | name = "futures-core" 840 | version = "0.3.28" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" 843 | 844 | [[package]] 845 | name = "futures-sink" 846 | version = "0.3.28" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" 849 | 850 | [[package]] 851 | name = "futures-task" 852 | version = "0.3.28" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" 855 | 856 | [[package]] 857 | name = "futures-util" 858 | version = "0.3.28" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" 861 | dependencies = [ 862 | "futures-core", 863 | "futures-task", 864 | "pin-project-lite", 865 | "pin-utils", 866 | ] 867 | 868 | [[package]] 869 | name = "generic-array" 870 | version = "0.14.7" 871 | source = "registry+https://github.com/rust-lang/crates.io-index" 872 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 873 | dependencies = [ 874 | "typenum", 875 | "version_check", 876 | ] 877 | 878 | [[package]] 879 | name = "gimli" 880 | version = "0.28.0" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" 883 | 884 | [[package]] 885 | name = "glob" 886 | version = "0.3.0" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" 889 | 890 | [[package]] 891 | name = "h2" 892 | version = "0.3.21" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" 895 | dependencies = [ 896 | "bytes", 897 | "fnv", 898 | "futures-core", 899 | "futures-sink", 900 | "futures-util", 901 | "http", 902 | "indexmap", 903 | "slab", 904 | "tokio", 905 | "tokio-util", 906 | "tracing", 907 | ] 908 | 909 | [[package]] 910 | name = "hashbrown" 911 | version = "0.12.3" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 914 | 915 | [[package]] 916 | name = "heck" 917 | version = "0.4.0" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 920 | 921 | [[package]] 922 | name = "hermit-abi" 923 | version = "0.1.19" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 926 | dependencies = [ 927 | "libc", 928 | ] 929 | 930 | [[package]] 931 | name = "hermit-abi" 932 | version = "0.3.2" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" 935 | 936 | [[package]] 937 | name = "hmac" 938 | version = "0.12.1" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 941 | dependencies = [ 942 | "digest", 943 | ] 944 | 945 | [[package]] 946 | name = "http" 947 | version = "0.2.9" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 950 | dependencies = [ 951 | "bytes", 952 | "fnv", 953 | "itoa", 954 | ] 955 | 956 | [[package]] 957 | name = "http-body" 958 | version = "0.4.5" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 961 | dependencies = [ 962 | "bytes", 963 | "http", 964 | "pin-project-lite", 965 | ] 966 | 967 | [[package]] 968 | name = "httparse" 969 | version = "1.8.0" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 972 | 973 | [[package]] 974 | name = "httpdate" 975 | version = "1.0.3" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 978 | 979 | [[package]] 980 | name = "humantime" 981 | version = "2.1.0" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 984 | 985 | [[package]] 986 | name = "hyper" 987 | version = "0.14.27" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" 990 | dependencies = [ 991 | "bytes", 992 | "futures-channel", 993 | "futures-core", 994 | "futures-util", 995 | "h2", 996 | "http", 997 | "http-body", 998 | "httparse", 999 | "httpdate", 1000 | "itoa", 1001 | "pin-project-lite", 1002 | "socket2 0.4.9", 1003 | "tokio", 1004 | "tower-service", 1005 | "tracing", 1006 | "want", 1007 | ] 1008 | 1009 | [[package]] 1010 | name = "hyper-tls" 1011 | version = "0.5.0" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1014 | dependencies = [ 1015 | "bytes", 1016 | "hyper", 1017 | "native-tls", 1018 | "tokio", 1019 | "tokio-native-tls", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "ident_case" 1024 | version = "1.0.1" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1027 | 1028 | [[package]] 1029 | name = "idna" 1030 | version = "0.4.0" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" 1033 | dependencies = [ 1034 | "unicode-bidi", 1035 | "unicode-normalization", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "indenter" 1040 | version = "0.3.3" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" 1043 | 1044 | [[package]] 1045 | name = "indexmap" 1046 | version = "1.9.3" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1049 | dependencies = [ 1050 | "autocfg", 1051 | "hashbrown", 1052 | "serde", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "indoc" 1057 | version = "1.0.9" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" 1060 | 1061 | [[package]] 1062 | name = "inout" 1063 | version = "0.1.3" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 1066 | dependencies = [ 1067 | "generic-array", 1068 | ] 1069 | 1070 | [[package]] 1071 | name = "ipnet" 1072 | version = "2.8.0" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" 1075 | 1076 | [[package]] 1077 | name = "is-terminal" 1078 | version = "0.4.9" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" 1081 | dependencies = [ 1082 | "hermit-abi 0.3.2", 1083 | "rustix", 1084 | "windows-sys", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "is_ci" 1089 | version = "1.1.1" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" 1092 | 1093 | [[package]] 1094 | name = "itertools" 1095 | version = "0.9.0" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" 1098 | dependencies = [ 1099 | "either", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "itertools" 1104 | version = "0.10.5" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1107 | dependencies = [ 1108 | "either", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "itoa" 1113 | version = "1.0.9" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 1116 | 1117 | [[package]] 1118 | name = "jobserver" 1119 | version = "0.1.26" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" 1122 | dependencies = [ 1123 | "libc", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "js-sys" 1128 | version = "0.3.64" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" 1131 | dependencies = [ 1132 | "wasm-bindgen", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "lazy_static" 1137 | version = "1.4.0" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1140 | 1141 | [[package]] 1142 | name = "lazycell" 1143 | version = "1.3.0" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 1146 | 1147 | [[package]] 1148 | name = "libc" 1149 | version = "0.2.147" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" 1152 | 1153 | [[package]] 1154 | name = "libloading" 1155 | version = "0.7.3" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" 1158 | dependencies = [ 1159 | "cfg-if", 1160 | "winapi", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "link-cplusplus" 1165 | version = "1.0.9" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "9d240c6f7e1ba3a28b0249f774e6a9dd0175054b52dfbb61b16eb8505c3785c9" 1168 | dependencies = [ 1169 | "cc", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "linux-raw-sys" 1174 | version = "0.4.5" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" 1177 | 1178 | [[package]] 1179 | name = "log" 1180 | version = "0.4.20" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 1183 | 1184 | [[package]] 1185 | name = "matchers" 1186 | version = "0.1.0" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1189 | dependencies = [ 1190 | "regex-automata", 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "memchr" 1195 | version = "2.6.3" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" 1198 | 1199 | [[package]] 1200 | name = "miette" 1201 | version = "5.10.0" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" 1204 | dependencies = [ 1205 | "backtrace", 1206 | "backtrace-ext", 1207 | "is-terminal", 1208 | "miette-derive", 1209 | "once_cell", 1210 | "owo-colors", 1211 | "supports-color", 1212 | "supports-hyperlinks", 1213 | "supports-unicode", 1214 | "terminal_size", 1215 | "textwrap", 1216 | "thiserror", 1217 | "unicode-width", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "miette-derive" 1222 | version = "5.10.0" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" 1225 | dependencies = [ 1226 | "proc-macro2", 1227 | "quote", 1228 | "syn 2.0.29", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "mime" 1233 | version = "0.3.17" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1236 | 1237 | [[package]] 1238 | name = "minimal-lexical" 1239 | version = "0.2.1" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1242 | 1243 | [[package]] 1244 | name = "miniz_oxide" 1245 | version = "0.7.1" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1248 | dependencies = [ 1249 | "adler", 1250 | ] 1251 | 1252 | [[package]] 1253 | name = "mio" 1254 | version = "0.8.8" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" 1257 | dependencies = [ 1258 | "libc", 1259 | "wasi", 1260 | "windows-sys", 1261 | ] 1262 | 1263 | [[package]] 1264 | name = "moveit" 1265 | version = "0.6.0" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "87d7335204cb6ef7bd647fa6db0be3e4d7aa25b5823a7aa030027ddf512cefba" 1268 | dependencies = [ 1269 | "cxx", 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "native-tls" 1274 | version = "0.2.11" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1277 | dependencies = [ 1278 | "lazy_static", 1279 | "libc", 1280 | "log", 1281 | "openssl", 1282 | "openssl-probe", 1283 | "openssl-sys", 1284 | "schannel", 1285 | "security-framework", 1286 | "security-framework-sys", 1287 | "tempfile", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "nom" 1292 | version = "7.1.1" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" 1295 | dependencies = [ 1296 | "memchr", 1297 | "minimal-lexical", 1298 | ] 1299 | 1300 | [[package]] 1301 | name = "nu-ansi-term" 1302 | version = "0.46.0" 1303 | source = "registry+https://github.com/rust-lang/crates.io-index" 1304 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1305 | dependencies = [ 1306 | "overload", 1307 | "winapi", 1308 | ] 1309 | 1310 | [[package]] 1311 | name = "num_cpus" 1312 | version = "1.16.0" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1315 | dependencies = [ 1316 | "hermit-abi 0.3.2", 1317 | "libc", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "object" 1322 | version = "0.32.1" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" 1325 | dependencies = [ 1326 | "memchr", 1327 | ] 1328 | 1329 | [[package]] 1330 | name = "once_cell" 1331 | version = "1.18.0" 1332 | source = "registry+https://github.com/rust-lang/crates.io-index" 1333 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 1334 | 1335 | [[package]] 1336 | name = "openssl" 1337 | version = "0.10.57" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" 1340 | dependencies = [ 1341 | "bitflags 2.4.0", 1342 | "cfg-if", 1343 | "foreign-types", 1344 | "libc", 1345 | "once_cell", 1346 | "openssl-macros", 1347 | "openssl-sys", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "openssl-macros" 1352 | version = "0.1.1" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1355 | dependencies = [ 1356 | "proc-macro2", 1357 | "quote", 1358 | "syn 2.0.29", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "openssl-probe" 1363 | version = "0.1.5" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1366 | 1367 | [[package]] 1368 | name = "openssl-sys" 1369 | version = "0.9.92" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "db7e971c2c2bba161b2d2fdf37080177eff520b3bc044787c7f1f5f9e78d869b" 1372 | dependencies = [ 1373 | "cc", 1374 | "libc", 1375 | "pkg-config", 1376 | "vcpkg", 1377 | ] 1378 | 1379 | [[package]] 1380 | name = "overload" 1381 | version = "0.1.1" 1382 | source = "registry+https://github.com/rust-lang/crates.io-index" 1383 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1384 | 1385 | [[package]] 1386 | name = "owo-colors" 1387 | version = "3.5.0" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" 1390 | 1391 | [[package]] 1392 | name = "password-hash" 1393 | version = "0.4.2" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" 1396 | dependencies = [ 1397 | "base64ct", 1398 | "rand_core", 1399 | "subtle", 1400 | ] 1401 | 1402 | [[package]] 1403 | name = "pbkdf2" 1404 | version = "0.11.0" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 1407 | dependencies = [ 1408 | "digest", 1409 | "hmac", 1410 | "password-hash", 1411 | "sha2", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "peeking_take_while" 1416 | version = "0.1.2" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" 1419 | 1420 | [[package]] 1421 | name = "percent-encoding" 1422 | version = "2.3.0" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" 1425 | 1426 | [[package]] 1427 | name = "pin-project-lite" 1428 | version = "0.2.13" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1431 | 1432 | [[package]] 1433 | name = "pin-utils" 1434 | version = "0.1.0" 1435 | source = "registry+https://github.com/rust-lang/crates.io-index" 1436 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1437 | 1438 | [[package]] 1439 | name = "pkg-config" 1440 | version = "0.3.27" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" 1443 | 1444 | [[package]] 1445 | name = "prettyplease" 1446 | version = "0.2.12" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" 1449 | dependencies = [ 1450 | "proc-macro2", 1451 | "syn 2.0.29", 1452 | ] 1453 | 1454 | [[package]] 1455 | name = "proc-macro-error" 1456 | version = "1.0.4" 1457 | source = "registry+https://github.com/rust-lang/crates.io-index" 1458 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1459 | dependencies = [ 1460 | "proc-macro-error-attr", 1461 | "proc-macro2", 1462 | "quote", 1463 | "syn 1.0.109", 1464 | "version_check", 1465 | ] 1466 | 1467 | [[package]] 1468 | name = "proc-macro-error-attr" 1469 | version = "1.0.4" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1472 | dependencies = [ 1473 | "proc-macro2", 1474 | "quote", 1475 | "version_check", 1476 | ] 1477 | 1478 | [[package]] 1479 | name = "proc-macro2" 1480 | version = "1.0.66" 1481 | source = "registry+https://github.com/rust-lang/crates.io-index" 1482 | checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" 1483 | dependencies = [ 1484 | "unicode-ident", 1485 | ] 1486 | 1487 | [[package]] 1488 | name = "quote" 1489 | version = "1.0.33" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 1492 | dependencies = [ 1493 | "proc-macro2", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "rand_core" 1498 | version = "0.6.4" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1501 | 1502 | [[package]] 1503 | name = "redox_syscall" 1504 | version = "0.3.5" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 1507 | dependencies = [ 1508 | "bitflags 1.3.2", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "regex" 1513 | version = "1.6.0" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 1516 | dependencies = [ 1517 | "aho-corasick", 1518 | "memchr", 1519 | "regex-syntax", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "regex-automata" 1524 | version = "0.1.10" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1527 | dependencies = [ 1528 | "regex-syntax", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "regex-syntax" 1533 | version = "0.6.27" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 1536 | 1537 | [[package]] 1538 | name = "reqwest" 1539 | version = "0.11.20" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" 1542 | dependencies = [ 1543 | "base64", 1544 | "bytes", 1545 | "encoding_rs", 1546 | "futures-core", 1547 | "futures-util", 1548 | "h2", 1549 | "http", 1550 | "http-body", 1551 | "hyper", 1552 | "hyper-tls", 1553 | "ipnet", 1554 | "js-sys", 1555 | "log", 1556 | "mime", 1557 | "native-tls", 1558 | "once_cell", 1559 | "percent-encoding", 1560 | "pin-project-lite", 1561 | "serde", 1562 | "serde_json", 1563 | "serde_urlencoded", 1564 | "tokio", 1565 | "tokio-native-tls", 1566 | "tower-service", 1567 | "url", 1568 | "wasm-bindgen", 1569 | "wasm-bindgen-futures", 1570 | "web-sys", 1571 | "winreg", 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "rustc-demangle" 1576 | version = "0.1.23" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1579 | 1580 | [[package]] 1581 | name = "rustc-hash" 1582 | version = "1.1.0" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1585 | 1586 | [[package]] 1587 | name = "rustix" 1588 | version = "0.38.11" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" 1591 | dependencies = [ 1592 | "bitflags 2.4.0", 1593 | "errno", 1594 | "libc", 1595 | "linux-raw-sys", 1596 | "windows-sys", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "rustversion" 1601 | version = "1.0.14" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" 1604 | 1605 | [[package]] 1606 | name = "ryu" 1607 | version = "1.0.15" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 1610 | 1611 | [[package]] 1612 | name = "schannel" 1613 | version = "0.1.22" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" 1616 | dependencies = [ 1617 | "windows-sys", 1618 | ] 1619 | 1620 | [[package]] 1621 | name = "scratch" 1622 | version = "1.0.7" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" 1625 | 1626 | [[package]] 1627 | name = "seahash" 1628 | version = "4.1.0" 1629 | source = "registry+https://github.com/rust-lang/crates.io-index" 1630 | checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" 1631 | 1632 | [[package]] 1633 | name = "security-framework" 1634 | version = "2.9.2" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" 1637 | dependencies = [ 1638 | "bitflags 1.3.2", 1639 | "core-foundation", 1640 | "core-foundation-sys", 1641 | "libc", 1642 | "security-framework-sys", 1643 | ] 1644 | 1645 | [[package]] 1646 | name = "security-framework-sys" 1647 | version = "2.9.1" 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" 1649 | checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" 1650 | dependencies = [ 1651 | "core-foundation-sys", 1652 | "libc", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "serde" 1657 | version = "1.0.188" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" 1660 | dependencies = [ 1661 | "serde_derive", 1662 | ] 1663 | 1664 | [[package]] 1665 | name = "serde_derive" 1666 | version = "1.0.188" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" 1669 | dependencies = [ 1670 | "proc-macro2", 1671 | "quote", 1672 | "syn 2.0.29", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "serde_json" 1677 | version = "1.0.105" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" 1680 | dependencies = [ 1681 | "itoa", 1682 | "ryu", 1683 | "serde", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "serde_urlencoded" 1688 | version = "0.7.1" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1691 | dependencies = [ 1692 | "form_urlencoded", 1693 | "itoa", 1694 | "ryu", 1695 | "serde", 1696 | ] 1697 | 1698 | [[package]] 1699 | name = "sha1" 1700 | version = "0.10.5" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 1703 | dependencies = [ 1704 | "cfg-if", 1705 | "cpufeatures", 1706 | "digest", 1707 | ] 1708 | 1709 | [[package]] 1710 | name = "sha2" 1711 | version = "0.10.7" 1712 | source = "registry+https://github.com/rust-lang/crates.io-index" 1713 | checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" 1714 | dependencies = [ 1715 | "cfg-if", 1716 | "cpufeatures", 1717 | "digest", 1718 | ] 1719 | 1720 | [[package]] 1721 | name = "sharded-slab" 1722 | version = "0.1.4" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 1725 | dependencies = [ 1726 | "lazy_static", 1727 | ] 1728 | 1729 | [[package]] 1730 | name = "shlex" 1731 | version = "1.1.0" 1732 | source = "registry+https://github.com/rust-lang/crates.io-index" 1733 | checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" 1734 | 1735 | [[package]] 1736 | name = "slab" 1737 | version = "0.4.9" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1740 | dependencies = [ 1741 | "autocfg", 1742 | ] 1743 | 1744 | [[package]] 1745 | name = "smallvec" 1746 | version = "1.11.0" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" 1749 | 1750 | [[package]] 1751 | name = "smawk" 1752 | version = "0.3.1" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" 1755 | 1756 | [[package]] 1757 | name = "socket2" 1758 | version = "0.4.9" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 1761 | dependencies = [ 1762 | "libc", 1763 | "winapi", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "socket2" 1768 | version = "0.5.3" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" 1771 | dependencies = [ 1772 | "libc", 1773 | "windows-sys", 1774 | ] 1775 | 1776 | [[package]] 1777 | name = "strsim" 1778 | version = "0.10.0" 1779 | source = "registry+https://github.com/rust-lang/crates.io-index" 1780 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1781 | 1782 | [[package]] 1783 | name = "strum_macros" 1784 | version = "0.24.3" 1785 | source = "registry+https://github.com/rust-lang/crates.io-index" 1786 | checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" 1787 | dependencies = [ 1788 | "heck", 1789 | "proc-macro2", 1790 | "quote", 1791 | "rustversion", 1792 | "syn 1.0.109", 1793 | ] 1794 | 1795 | [[package]] 1796 | name = "subtle" 1797 | version = "2.5.0" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 1800 | 1801 | [[package]] 1802 | name = "supports-color" 1803 | version = "2.0.0" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "4950e7174bffabe99455511c39707310e7e9b440364a2fcb1cc21521be57b354" 1806 | dependencies = [ 1807 | "is-terminal", 1808 | "is_ci", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "supports-hyperlinks" 1813 | version = "2.1.0" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "f84231692eb0d4d41e4cdd0cabfdd2e6cd9e255e65f80c9aa7c98dd502b4233d" 1816 | dependencies = [ 1817 | "is-terminal", 1818 | ] 1819 | 1820 | [[package]] 1821 | name = "supports-unicode" 1822 | version = "2.0.0" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "4b6c2cb240ab5dd21ed4906895ee23fe5a48acdbd15a3ce388e7b62a9b66baf7" 1825 | dependencies = [ 1826 | "is-terminal", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "syn" 1831 | version = "1.0.109" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1834 | dependencies = [ 1835 | "proc-macro2", 1836 | "quote", 1837 | "unicode-ident", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "syn" 1842 | version = "2.0.29" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" 1845 | dependencies = [ 1846 | "proc-macro2", 1847 | "quote", 1848 | "unicode-ident", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "tempfile" 1853 | version = "3.8.0" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" 1856 | dependencies = [ 1857 | "cfg-if", 1858 | "fastrand", 1859 | "redox_syscall", 1860 | "rustix", 1861 | "windows-sys", 1862 | ] 1863 | 1864 | [[package]] 1865 | name = "termcolor" 1866 | version = "1.2.0" 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" 1868 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 1869 | dependencies = [ 1870 | "winapi-util", 1871 | ] 1872 | 1873 | [[package]] 1874 | name = "terminal_size" 1875 | version = "0.1.17" 1876 | source = "registry+https://github.com/rust-lang/crates.io-index" 1877 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 1878 | dependencies = [ 1879 | "libc", 1880 | "winapi", 1881 | ] 1882 | 1883 | [[package]] 1884 | name = "textwrap" 1885 | version = "0.15.2" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" 1888 | dependencies = [ 1889 | "smawk", 1890 | "unicode-linebreak", 1891 | "unicode-width", 1892 | ] 1893 | 1894 | [[package]] 1895 | name = "thiserror" 1896 | version = "1.0.48" 1897 | source = "registry+https://github.com/rust-lang/crates.io-index" 1898 | checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" 1899 | dependencies = [ 1900 | "thiserror-impl", 1901 | ] 1902 | 1903 | [[package]] 1904 | name = "thiserror-impl" 1905 | version = "1.0.48" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" 1908 | dependencies = [ 1909 | "proc-macro2", 1910 | "quote", 1911 | "syn 2.0.29", 1912 | ] 1913 | 1914 | [[package]] 1915 | name = "thread_local" 1916 | version = "1.1.4" 1917 | source = "registry+https://github.com/rust-lang/crates.io-index" 1918 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 1919 | dependencies = [ 1920 | "once_cell", 1921 | ] 1922 | 1923 | [[package]] 1924 | name = "time" 1925 | version = "0.3.28" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" 1928 | dependencies = [ 1929 | "deranged", 1930 | "serde", 1931 | "time-core", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "time-core" 1936 | version = "0.1.1" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" 1939 | 1940 | [[package]] 1941 | name = "tinyvec" 1942 | version = "1.6.0" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1945 | dependencies = [ 1946 | "tinyvec_macros", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "tinyvec_macros" 1951 | version = "0.1.1" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1954 | 1955 | [[package]] 1956 | name = "tokio" 1957 | version = "1.32.0" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" 1960 | dependencies = [ 1961 | "backtrace", 1962 | "bytes", 1963 | "libc", 1964 | "mio", 1965 | "num_cpus", 1966 | "pin-project-lite", 1967 | "socket2 0.5.3", 1968 | "tokio-macros", 1969 | "windows-sys", 1970 | ] 1971 | 1972 | [[package]] 1973 | name = "tokio-macros" 1974 | version = "2.1.0" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" 1977 | dependencies = [ 1978 | "proc-macro2", 1979 | "quote", 1980 | "syn 2.0.29", 1981 | ] 1982 | 1983 | [[package]] 1984 | name = "tokio-native-tls" 1985 | version = "0.3.1" 1986 | source = "registry+https://github.com/rust-lang/crates.io-index" 1987 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1988 | dependencies = [ 1989 | "native-tls", 1990 | "tokio", 1991 | ] 1992 | 1993 | [[package]] 1994 | name = "tokio-util" 1995 | version = "0.7.8" 1996 | source = "registry+https://github.com/rust-lang/crates.io-index" 1997 | checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" 1998 | dependencies = [ 1999 | "bytes", 2000 | "futures-core", 2001 | "futures-sink", 2002 | "pin-project-lite", 2003 | "tokio", 2004 | "tracing", 2005 | ] 2006 | 2007 | [[package]] 2008 | name = "tower-service" 2009 | version = "0.3.2" 2010 | source = "registry+https://github.com/rust-lang/crates.io-index" 2011 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2012 | 2013 | [[package]] 2014 | name = "tracing" 2015 | version = "0.1.37" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 2018 | dependencies = [ 2019 | "cfg-if", 2020 | "pin-project-lite", 2021 | "tracing-attributes", 2022 | "tracing-core", 2023 | ] 2024 | 2025 | [[package]] 2026 | name = "tracing-attributes" 2027 | version = "0.1.26" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" 2030 | dependencies = [ 2031 | "proc-macro2", 2032 | "quote", 2033 | "syn 2.0.29", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "tracing-core" 2038 | version = "0.1.31" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" 2041 | dependencies = [ 2042 | "once_cell", 2043 | "valuable", 2044 | ] 2045 | 2046 | [[package]] 2047 | name = "tracing-error" 2048 | version = "0.2.0" 2049 | source = "registry+https://github.com/rust-lang/crates.io-index" 2050 | checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" 2051 | dependencies = [ 2052 | "tracing", 2053 | "tracing-subscriber", 2054 | ] 2055 | 2056 | [[package]] 2057 | name = "tracing-log" 2058 | version = "0.1.3" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 2061 | dependencies = [ 2062 | "lazy_static", 2063 | "log", 2064 | "tracing-core", 2065 | ] 2066 | 2067 | [[package]] 2068 | name = "tracing-subscriber" 2069 | version = "0.3.17" 2070 | source = "registry+https://github.com/rust-lang/crates.io-index" 2071 | checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" 2072 | dependencies = [ 2073 | "matchers", 2074 | "nu-ansi-term", 2075 | "once_cell", 2076 | "regex", 2077 | "sharded-slab", 2078 | "smallvec", 2079 | "thread_local", 2080 | "tracing", 2081 | "tracing-core", 2082 | "tracing-log", 2083 | ] 2084 | 2085 | [[package]] 2086 | name = "try-lock" 2087 | version = "0.2.4" 2088 | source = "registry+https://github.com/rust-lang/crates.io-index" 2089 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 2090 | 2091 | [[package]] 2092 | name = "typenum" 2093 | version = "1.16.0" 2094 | source = "registry+https://github.com/rust-lang/crates.io-index" 2095 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 2096 | 2097 | [[package]] 2098 | name = "unicode-bidi" 2099 | version = "0.3.13" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 2102 | 2103 | [[package]] 2104 | name = "unicode-ident" 2105 | version = "1.0.11" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" 2108 | 2109 | [[package]] 2110 | name = "unicode-linebreak" 2111 | version = "0.1.5" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 2114 | 2115 | [[package]] 2116 | name = "unicode-normalization" 2117 | version = "0.1.22" 2118 | source = "registry+https://github.com/rust-lang/crates.io-index" 2119 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2120 | dependencies = [ 2121 | "tinyvec", 2122 | ] 2123 | 2124 | [[package]] 2125 | name = "unicode-width" 2126 | version = "0.1.10" 2127 | source = "registry+https://github.com/rust-lang/crates.io-index" 2128 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 2129 | 2130 | [[package]] 2131 | name = "url" 2132 | version = "2.4.1" 2133 | source = "registry+https://github.com/rust-lang/crates.io-index" 2134 | checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" 2135 | dependencies = [ 2136 | "form_urlencoded", 2137 | "idna", 2138 | "percent-encoding", 2139 | ] 2140 | 2141 | [[package]] 2142 | name = "utf8parse" 2143 | version = "0.2.1" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 2146 | 2147 | [[package]] 2148 | name = "valuable" 2149 | version = "0.1.0" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2152 | 2153 | [[package]] 2154 | name = "vcpkg" 2155 | version = "0.2.15" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2158 | 2159 | [[package]] 2160 | name = "version_check" 2161 | version = "0.9.4" 2162 | source = "registry+https://github.com/rust-lang/crates.io-index" 2163 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2164 | 2165 | [[package]] 2166 | name = "want" 2167 | version = "0.3.1" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2170 | dependencies = [ 2171 | "try-lock", 2172 | ] 2173 | 2174 | [[package]] 2175 | name = "wasi" 2176 | version = "0.11.0+wasi-snapshot-preview1" 2177 | source = "registry+https://github.com/rust-lang/crates.io-index" 2178 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2179 | 2180 | [[package]] 2181 | name = "wasm-bindgen" 2182 | version = "0.2.87" 2183 | source = "registry+https://github.com/rust-lang/crates.io-index" 2184 | checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" 2185 | dependencies = [ 2186 | "cfg-if", 2187 | "wasm-bindgen-macro", 2188 | ] 2189 | 2190 | [[package]] 2191 | name = "wasm-bindgen-backend" 2192 | version = "0.2.87" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" 2195 | dependencies = [ 2196 | "bumpalo", 2197 | "log", 2198 | "once_cell", 2199 | "proc-macro2", 2200 | "quote", 2201 | "syn 2.0.29", 2202 | "wasm-bindgen-shared", 2203 | ] 2204 | 2205 | [[package]] 2206 | name = "wasm-bindgen-futures" 2207 | version = "0.4.37" 2208 | source = "registry+https://github.com/rust-lang/crates.io-index" 2209 | checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" 2210 | dependencies = [ 2211 | "cfg-if", 2212 | "js-sys", 2213 | "wasm-bindgen", 2214 | "web-sys", 2215 | ] 2216 | 2217 | [[package]] 2218 | name = "wasm-bindgen-macro" 2219 | version = "0.2.87" 2220 | source = "registry+https://github.com/rust-lang/crates.io-index" 2221 | checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" 2222 | dependencies = [ 2223 | "quote", 2224 | "wasm-bindgen-macro-support", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "wasm-bindgen-macro-support" 2229 | version = "0.2.87" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" 2232 | dependencies = [ 2233 | "proc-macro2", 2234 | "quote", 2235 | "syn 2.0.29", 2236 | "wasm-bindgen-backend", 2237 | "wasm-bindgen-shared", 2238 | ] 2239 | 2240 | [[package]] 2241 | name = "wasm-bindgen-shared" 2242 | version = "0.2.87" 2243 | source = "registry+https://github.com/rust-lang/crates.io-index" 2244 | checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" 2245 | 2246 | [[package]] 2247 | name = "web-sys" 2248 | version = "0.3.64" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" 2251 | dependencies = [ 2252 | "js-sys", 2253 | "wasm-bindgen", 2254 | ] 2255 | 2256 | [[package]] 2257 | name = "which" 2258 | version = "4.3.0" 2259 | source = "registry+https://github.com/rust-lang/crates.io-index" 2260 | checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" 2261 | dependencies = [ 2262 | "either", 2263 | "libc", 2264 | "once_cell", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "winapi" 2269 | version = "0.3.9" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2272 | dependencies = [ 2273 | "winapi-i686-pc-windows-gnu", 2274 | "winapi-x86_64-pc-windows-gnu", 2275 | ] 2276 | 2277 | [[package]] 2278 | name = "winapi-i686-pc-windows-gnu" 2279 | version = "0.4.0" 2280 | source = "registry+https://github.com/rust-lang/crates.io-index" 2281 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2282 | 2283 | [[package]] 2284 | name = "winapi-util" 2285 | version = "0.1.5" 2286 | source = "registry+https://github.com/rust-lang/crates.io-index" 2287 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2288 | dependencies = [ 2289 | "winapi", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "winapi-x86_64-pc-windows-gnu" 2294 | version = "0.4.0" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2297 | 2298 | [[package]] 2299 | name = "windows-sys" 2300 | version = "0.48.0" 2301 | source = "registry+https://github.com/rust-lang/crates.io-index" 2302 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2303 | dependencies = [ 2304 | "windows-targets", 2305 | ] 2306 | 2307 | [[package]] 2308 | name = "windows-targets" 2309 | version = "0.48.5" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2312 | dependencies = [ 2313 | "windows_aarch64_gnullvm", 2314 | "windows_aarch64_msvc", 2315 | "windows_i686_gnu", 2316 | "windows_i686_msvc", 2317 | "windows_x86_64_gnu", 2318 | "windows_x86_64_gnullvm", 2319 | "windows_x86_64_msvc", 2320 | ] 2321 | 2322 | [[package]] 2323 | name = "windows_aarch64_gnullvm" 2324 | version = "0.48.5" 2325 | source = "registry+https://github.com/rust-lang/crates.io-index" 2326 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2327 | 2328 | [[package]] 2329 | name = "windows_aarch64_msvc" 2330 | version = "0.48.5" 2331 | source = "registry+https://github.com/rust-lang/crates.io-index" 2332 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2333 | 2334 | [[package]] 2335 | name = "windows_i686_gnu" 2336 | version = "0.48.5" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2339 | 2340 | [[package]] 2341 | name = "windows_i686_msvc" 2342 | version = "0.48.5" 2343 | source = "registry+https://github.com/rust-lang/crates.io-index" 2344 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2345 | 2346 | [[package]] 2347 | name = "windows_x86_64_gnu" 2348 | version = "0.48.5" 2349 | source = "registry+https://github.com/rust-lang/crates.io-index" 2350 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2351 | 2352 | [[package]] 2353 | name = "windows_x86_64_gnullvm" 2354 | version = "0.48.5" 2355 | source = "registry+https://github.com/rust-lang/crates.io-index" 2356 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2357 | 2358 | [[package]] 2359 | name = "windows_x86_64_msvc" 2360 | version = "0.48.5" 2361 | source = "registry+https://github.com/rust-lang/crates.io-index" 2362 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2363 | 2364 | [[package]] 2365 | name = "winreg" 2366 | version = "0.50.0" 2367 | source = "registry+https://github.com/rust-lang/crates.io-index" 2368 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 2369 | dependencies = [ 2370 | "cfg-if", 2371 | "windows-sys", 2372 | ] 2373 | 2374 | [[package]] 2375 | name = "xtask" 2376 | version = "0.1.0" 2377 | dependencies = [ 2378 | "arfur-build", 2379 | "clap", 2380 | "color-eyre", 2381 | "tokio", 2382 | "tracing", 2383 | "tracing-subscriber", 2384 | ] 2385 | 2386 | [[package]] 2387 | name = "zip" 2388 | version = "0.6.6" 2389 | source = "registry+https://github.com/rust-lang/crates.io-index" 2390 | checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" 2391 | dependencies = [ 2392 | "aes", 2393 | "byteorder", 2394 | "bzip2", 2395 | "constant_time_eq", 2396 | "crc32fast", 2397 | "crossbeam-utils", 2398 | "flate2", 2399 | "hmac", 2400 | "pbkdf2", 2401 | "sha1", 2402 | "time", 2403 | "zstd", 2404 | ] 2405 | 2406 | [[package]] 2407 | name = "zip-extract" 2408 | version = "0.1.2" 2409 | source = "registry+https://github.com/rust-lang/crates.io-index" 2410 | checksum = "bb654964c003959ed64cbd0d7b329bcdcbd9690facd50c8617748d3622543972" 2411 | dependencies = [ 2412 | "log", 2413 | "thiserror", 2414 | "zip", 2415 | ] 2416 | 2417 | [[package]] 2418 | name = "zstd" 2419 | version = "0.11.2+zstd.1.5.2" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 2422 | dependencies = [ 2423 | "zstd-safe", 2424 | ] 2425 | 2426 | [[package]] 2427 | name = "zstd-safe" 2428 | version = "5.0.2+zstd.1.5.2" 2429 | source = "registry+https://github.com/rust-lang/crates.io-index" 2430 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 2431 | dependencies = [ 2432 | "libc", 2433 | "zstd-sys", 2434 | ] 2435 | 2436 | [[package]] 2437 | name = "zstd-sys" 2438 | version = "2.0.8+zstd.1.5.5" 2439 | source = "registry+https://github.com/rust-lang/crates.io-index" 2440 | checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" 2441 | dependencies = [ 2442 | "cc", 2443 | "libc", 2444 | "pkg-config", 2445 | ] 2446 | --------------------------------------------------------------------------------