├── .gitignore ├── Cargo.toml ├── LICENSE ├── .github └── workflows │ └── release.yaml ├── src ├── cli.rs ├── format.rs ├── constants.rs ├── main.rs └── lang.rs ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "wttrbar" 3 | version = "0.13.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | chrono = { version = "0.4.38", features = ["unstable-locales"] } 10 | clap = { version = "4.5.21", features = ["derive"] } 11 | reqwest = { version = "0.12.9", features = [ 12 | "blocking", 13 | "json", 14 | "rustls-tls-native-roots", 15 | ] } 16 | serde_json = "1.0.133" 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Yo'av Moshe 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 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | on: 2 | release: 3 | types: [created] 4 | workflow_dispatch: {} 5 | 6 | jobs: 7 | release: 8 | permissions: write-all 9 | name: release ${{ matrix.target }} 10 | runs-on: ubuntu-latest 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | target: [x86_64-unknown-linux-gnu] 15 | steps: 16 | - uses: actions/checkout@v4 17 | - name: Set up Rust toolchain 18 | uses: dtolnay/rust-toolchain@stable 19 | with: 20 | targets: ${{ matrix.target }} 21 | - name: Build (release) 22 | run: cargo build --release --target ${{ matrix.target }} 23 | - name: Package artifact 24 | run: | 25 | mkdir -p dist 26 | cp target/${{ matrix.target }}/release/wttrbar dist/wttrbar 27 | cp README.md dist/README.md 28 | cp LICENSE dist/LICENSE 29 | - name: Upload artifact (manual/test) 30 | if: ${{ github.event_name == 'workflow_dispatch' }} 31 | uses: actions/upload-artifact@v4 32 | with: 33 | name: wttrbar-${{ matrix.target }} 34 | path: dist/* 35 | - name: Attach to GitHub Release 36 | if: ${{ github.event_name == 'release' }} 37 | uses: softprops/action-gh-release@v2 38 | with: 39 | files: | 40 | dist/wttrbar 41 | dist/README.md 42 | dist/LICENSE 43 | -------------------------------------------------------------------------------- /src/cli.rs: -------------------------------------------------------------------------------- 1 | use crate::Lang; 2 | use clap::Parser; 3 | 4 | #[derive(Parser, Debug)] 5 | #[command(author = "Yo'av Moshe", 6 | version, 7 | about = "A simple but detailed weather indicator for Waybar using wttr.in", 8 | long_about = None) 9 | ] 10 | pub struct Args { 11 | #[arg( 12 | long, 13 | default_value = "temp_C", 14 | help = "decide which current_conditions key will be shown on waybar" 15 | )] 16 | pub main_indicator: String, 17 | 18 | #[arg( 19 | long, 20 | help = "optional expression that will be shown instead of main indicator. current_conditions keys surrounded by {} can be used. example:\n\ 21 | \"{ICON}{temp_C}({FeelsLikeC})\" will be transformed to \"text\":\"🌧️0(-4)\" in output" 22 | )] 23 | pub custom_indicator: Option, 24 | 25 | #[arg( 26 | long, 27 | default_value = "%Y-%m-%d", 28 | help = "formats the date next to the days. see https://docs.rs/chrono/latest/chrono/format/strftime/index.html" 29 | )] 30 | pub date_format: String, 31 | 32 | #[arg(long, help = "pass a specific location to wttr.in")] 33 | pub location: Option, 34 | 35 | #[arg( 36 | long, 37 | help = "shows the icon on the first line and temperature in a new line" 38 | )] 39 | pub vertical_view: bool, 40 | 41 | #[arg( 42 | long, 43 | help = "show a shorter description next to each hour, like 7° Mist instead of 7° Mist, Overcast 81%, Sunshine 17%, Frost 15%" 44 | )] 45 | pub hide_conditions: bool, 46 | 47 | #[arg(long, help = "display time in AM/PM format")] 48 | pub ampm: bool, 49 | 50 | #[arg(long, help = "use nerd font symbols instead of emojis")] 51 | pub nerd: bool, 52 | 53 | #[arg(long, help = "use fahrenheit instead of celsius")] 54 | pub fahrenheit: bool, 55 | 56 | #[arg(long, short, help = "use mph instead of km/h for wind speed")] 57 | pub mph: bool, 58 | 59 | #[arg(value_enum, short, long, help = "language to use")] 60 | pub lang: Option, 61 | 62 | #[arg(long, help = "show when the current weather conditions were measured")] 63 | pub observation_time: bool, 64 | } 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | wttrbar 3 |

4 | 5 |

6 | a simple but detailed weather indicator for Waybar using wttr.in. 7 |

8 |

9 | 10 |

11 |
12 | 13 | ## Installation 14 | 15 | Compile yourself using `cargo build --release`, or download the precompiled binary from the [releases](https://github.com/bjesus/wttrbar/releases) page. 16 | 17 | For Arch Linux, use the [AUR](https://aur.archlinux.org/packages/wttrbar) package. 18 | 19 | For NixOS, use the [NixPkg](https://search.nixos.org/packages?channel=24.05&show=wttrbar&from=0&size=50&sort=relevance&type=packages&query=wttrbar) package. 20 | 21 | ## Usage 22 | 23 | - `--ampm` - display time in AM/PM format 24 | - `--location STRING` - pass a specific location to wttr.in 25 | - `--main-indicator` - decide which [`current_conditions` key](https://wttr.in/?format=j1) will be shown on waybar. defaults to `temp_C` 26 | - `--date-format` - defaults to `%Y-%m-%d`, formats the date next to the days. see [reference](https://docs.rs/chrono/latest/chrono/format/strftime/index.html) 27 | - `--nerd` - use [nerd font](https://www.nerdfonts.com/) symbols instead of emojis 28 | - `--hide-conditions` - show a shorter descrpition next to each hour, like `7° Mist` instead of `7° Mist, Overcast 81%, Sunshine 17%, Frost 15%` 29 | - `--fahrenheit` - use fahrenheit instead of celsius 30 | - `--mph` - use mph instead of km/h for wind speed 31 | - `--custom-indicator STRING` - optional expression that will be shown instead of main indicator. [`current_conditions` and `nearest_area` keys](https://wttr.in/?format=j1) surrounded by {} can be used. For example, `"{ICON} {FeelsLikeC} ({areaName})"` will be transformed to `"text":"🌧️ -4 (Amsterdam)"` in the output 32 | - `--lang LANG` - set language (currently `en`, `de`, `pl`, `tr`, `fr`, `ru`, `zh`, `be`, `es`, `pt`, `it`, `ja`, `uk`, `sv`, `da`, `cs`, `sk`; submit a PR to add yours) 33 | - `--observation-time` - show the time the current weather conditions were measured 34 | 35 | e.g. `wttrbar --date-format "%m/%d" --location Paris --hide-conditions` 36 | 37 | ### Icons 38 | 39 | To display the weather icons correctly, you will need to have a font that supports emojis installed. The screenshot uses [Noto Emoji](https://github.com/googlefonts/noto-emoji), but you can use [other fonts](https://wiki.archlinux.org/title/fonts#Emoji_and_symbols) too. 40 | 41 | ## Waybar configuration 42 | 43 | Assuming `wttrbar` is in your path, it can be used like: 44 | 45 | ```json 46 | "custom/weather": { 47 | "format": "{}°", 48 | "tooltip": true, 49 | "interval": 3600, 50 | "exec": "wttrbar", 51 | "return-type": "json" 52 | }, 53 | ``` 54 | 55 | You can also then creating custom styling based on the current condition: 56 | 57 | ```css 58 | #custom-weather.sunny { 59 | background-color: yellow; 60 | } 61 | ``` 62 | 63 | ## Old version 64 | 65 | This code is based on my [old Python gist](https://gist.github.com/bjesus/f8db49e1434433f78e5200dc403d58a3) that was used for the same purpose. 66 | -------------------------------------------------------------------------------- /src/format.rs: -------------------------------------------------------------------------------- 1 | use chrono::prelude::*; 2 | use serde_json::Value; 3 | use std::collections::HashMap; 4 | 5 | use crate::lang::Lang; 6 | use crate::ICON_PLACEHOLDER; 7 | 8 | pub fn format_time(time: &str, ampm: bool) -> String { 9 | let hour = time.replace("00", "").parse::().unwrap(); 10 | 11 | if ampm { 12 | let am_or_pm = if hour >= 12 { "pm" } else { "am" }; 13 | let hour12 = if hour == 0 || hour == 12 { 14 | 12 15 | } else { 16 | hour % 12 17 | }; 18 | format!("{: <4}", format!("{}{}", hour12, am_or_pm)) 19 | } else { 20 | format!("{:02}", hour) 21 | } 22 | } 23 | 24 | pub fn format_temp(temp: &str) -> String { 25 | format!("{: >3}°", temp) 26 | } 27 | 28 | pub fn format_chances(hour: &serde_json::Value, lang: &Lang) -> String { 29 | let chances: HashMap<&str, String> = [ 30 | ("chanceoffog", lang.fog()), 31 | ("chanceoffrost", lang.frost()), 32 | ("chanceofovercast", lang.overcast()), 33 | ("chanceofrain", lang.rain()), 34 | ("chanceofsnow", lang.snow()), 35 | ("chanceofsunshine", lang.sunshine()), 36 | ("chanceofthunder", lang.thunder()), 37 | ("chanceofwindy", lang.wind()), 38 | ] 39 | .iter() 40 | .cloned() 41 | .collect(); 42 | 43 | let mut conditions = vec![]; 44 | for (event, name) in chances.iter() { 45 | if let Some(chance) = hour[event].as_str() { 46 | if let Ok(chance_value) = chance.parse::() { 47 | if chance_value > 0 { 48 | conditions.push((name, chance_value)); 49 | } 50 | } 51 | } 52 | } 53 | conditions.sort_by_key(|&(_, chance_value)| std::cmp::Reverse(chance_value)); 54 | conditions 55 | .iter() 56 | .map(|&(name, chance_value)| format!("{} {}%", name, chance_value)) 57 | .collect::>() 58 | .join(", ") 59 | } 60 | 61 | pub fn format_ampm_time(day: &serde_json::Value, key: &str, ampm: bool) -> String { 62 | if ampm { 63 | day["astronomy"][0][key].as_str().unwrap().to_string() 64 | } else { 65 | NaiveTime::parse_from_str(day["astronomy"][0][key].as_str().unwrap(), "%I:%M %p") 66 | .unwrap() 67 | .format("%H:%M") 68 | .to_string() 69 | } 70 | } 71 | pub fn format_indicator( 72 | weather_conditions: &Value, 73 | area: &Value, 74 | expression: String, 75 | weather_icon: &&str, 76 | ) -> String { 77 | if !weather_conditions.is_object() { 78 | return String::new(); 79 | } 80 | 81 | let (weather_map, area_map) = match (weather_conditions.as_object(), area.as_object()) { 82 | (Some(w), Some(a)) => (w, a), 83 | _ => return String::new(), 84 | }; 85 | let mut combined_map = weather_map.clone(); 86 | combined_map.extend(area_map.clone()); 87 | 88 | let mut formatted_indicator = expression.to_string(); 89 | combined_map 90 | .iter() 91 | .map(|condition| ("{".to_owned() + condition.0 + "}", condition.1)) 92 | .for_each(|condition| { 93 | if formatted_indicator.contains(condition.0.as_str()) { 94 | let condition_value = if condition.1.is_array() { 95 | condition.1.as_array().and_then(|vec| { 96 | vec[0] 97 | .as_object() 98 | .and_then(|value_map| value_map["value"].as_str()) 99 | }) 100 | } else { 101 | condition.1.as_str() 102 | } 103 | .unwrap_or(""); 104 | formatted_indicator = 105 | formatted_indicator.replace(condition.0.as_str(), condition_value) 106 | } 107 | }); 108 | if formatted_indicator.contains(ICON_PLACEHOLDER) { 109 | formatted_indicator = formatted_indicator.replace(ICON_PLACEHOLDER, weather_icon) 110 | } 111 | formatted_indicator 112 | } 113 | -------------------------------------------------------------------------------- /src/constants.rs: -------------------------------------------------------------------------------- 1 | pub const WEATHER_CODES: &[(i32, &str)] = &[ 2 | (113, "☀️"), // Sunny 3 | (116, "🌤️"), // Partly cloudly 4 | (119, "☁️"), // Cloudy 5 | (122, "🌥️"), // Very cloudy 6 | (143, "🌫️"), // Fog 7 | (176, "🌦️"), // Light showers 8 | (179, "🌧️"), // Light sleet showers 9 | (182, "🌧️"), // Light sleet 10 | (185, "🌧️"), // Light sleet 11 | (200, "🌩️"), // Thundery showers 12 | (227, "❄️"), // Light snow 13 | (230, "❄️"), // Heavy snow 14 | (248, "🌫️"), // Fog 15 | (260, "🌫️"), // Fog 16 | (263, "🌧️"), // Light showers 17 | (266, "🌧️"), // Light rain 18 | (281, "🌦️"), // Light sleet 19 | (284, "🌦️"), // Light sleet 20 | (293, "🌧️"), // Light rain 21 | (296, "🌧️"), // Light rain 22 | (299, "🌧️"), // Heavy showers 23 | (302, "🌧️"), // Heavy rain 24 | (305, "🌧️"), // Heavy showers 25 | (308, "🌧️"), // Heavy rain 26 | (311, "🌧️"), // Light sleet 27 | (314, "🌧️"), // Light sleet 28 | (317, "🌧️"), // Light sleet 29 | (320, "🌨️"), // Light snow 30 | (323, "🌨️"), // Light snow showers 31 | (326, "🌨️"), // Light snow showers 32 | (329, "🌨️"), // Heavy Snow 33 | (332, "🌨️"), // Heavy Snow 34 | (335, "🌨️"), // Heavy snow showers 35 | (338, "🌨️"), // Heavy snow 36 | (350, "🌨️"), // Light sleet 37 | (353, "🌧️"), // Light showers 38 | (356, "🌧️"), // Heavy showers 39 | (359, "🌧️"), // Heavy rain 40 | (362, "🌨️"), // Light sleet showers 41 | (365, "🌨️"), // Light sleet showers 42 | (368, "🌨️"), // Light snow showers 43 | (371, "🌨️"), // Heavy snow showers 44 | (374, "🌨️"), // Light sleet showers 45 | (377, "🌨️"), // Light sleet 46 | (386, "🌩️"), // Thundery showers 47 | (389, "🌨️"), // Thundery heavy rain 48 | (392, "🌨️"), // Thundery snow showers 49 | (395, "🌨️"), // Heavy snow showers 50 | (398, "🌨️"), // This is all the ones defined in the wttr.in source code, not sure what these are, but apparently some sort of rain. 51 | (401, "🌨️"), 52 | (404, "🌨️"), 53 | (407, "🌨️"), 54 | (410, "🌨️"), 55 | (413, "🌨️"), 56 | (416, "🌨️"), 57 | (419, "🌨️"), 58 | (422, "🌨️"), 59 | (425, "🌨️"), 60 | (428, "🌨️"), 61 | (431, "🌨️"), 62 | ]; 63 | 64 | pub const WEATHER_CODES_NERD: &[(i32, &str)] = &[ 65 | (113, "󰖙"), // Sunny 66 | (116, "󰖕"), // Partly cloudly 67 | (119, "󰼰"), // Cloudy 68 | (122, "󰖐"), // Very cloudy 69 | (143, "󰖑"), // Fog 70 | (176, "󰖗"), // Light showers 71 | (179, "󰙿"), // Light sleet showers 72 | (182, "󰙿"), // Light sleet 73 | (185, "󰙿"), // Light sleet 74 | (200, "󰙾"), // Thundery showers 75 | (227, "󰖘"), // Light snow 76 | (230, "󰼶"), // Heavy snow 77 | (248, "󰖑"), // Fog 78 | (260, "󰖑"), // Fog 79 | (263, "󰖗"), // Light showers 80 | (266, "󰖗"), // Light rain 81 | (281, "󰙿"), // Light sleet 82 | (284, "󰙿"), // Light sleet 83 | (293, "󰖗"), // Light rain 84 | (296, "󰖗"), // Light rain 85 | (299, "󰖖"), // Heavy showers 86 | (302, "󰖖"), // Heavy rain 87 | (305, "󰖖"), // Heavy showers 88 | (308, "󰖖"), // Heavy rain 89 | (311, "󰙿"), // Light sleet 90 | (314, "󰙿"), // Light sleet 91 | (317, "󰙿"), // Light sleet 92 | (320, "󰖘"), // Light snow 93 | (323, "󰖘"), // Light snow showers 94 | (326, "󰖘"), // Light snow showers 95 | (329, "󰼶"), // Heavy Snow 96 | (332, "󰼶"), // Heavy Snow 97 | (335, "󰼶"), // Heavy snow showers 98 | (338, "󰼶"), // Heavy snow 99 | (350, "󰙿"), // Light sleet 100 | (353, "󰖗"), // Light showers 101 | (356, "󰖖"), // Heavy showers 102 | (359, "󰖖"), // Heavy rain 103 | (362, "󰙿"), // Light sleet showers 104 | (365, "󰙿"), // Light sleet showers 105 | (368, "󰖘"), // Light snow showers 106 | (371, "󰼶"), // Heavy snow showers 107 | (374, "󰙿"), // Light sleet showers 108 | (377, "󰙿"), // Light sleet 109 | (386, "󰙾"), // Thundery showers 110 | (389, "󰙾"), // Thundery heavy rain 111 | (392, "󰙾"), // Thundery snow showers 112 | (395, "󰼶"), // Heavy snow showers 113 | (398, "󰖗"), // This is all the ones defined in the wttr.in source code, not sure what these are, but apparently some sort of rain. 114 | (401, "󰖗"), 115 | (404, "󰖗"), 116 | (407, "󰖗"), 117 | (410, "󰖗"), 118 | (413, "󰖗"), 119 | (416, "󰖗"), 120 | (419, "󰖗"), 121 | (422, "󰖗"), 122 | (425, "󰖗"), 123 | (428, "󰖗"), 124 | (431, "󰖗"), 125 | ]; 126 | 127 | 128 | pub const ICON_PLACEHOLDER: &str = "{ICON}"; 129 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use core::time; 2 | use std::collections::HashMap; 3 | use std::fs::{metadata, read_to_string, File}; 4 | use std::io::Write; 5 | use std::process::exit; 6 | use std::thread; 7 | use std::time::{Duration, SystemTime}; 8 | 9 | use chrono::{Locale, NaiveDate, NaiveTime, Local, Timelike}; 10 | use clap::Parser; 11 | use reqwest::blocking::Client; 12 | use serde_json::{json, Value}; 13 | 14 | use crate::cli::Args; 15 | use crate::constants::{ICON_PLACEHOLDER, WEATHER_CODES, WEATHER_CODES_NERD}; 16 | use crate::format::{format_ampm_time, format_chances, format_indicator, format_temp, format_time}; 17 | use crate::lang::Lang; 18 | 19 | mod cli; 20 | mod constants; 21 | mod format; 22 | mod lang; 23 | 24 | fn main() { 25 | let args = Args::parse(); 26 | let lang = if let Some(lang) = args.lang { 27 | lang 28 | } else { 29 | Lang::EN 30 | }; 31 | 32 | let mut data = HashMap::new(); 33 | 34 | let location = args.location.unwrap_or(String::new()); 35 | let weather_url = format!( 36 | "https://{}/{}?format=j1", 37 | lang.wttr_in_subdomain(), 38 | location 39 | ); 40 | let cachefile = format!( 41 | "/tmp/wttrbar-{}-{}.json", 42 | location, 43 | lang.wttr_in_subdomain() 44 | ); 45 | 46 | let mut iterations = 0; 47 | let threshold = 20; 48 | 49 | let is_cache_file_recent = if let Ok(metadata) = metadata(&cachefile) { 50 | let ten_minutes_ago = SystemTime::now() - Duration::from_secs(600); 51 | metadata 52 | .modified() 53 | .map_or(false, |mod_time| mod_time > ten_minutes_ago) 54 | } else { 55 | false 56 | }; 57 | 58 | let client = Client::new(); 59 | let weather = if is_cache_file_recent { 60 | let json_str = read_to_string(&cachefile).unwrap(); 61 | serde_json::from_str::(&json_str).unwrap() 62 | } else { 63 | loop { 64 | match client.get(&weather_url).send() { 65 | Ok(response) => match response.json::() { 66 | Ok(json) => break json, 67 | Err(_) => { 68 | println!("{{\"text\":\"⛓️‍💥\", \"tooltip\":\"invalid wttr.in response\"}}"); 69 | exit(0) 70 | } 71 | }, 72 | Err(_) => { 73 | iterations += 1; 74 | thread::sleep(time::Duration::from_millis(500 * iterations)); 75 | 76 | if iterations == threshold { 77 | println!("{{\"text\":\"⛓️‍💥\", \"tooltip\":\"cannot access wttr.in\"}}"); 78 | exit(0) 79 | } 80 | } 81 | } 82 | } 83 | }; 84 | 85 | if !is_cache_file_recent { 86 | let mut file = File::create(&cachefile) 87 | .expect(format!("Unable to create cache file at {}", cachefile).as_str()); 88 | 89 | file.write_all(serde_json::to_string_pretty(&weather).unwrap().as_bytes()) 90 | .expect(format!("Unable to write cache file at {}", cachefile).as_str()); 91 | } 92 | let current_condition = &weather["current_condition"][0]; 93 | let nearest_area = &weather["nearest_area"][0]; 94 | let feels_like = if args.fahrenheit { 95 | current_condition["FeelsLikeF"].as_str().unwrap() 96 | } else { 97 | current_condition["FeelsLikeC"].as_str().unwrap() 98 | }; 99 | let weather_code = current_condition["weatherCode"].as_str().unwrap(); 100 | 101 | let weather_icon = { 102 | if args.nerd { 103 | WEATHER_CODES_NERD 104 | } else { 105 | WEATHER_CODES 106 | } 107 | } 108 | .iter() 109 | .find(|(code, _)| *code == weather_code.parse::().unwrap()) 110 | .map(|(_, symbol)| symbol) 111 | .unwrap(); 112 | 113 | let text = match args.custom_indicator { 114 | None => { 115 | let main_indicator_code = if args.fahrenheit && args.main_indicator == "temp_C" { 116 | "temp_F" 117 | } else { 118 | args.main_indicator.as_str() 119 | }; 120 | let indicator = current_condition[main_indicator_code].as_str().unwrap(); 121 | if args.vertical_view { 122 | format!("{}\n{}", weather_icon, indicator) 123 | } else { 124 | format!("{} {}", weather_icon, indicator) 125 | } 126 | } 127 | Some(expression) => { 128 | format_indicator(current_condition, nearest_area, expression, weather_icon) 129 | } 130 | }; 131 | data.insert("text", text); 132 | 133 | let mut tooltip = format!( 134 | "{} {}°\n", 135 | current_condition[lang.weather_desc()][0]["value"] 136 | .as_str() 137 | .unwrap(), 138 | if args.fahrenheit { 139 | current_condition["temp_F"].as_str().unwrap() 140 | } else { 141 | current_condition["temp_C"].as_str().unwrap() 142 | }, 143 | ); 144 | tooltip += &format!("{}: {}°\n", lang.feels_like(), feels_like); 145 | if args.mph { 146 | tooltip += &format!( 147 | "{}: {} mph\n", 148 | lang.wind(), 149 | current_condition["windspeedMiles"].as_str().unwrap() 150 | ); 151 | } else { 152 | tooltip += &format!( 153 | "{}: {} km/h\n", 154 | lang.wind(), 155 | current_condition["windspeedKmph"].as_str().unwrap() 156 | ); 157 | } 158 | tooltip += &format!( 159 | "{}: {}%\n", 160 | lang.humidity(), 161 | current_condition["humidity"].as_str().unwrap() 162 | ); 163 | let nearest_area = &weather["nearest_area"][0]; 164 | tooltip += &format!( 165 | "{}: {}, {}, {}\n", 166 | lang.location(), 167 | nearest_area["areaName"][0]["value"].as_str().unwrap(), 168 | nearest_area["region"][0]["value"].as_str().unwrap(), 169 | nearest_area["country"][0]["value"].as_str().unwrap() 170 | ); 171 | 172 | if args.observation_time { 173 | if let Some(obs_time) = current_condition["observation_time"].as_str() { 174 | if let Ok(time) = NaiveTime::parse_from_str(obs_time, "%I:%M %p") { 175 | let formatted_time = if args.ampm { 176 | obs_time.to_string() 177 | } else { 178 | time.format("%H:%M").to_string() 179 | }; 180 | tooltip += &format!("{}: {}\n", lang.observation_time(), formatted_time); 181 | } 182 | } 183 | } 184 | 185 | let now = Local::now(); 186 | 187 | let today = Local::now().date_naive(); 188 | let mut forecast = weather["weather"].as_array().unwrap().clone(); 189 | forecast.retain(|item| { 190 | let item_date = 191 | NaiveDate::parse_from_str(item["date"].as_str().unwrap(), "%Y-%m-%d").unwrap(); 192 | item_date >= today 193 | }); 194 | 195 | for (i, day) in forecast.iter().enumerate() { 196 | tooltip += "\n"; 197 | if i == 0 { 198 | tooltip += &format!("{}, ", lang.today()); 199 | } 200 | if i == 1 { 201 | tooltip += &format!("{}, ", lang.tomorrow()); 202 | } 203 | let date = NaiveDate::parse_from_str(day["date"].as_str().unwrap(), "%Y-%m-%d").unwrap(); 204 | let locale = Locale::try_from(lang.locale_str().as_str()).unwrap_or(Locale::en_US); 205 | tooltip += &format!("{}\n", date.format_localized(args.date_format.as_str(), locale)); 206 | 207 | let (max_temp, min_temp) = if args.fahrenheit { 208 | ( 209 | day["maxtempF"].as_str().unwrap(), 210 | day["mintempF"].as_str().unwrap(), 211 | ) 212 | } else { 213 | ( 214 | day["maxtempC"].as_str().unwrap(), 215 | day["mintempC"].as_str().unwrap(), 216 | ) 217 | }; 218 | 219 | tooltip += &format!( 220 | "{} {}° {} {}° ", 221 | if args.nerd { "󰳡" } else { "⬆️" }, 222 | max_temp, 223 | if args.nerd { "󰳛" } else { "⬇️" }, 224 | min_temp 225 | ); 226 | 227 | tooltip += &format!( 228 | "{} {} {} {}\n", 229 | if args.nerd { "󰖜" } else { "🌅" }, 230 | format_ampm_time(day, "sunrise", args.ampm), 231 | if args.nerd { "󰖛" } else { "🌇" }, 232 | format_ampm_time(day, "sunset", args.ampm) 233 | ); 234 | 235 | for hour in day["hourly"].as_array().unwrap() { 236 | let hour_time = hour["time"].as_str().unwrap(); 237 | let formatted_hour_time = if hour_time.len() >= 2 { 238 | hour_time[..hour_time.len() - 2].to_string() 239 | } else { 240 | hour_time.to_string() 241 | }; 242 | if i == 0 243 | && now.hour() >= 2 244 | && formatted_hour_time.parse::().unwrap() < now.hour() - 2 245 | { 246 | continue; 247 | } 248 | 249 | let mut tooltip_line = format!( 250 | "{} {} {} {}", 251 | format_time(hour["time"].as_str().unwrap(), args.ampm), 252 | if args.nerd { 253 | WEATHER_CODES_NERD 254 | } else { 255 | WEATHER_CODES 256 | } 257 | .iter() 258 | .find(|(code, _)| *code 259 | == hour["weatherCode"] 260 | .as_str() 261 | .unwrap() 262 | .parse::() 263 | .unwrap()) 264 | .map(|(_, symbol)| symbol) 265 | .unwrap(), 266 | if args.fahrenheit { 267 | format_temp(hour["FeelsLikeF"].as_str().unwrap()) 268 | } else { 269 | format_temp(hour["FeelsLikeC"].as_str().unwrap()) 270 | }, 271 | hour[lang.weather_desc()][0]["value"].as_str().unwrap(), 272 | ); 273 | if !args.hide_conditions { 274 | tooltip_line += format!(", {}", format_chances(hour, &lang)).as_str(); 275 | } 276 | tooltip_line += "\n"; 277 | tooltip += &tooltip_line; 278 | } 279 | } 280 | data.insert("tooltip", tooltip); 281 | 282 | let css_class = current_condition[lang.weather_desc()][0]["value"] 283 | .as_str() 284 | .unwrap() 285 | .to_lowercase() 286 | .split(',') 287 | .next() 288 | .map(|s| s.trim().replace(' ', "_")) 289 | .unwrap_or_default(); 290 | data.insert("class", css_class); 291 | 292 | let json_data = json!(data); 293 | println!("{}", json_data); 294 | } 295 | -------------------------------------------------------------------------------- /src/lang.rs: -------------------------------------------------------------------------------- 1 | use clap::ValueEnum; 2 | 3 | #[derive(Debug, Clone, ValueEnum)] 4 | pub enum Lang { 5 | EN, 6 | DE, 7 | PL, 8 | RU, 9 | TR, 10 | FR, 11 | BE, 12 | ZH, 13 | ES, 14 | PT, 15 | IT, 16 | JA, 17 | UK, 18 | SV, 19 | DA, 20 | CS, 21 | SK, 22 | } 23 | 24 | impl Lang { 25 | pub fn wttr_in_subdomain(&self) -> String { 26 | match &self { 27 | Self::EN => "wttr.in".to_string(), 28 | Self::DE => "de.wttr.in".to_string(), 29 | Self::PL => "pl.wttr.in".to_string(), 30 | Self::RU => "ru.wttr.in".to_string(), 31 | Self::TR => "tr.wttr.in".to_string(), 32 | Self::FR => "fr.wttr.in".to_string(), 33 | Self::BE => "be.wttr.in".to_string(), 34 | Self::ZH => "zh.wttr.in".to_string(), 35 | Self::ES => "es.wttr.in".to_string(), 36 | Self::PT => "pt.wttr.in".to_string(), 37 | Self::IT => "it.wttr.in".to_string(), 38 | Self::JA => "ja.wttr.in".to_string(), 39 | Self::UK => "uk.wttr.in".to_string(), 40 | Self::SV => "sv.wttr.in".to_string(), 41 | Self::DA => "da.wttr.in".to_string(), 42 | Self::CS => "cs.wttr.in".to_string(), 43 | Self::SK => "sk.wttr.in".to_string(), 44 | } 45 | } 46 | pub fn observation_time(&self) -> String { 47 | match &self { 48 | Self::EN => "Observed at".to_string(), 49 | Self::DE => "Beobachtet um".to_string(), 50 | Self::PL => "Zaobserwowano o".to_string(), 51 | Self::RU => "Наблюдается в".to_string(), 52 | Self::TR => "Gözlemlendi".to_string(), 53 | Self::FR => "Observé à".to_string(), 54 | Self::BE => "Назірана ў".to_string(), 55 | Self::ZH => "观察时间".to_string(), 56 | Self::ES => "Observado en".to_string(), 57 | Self::PT => "Observado em".to_string(), 58 | Self::IT => "Osservato a".to_string(), 59 | Self::JA => "で観察されました".to_string(), 60 | Self::UK => "Спостерігається в".to_string(), 61 | Self::SV => "Observerat vid".to_string(), 62 | Self::DA => "Observeret kl".to_string(), 63 | Self::CS => "Změřeno v".to_string(), 64 | Self::SK => "Zmerané v".to_string(), 65 | } 66 | } 67 | pub fn feels_like(&self) -> String { 68 | match &self { 69 | Self::EN => "Feels Like".to_string(), 70 | Self::DE => "Gefühlt wie".to_string(), 71 | Self::PL => "Temperatura odczuwalna".to_string(), 72 | Self::RU => "Ощущается как".to_string(), 73 | Self::TR => "Hissedilen".to_string(), 74 | Self::FR => "Ressenti".to_string(), 75 | Self::BE => "Адчуваецца як".to_string(), 76 | Self::ZH => "体感温度".to_string(), 77 | Self::ES => "Sensación térmica".to_string(), 78 | Self::PT => "Sensação térmica".to_string(), 79 | Self::IT => "Sensazione Termica".to_string(), 80 | Self::JA => "体感温度".to_string(), 81 | Self::UK => "Відчувається як".to_string(), 82 | Self::SV => "Känns som".to_string(), 83 | Self::DA => "Føles som".to_string(), 84 | Self::CS => "Pocitově".to_string(), 85 | Self::SK => "Pocitovo".to_string(), 86 | } 87 | } 88 | pub fn humidity(&self) -> String { 89 | match &self { 90 | Self::EN => "Humidity".to_string(), 91 | Self::DE => "Luftfeuchtigkeit".to_string(), 92 | Self::PL => "Wilgotność".to_string(), 93 | Self::RU => "Влажность".to_string(), 94 | Self::TR => "Nem".to_string(), 95 | Self::FR => "Humidité".to_string(), 96 | Self::BE => "Вільготнасць".to_string(), 97 | Self::ZH => "湿度".to_string(), 98 | Self::ES => "Humedad".to_string(), 99 | Self::PT => "Umidade".to_string(), 100 | Self::IT => "Umidità".to_string(), 101 | Self::JA => "湿度".to_string(), 102 | Self::UK => "Вогкість".to_string(), 103 | Self::SV => "Luftfuktighet".to_string(), 104 | Self::DA => "Luftfugtighed".to_string(), 105 | Self::CS => "Vlhkost".to_string(), 106 | Self::SK => "Vlhkosť".to_string(), 107 | } 108 | } 109 | pub fn location(&self) -> String { 110 | match &self { 111 | Self::EN => "Location".to_string(), 112 | Self::DE => "Standort".to_string(), 113 | Self::PL => "Lokalizacja".to_string(), 114 | Self::RU => "Местоположение".to_string(), 115 | Self::TR => "Konum".to_string(), 116 | Self::FR => "Lieu".to_string(), 117 | Self::BE => "Месцазнаходжанне".to_string(), 118 | Self::ZH => "地区".to_string(), 119 | Self::ES => "Ubicación".to_string(), 120 | Self::PT => "Localização".to_string(), 121 | Self::IT => "Posizione".to_string(), 122 | Self::JA => "地点".to_string(), 123 | Self::UK => "Розташування".to_string(), 124 | Self::SV => "Plats".to_string(), 125 | Self::DA => "Placering".to_string(), 126 | Self::CS => "Lokalita".to_string(), 127 | Self::SK => "Lokalita".to_string(), 128 | } 129 | } 130 | pub fn today(&self) -> String { 131 | match &self { 132 | Self::EN => "Today".to_string(), 133 | Self::DE => "Heute".to_string(), 134 | Self::PL => "Dzisiaj".to_string(), 135 | Self::RU => "Сегодня".to_string(), 136 | Self::TR => "Bugün".to_string(), 137 | Self::FR => "Aujourd'hui".to_string(), 138 | Self::BE => "Сёння".to_string(), 139 | Self::ZH => "今日天气".to_string(), 140 | Self::ES => "Hoy".to_string(), 141 | Self::PT => "Hoje".to_string(), 142 | Self::IT => "Oggi".to_string(), 143 | Self::JA => "今日".to_string(), 144 | Self::UK => "Сьогодні".to_string(), 145 | Self::SV => "Idag".to_string(), 146 | Self::DA => "I dag".to_string(), 147 | Self::CS => "Dnes".to_string(), 148 | Self::SK => "Dnes".to_string(), 149 | } 150 | } 151 | pub fn tomorrow(&self) -> String { 152 | match &self { 153 | Self::EN => "Tomorrow".to_string(), 154 | Self::DE => "Morgen".to_string(), 155 | Self::PL => "Jutro".to_string(), 156 | Self::RU => "Завтра".to_string(), 157 | Self::TR => "Yarın".to_string(), 158 | Self::FR => "Demain".to_string(), 159 | Self::BE => "Заўтра".to_string(), 160 | Self::ZH => "明日天气".to_string(), 161 | Self::ES => "Mañana".to_string(), 162 | Self::PT => "Amanhã".to_string(), 163 | Self::IT => "Domani".to_string(), 164 | Self::JA => "明日".to_string(), 165 | Self::UK => "Завтра".to_string(), 166 | Self::SV => "Imorgon".to_string(), 167 | Self::DA => "I morgen".to_string(), 168 | Self::CS => "Zítra".to_string(), 169 | Self::SK => "Zajtra".to_string(), 170 | } 171 | } 172 | pub fn fog(&self) -> String { 173 | match &self { 174 | Self::EN => "Fog".to_string(), 175 | Self::DE => "Nebel".to_string(), 176 | Self::PL => "Mgła".to_string(), 177 | Self::RU => "Туман".to_string(), 178 | Self::TR => "Sis".to_string(), 179 | Self::FR => "Brouillard".to_string(), 180 | Self::BE => "Туман".to_string(), 181 | Self::ZH => "雾".to_string(), 182 | Self::ES => "Niebla".to_string(), 183 | Self::PT => "Nevoeiro".to_string(), 184 | Self::IT => "Nebbia".to_string(), 185 | Self::JA => "霧".to_string(), 186 | Self::UK => "Туман".to_string(), 187 | Self::SV => "Dimma".to_string(), 188 | Self::DA => "Tåge".to_string(), 189 | Self::CS => "Mlha".to_string(), 190 | Self::SK => "Hmla".to_string(), 191 | } 192 | } 193 | pub fn frost(&self) -> String { 194 | match &self { 195 | Self::EN => "Frost".to_string(), 196 | Self::DE => "Frost".to_string(), 197 | Self::PL => "Mróz".to_string(), 198 | Self::RU => "Мороз".to_string(), 199 | Self::TR => "Don".to_string(), 200 | Self::FR => "Gel".to_string(), 201 | Self::BE => "Мароз".to_string(), 202 | Self::ZH => "霜".to_string(), 203 | Self::ES => "Escarcha".to_string(), 204 | Self::PT => "Geada".to_string(), 205 | Self::IT => "Gelo".to_string(), 206 | Self::JA => "霜".to_string(), 207 | Self::UK => "Мороз".to_string(), 208 | Self::SV => "Frost".to_string(), 209 | Self::DA => "Frost".to_string(), 210 | Self::CS => "Mráz".to_string(), 211 | Self::SK => "Mráz".to_string(), 212 | } 213 | } 214 | pub fn overcast(&self) -> String { 215 | match &self { 216 | Self::EN => "Overcast".to_string(), 217 | Self::DE => "Bewölkung".to_string(), 218 | Self::PL => "Zachmurzenie".to_string(), 219 | Self::RU => "Пасмурно".to_string(), 220 | Self::TR => "Bulutlu".to_string(), 221 | Self::FR => "Couvert".to_string(), 222 | Self::BE => "Хмурна".to_string(), 223 | Self::ZH => "多云".to_string(), 224 | Self::ES => "Nublado".to_string(), 225 | Self::PT => "Nublado".to_string(), 226 | Self::IT => "Nuvoloso".to_string(), 227 | Self::JA => "曇り".to_string(), 228 | Self::UK => "Похмуро".to_string(), 229 | Self::SV => "Mulet".to_string(), 230 | Self::DA => "Overskyet".to_string(), 231 | Self::CS => "Zataženo".to_string(), 232 | Self::SK => "Zamračené".to_string(), 233 | } 234 | } 235 | pub fn rain(&self) -> String { 236 | match &self { 237 | Self::EN => "Rain".to_string(), 238 | Self::DE => "Regen".to_string(), 239 | Self::PL => "Deszcz".to_string(), 240 | Self::RU => "Дождь".to_string(), 241 | Self::TR => "Yağmur".to_string(), 242 | Self::FR => "Pluie".to_string(), 243 | Self::BE => "Дождж".to_string(), 244 | Self::ZH => "雨".to_string(), 245 | Self::ES => "Lluvia".to_string(), 246 | Self::PT => "Chuva".to_string(), 247 | Self::IT => "Pioggia".to_string(), 248 | Self::JA => "雨".to_string(), 249 | Self::UK => "Дощ".to_string(), 250 | Self::SV => "Regn".to_string(), 251 | Self::DA => "Regn".to_string(), 252 | Self::CS => "Déšť".to_string(), 253 | Self::SK => "Dážď".to_string(), 254 | } 255 | } 256 | pub fn snow(&self) -> String { 257 | match &self { 258 | Self::EN => "Snow".to_string(), 259 | Self::DE => "Schnee".to_string(), 260 | Self::PL => "Śnieg".to_string(), 261 | Self::RU => "Снег".to_string(), 262 | Self::TR => "Kar".to_string(), 263 | Self::FR => "Neige".to_string(), 264 | Self::BE => "Снег".to_string(), 265 | Self::ZH => "雪".to_string(), 266 | Self::ES => "Nieve".to_string(), 267 | Self::PT => "Neve".to_string(), 268 | Self::IT => "Neve".to_string(), 269 | Self::JA => "雪".to_string(), 270 | Self::UK => "Сніг".to_string(), 271 | Self::SV => "Snö".to_string(), 272 | Self::DA => "Sne".to_string(), 273 | Self::CS => "Sníh".to_string(), 274 | Self::SK => "Sneh".to_string(), 275 | } 276 | } 277 | pub fn sunshine(&self) -> String { 278 | match &self { 279 | Self::EN => "Sunshine".to_string(), 280 | Self::DE => "Sonnenschein".to_string(), 281 | Self::PL => "Nasłonecznienie".to_string(), 282 | Self::RU => "Солнечно".to_string(), 283 | Self::TR => "Güneş ışığı".to_string(), 284 | Self::FR => "Ensoleillé".to_string(), 285 | Self::BE => "Сонечна".to_string(), 286 | Self::ZH => "晴".to_string(), 287 | Self::ES => "Soleado".to_string(), 288 | Self::PT => "Sol".to_string(), 289 | Self::IT => "Sole".to_string(), 290 | Self::JA => "晴れ".to_string(), 291 | Self::UK => "Сонячно".to_string(), 292 | Self::SV => "Solsken".to_string(), 293 | Self::DA => "Solskin".to_string(), 294 | Self::CS => "Jasno".to_string(), 295 | Self::SK => "Jasno".to_string(), 296 | } 297 | } 298 | pub fn thunder(&self) -> String { 299 | match &self { 300 | Self::EN => "Thunder".to_string(), 301 | Self::DE => "Donner".to_string(), 302 | Self::PL => "Burza".to_string(), 303 | Self::RU => "Гроза".to_string(), 304 | Self::TR => "Gök gürültüsü".to_string(), 305 | Self::FR => "Orages".to_string(), 306 | Self::BE => "Навальніца".to_string(), 307 | Self::ZH => "雷暴".to_string(), 308 | Self::ES => "Tormenta".to_string(), 309 | Self::PT => "Trovão".to_string(), 310 | Self::IT => "Tuono".to_string(), 311 | Self::JA => "雷".to_string(), 312 | Self::UK => "Гроза".to_string(), 313 | Self::SV => "Åska".to_string(), 314 | Self::DA => "Torden".to_string(), 315 | Self::CS => "Bouřka".to_string(), 316 | Self::SK => "Búrka".to_string(), 317 | } 318 | } 319 | pub fn wind(&self) -> String { 320 | match &self { 321 | Self::EN => "Wind".to_string(), 322 | Self::DE => "Wind".to_string(), 323 | Self::PL => "Wiatr".to_string(), 324 | Self::RU => "Ветер".to_string(), 325 | Self::TR => "Rüzgar".to_string(), 326 | Self::FR => "Vent".to_string(), 327 | Self::BE => "Вецер".to_string(), 328 | Self::ZH => "风速".to_string(), 329 | Self::ES => "Viento".to_string(), 330 | Self::PT => "Vento".to_string(), 331 | Self::IT => "Vento".to_string(), 332 | Self::JA => "風速".to_string(), 333 | Self::UK => "Вітер".to_string(), 334 | Self::SV => "Vind".to_string(), 335 | Self::DA => "Vind".to_string(), 336 | Self::CS => "Vítr".to_string(), 337 | Self::SK => "Vietor".to_string(), 338 | } 339 | } 340 | pub fn weather_desc(&self) -> String { 341 | match &self { 342 | Lang::EN => "weatherDesc".to_string(), 343 | Lang::DE => "lang_de".to_string(), 344 | Lang::PL => "lang_pl".to_string(), 345 | Lang::RU => "lang_ru".to_string(), 346 | Lang::TR => "lang_tr".to_string(), 347 | Lang::FR => "lang_fr".to_string(), 348 | Lang::BE => "lang_be".to_string(), 349 | Lang::ZH => "lang_zh".to_string(), 350 | Lang::ES => "lang_es".to_string(), 351 | Lang::PT => "lang_pt".to_string(), 352 | Lang::IT => "lang_it".to_string(), 353 | Lang::JA => "lang_ja".to_string(), 354 | Lang::UK => "lang_uk".to_string(), 355 | Lang::SV => "lang_sv".to_string(), 356 | Lang::DA => "lang_da".to_string(), 357 | Lang::CS => "lang_cs".to_string(), 358 | Lang::SK => "lang_sk".to_string(), 359 | } 360 | } 361 | 362 | pub fn locale_str(&self) -> String { 363 | match &self { 364 | Self::EN => "en_US".to_string(), 365 | Self::DE => "de_DE".to_string(), 366 | Self::PL => "pl_PL".to_string(), 367 | Self::RU => "ru_RU".to_string(), 368 | Self::TR => "tr_TR".to_string(), 369 | Self::FR => "fr_FR".to_string(), 370 | Self::BE => "be_BY".to_string(), 371 | Self::ZH => "zh_CN".to_string(), 372 | Self::ES => "es_ES".to_string(), 373 | Self::PT => "pt_PT".to_string(), 374 | Self::IT => "it_IT".to_string(), 375 | Self::JA => "ja_JP".to_string(), 376 | Self::UK => "uk_UA".to_string(), 377 | Self::SV => "sv_SE".to_string(), 378 | Self::DA => "da_DK".to_string(), 379 | Self::CS => "cs_CZ".to_string(), 380 | Self::SK => "sk_SK".to_string(), 381 | } 382 | } 383 | } 384 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 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 = "android-tzdata" 22 | version = "0.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 25 | 26 | [[package]] 27 | name = "android_system_properties" 28 | version = "0.1.5" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 31 | dependencies = [ 32 | "libc", 33 | ] 34 | 35 | [[package]] 36 | name = "anstream" 37 | version = "0.6.12" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" 40 | dependencies = [ 41 | "anstyle", 42 | "anstyle-parse", 43 | "anstyle-query", 44 | "anstyle-wincon", 45 | "colorchoice", 46 | "utf8parse", 47 | ] 48 | 49 | [[package]] 50 | name = "anstyle" 51 | version = "1.0.10" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 54 | 55 | [[package]] 56 | name = "anstyle-parse" 57 | version = "0.2.3" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" 60 | dependencies = [ 61 | "utf8parse", 62 | ] 63 | 64 | [[package]] 65 | name = "anstyle-query" 66 | version = "1.0.2" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" 69 | dependencies = [ 70 | "windows-sys 0.52.0", 71 | ] 72 | 73 | [[package]] 74 | name = "anstyle-wincon" 75 | version = "3.0.2" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" 78 | dependencies = [ 79 | "anstyle", 80 | "windows-sys 0.52.0", 81 | ] 82 | 83 | [[package]] 84 | name = "atomic-waker" 85 | version = "1.1.2" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 88 | 89 | [[package]] 90 | name = "autocfg" 91 | version = "1.1.0" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 94 | 95 | [[package]] 96 | name = "backtrace" 97 | version = "0.3.69" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 100 | dependencies = [ 101 | "addr2line", 102 | "cc", 103 | "cfg-if", 104 | "libc", 105 | "miniz_oxide", 106 | "object", 107 | "rustc-demangle", 108 | ] 109 | 110 | [[package]] 111 | name = "base64" 112 | version = "0.22.1" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 115 | 116 | [[package]] 117 | name = "bitflags" 118 | version = "2.9.1" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 121 | 122 | [[package]] 123 | name = "bumpalo" 124 | version = "3.15.3" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" 127 | 128 | [[package]] 129 | name = "byteorder" 130 | version = "1.5.0" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 133 | 134 | [[package]] 135 | name = "bytes" 136 | version = "1.8.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" 139 | 140 | [[package]] 141 | name = "cc" 142 | version = "1.0.88" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" 145 | 146 | [[package]] 147 | name = "cfg-if" 148 | version = "1.0.0" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 151 | 152 | [[package]] 153 | name = "cfg_aliases" 154 | version = "0.2.1" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 157 | 158 | [[package]] 159 | name = "chrono" 160 | version = "0.4.38" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 163 | dependencies = [ 164 | "android-tzdata", 165 | "iana-time-zone", 166 | "js-sys", 167 | "num-traits", 168 | "pure-rust-locales", 169 | "wasm-bindgen", 170 | "windows-targets 0.52.6", 171 | ] 172 | 173 | [[package]] 174 | name = "clap" 175 | version = "4.5.21" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" 178 | dependencies = [ 179 | "clap_builder", 180 | "clap_derive", 181 | ] 182 | 183 | [[package]] 184 | name = "clap_builder" 185 | version = "4.5.21" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" 188 | dependencies = [ 189 | "anstream", 190 | "anstyle", 191 | "clap_lex", 192 | "strsim", 193 | ] 194 | 195 | [[package]] 196 | name = "clap_derive" 197 | version = "4.5.18" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" 200 | dependencies = [ 201 | "heck", 202 | "proc-macro2", 203 | "quote", 204 | "syn", 205 | ] 206 | 207 | [[package]] 208 | name = "clap_lex" 209 | version = "0.7.0" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" 212 | 213 | [[package]] 214 | name = "colorchoice" 215 | version = "1.0.0" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 218 | 219 | [[package]] 220 | name = "core-foundation" 221 | version = "0.9.4" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 224 | dependencies = [ 225 | "core-foundation-sys", 226 | "libc", 227 | ] 228 | 229 | [[package]] 230 | name = "core-foundation" 231 | version = "0.10.1" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" 234 | dependencies = [ 235 | "core-foundation-sys", 236 | "libc", 237 | ] 238 | 239 | [[package]] 240 | name = "core-foundation-sys" 241 | version = "0.8.6" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 244 | 245 | [[package]] 246 | name = "encoding_rs" 247 | version = "0.8.35" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 250 | dependencies = [ 251 | "cfg-if", 252 | ] 253 | 254 | [[package]] 255 | name = "equivalent" 256 | version = "1.0.2" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 259 | 260 | [[package]] 261 | name = "errno" 262 | version = "0.3.13" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 265 | dependencies = [ 266 | "libc", 267 | "windows-sys 0.52.0", 268 | ] 269 | 270 | [[package]] 271 | name = "fastrand" 272 | version = "2.3.0" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 275 | 276 | [[package]] 277 | name = "fnv" 278 | version = "1.0.7" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 281 | 282 | [[package]] 283 | name = "foreign-types" 284 | version = "0.3.2" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 287 | dependencies = [ 288 | "foreign-types-shared", 289 | ] 290 | 291 | [[package]] 292 | name = "foreign-types-shared" 293 | version = "0.1.1" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 296 | 297 | [[package]] 298 | name = "form_urlencoded" 299 | version = "1.2.1" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 302 | dependencies = [ 303 | "percent-encoding", 304 | ] 305 | 306 | [[package]] 307 | name = "futures-channel" 308 | version = "0.3.30" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 311 | dependencies = [ 312 | "futures-core", 313 | "futures-sink", 314 | ] 315 | 316 | [[package]] 317 | name = "futures-core" 318 | version = "0.3.30" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 321 | 322 | [[package]] 323 | name = "futures-io" 324 | version = "0.3.30" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 327 | 328 | [[package]] 329 | name = "futures-sink" 330 | version = "0.3.30" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 333 | 334 | [[package]] 335 | name = "futures-task" 336 | version = "0.3.30" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 339 | 340 | [[package]] 341 | name = "futures-util" 342 | version = "0.3.30" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 345 | dependencies = [ 346 | "futures-core", 347 | "futures-io", 348 | "futures-sink", 349 | "futures-task", 350 | "memchr", 351 | "pin-project-lite", 352 | "pin-utils", 353 | "slab", 354 | ] 355 | 356 | [[package]] 357 | name = "getrandom" 358 | version = "0.2.12" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" 361 | dependencies = [ 362 | "cfg-if", 363 | "libc", 364 | "wasi 0.11.0+wasi-snapshot-preview1", 365 | ] 366 | 367 | [[package]] 368 | name = "getrandom" 369 | version = "0.3.3" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 372 | dependencies = [ 373 | "cfg-if", 374 | "libc", 375 | "r-efi", 376 | "wasi 0.14.2+wasi-0.2.4", 377 | ] 378 | 379 | [[package]] 380 | name = "gimli" 381 | version = "0.28.1" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 384 | 385 | [[package]] 386 | name = "h2" 387 | version = "0.4.9" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" 390 | dependencies = [ 391 | "atomic-waker", 392 | "bytes", 393 | "fnv", 394 | "futures-core", 395 | "futures-sink", 396 | "http", 397 | "indexmap", 398 | "slab", 399 | "tokio", 400 | "tokio-util", 401 | "tracing", 402 | ] 403 | 404 | [[package]] 405 | name = "hashbrown" 406 | version = "0.15.4" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 409 | 410 | [[package]] 411 | name = "heck" 412 | version = "0.5.0" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 415 | 416 | [[package]] 417 | name = "http" 418 | version = "1.1.0" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" 421 | dependencies = [ 422 | "bytes", 423 | "fnv", 424 | "itoa", 425 | ] 426 | 427 | [[package]] 428 | name = "http-body" 429 | version = "1.0.1" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 432 | dependencies = [ 433 | "bytes", 434 | "http", 435 | ] 436 | 437 | [[package]] 438 | name = "http-body-util" 439 | version = "0.1.2" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 442 | dependencies = [ 443 | "bytes", 444 | "futures-util", 445 | "http", 446 | "http-body", 447 | "pin-project-lite", 448 | ] 449 | 450 | [[package]] 451 | name = "httparse" 452 | version = "1.8.0" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 455 | 456 | [[package]] 457 | name = "hyper" 458 | version = "1.5.0" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" 461 | dependencies = [ 462 | "bytes", 463 | "futures-channel", 464 | "futures-util", 465 | "h2", 466 | "http", 467 | "http-body", 468 | "httparse", 469 | "itoa", 470 | "pin-project-lite", 471 | "smallvec", 472 | "tokio", 473 | "want", 474 | ] 475 | 476 | [[package]] 477 | name = "hyper-rustls" 478 | version = "0.27.3" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" 481 | dependencies = [ 482 | "futures-util", 483 | "http", 484 | "hyper", 485 | "hyper-util", 486 | "rustls", 487 | "rustls-native-certs", 488 | "rustls-pki-types", 489 | "tokio", 490 | "tokio-rustls", 491 | "tower-service", 492 | ] 493 | 494 | [[package]] 495 | name = "hyper-tls" 496 | version = "0.6.0" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 499 | dependencies = [ 500 | "bytes", 501 | "http-body-util", 502 | "hyper", 503 | "hyper-util", 504 | "native-tls", 505 | "tokio", 506 | "tokio-native-tls", 507 | "tower-service", 508 | ] 509 | 510 | [[package]] 511 | name = "hyper-util" 512 | version = "0.1.10" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 515 | dependencies = [ 516 | "bytes", 517 | "futures-channel", 518 | "futures-util", 519 | "http", 520 | "http-body", 521 | "hyper", 522 | "pin-project-lite", 523 | "socket2", 524 | "tokio", 525 | "tower-service", 526 | "tracing", 527 | ] 528 | 529 | [[package]] 530 | name = "iana-time-zone" 531 | version = "0.1.60" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 534 | dependencies = [ 535 | "android_system_properties", 536 | "core-foundation-sys", 537 | "iana-time-zone-haiku", 538 | "js-sys", 539 | "wasm-bindgen", 540 | "windows-core", 541 | ] 542 | 543 | [[package]] 544 | name = "iana-time-zone-haiku" 545 | version = "0.1.2" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 548 | dependencies = [ 549 | "cc", 550 | ] 551 | 552 | [[package]] 553 | name = "idna" 554 | version = "0.5.0" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 557 | dependencies = [ 558 | "unicode-bidi", 559 | "unicode-normalization", 560 | ] 561 | 562 | [[package]] 563 | name = "indexmap" 564 | version = "2.10.0" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 567 | dependencies = [ 568 | "equivalent", 569 | "hashbrown", 570 | ] 571 | 572 | [[package]] 573 | name = "ipnet" 574 | version = "2.9.0" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 577 | 578 | [[package]] 579 | name = "itoa" 580 | version = "1.0.10" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 583 | 584 | [[package]] 585 | name = "js-sys" 586 | version = "0.3.68" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" 589 | dependencies = [ 590 | "wasm-bindgen", 591 | ] 592 | 593 | [[package]] 594 | name = "libc" 595 | version = "0.2.162" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" 598 | 599 | [[package]] 600 | name = "linux-raw-sys" 601 | version = "0.4.15" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 604 | 605 | [[package]] 606 | name = "log" 607 | version = "0.4.20" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 610 | 611 | [[package]] 612 | name = "memchr" 613 | version = "2.7.1" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" 616 | 617 | [[package]] 618 | name = "mime" 619 | version = "0.3.17" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 622 | 623 | [[package]] 624 | name = "miniz_oxide" 625 | version = "0.7.2" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" 628 | dependencies = [ 629 | "adler", 630 | ] 631 | 632 | [[package]] 633 | name = "mio" 634 | version = "0.8.10" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" 637 | dependencies = [ 638 | "libc", 639 | "wasi 0.11.0+wasi-snapshot-preview1", 640 | "windows-sys 0.48.0", 641 | ] 642 | 643 | [[package]] 644 | name = "native-tls" 645 | version = "0.2.14" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 648 | dependencies = [ 649 | "libc", 650 | "log", 651 | "openssl", 652 | "openssl-probe", 653 | "openssl-sys", 654 | "schannel", 655 | "security-framework 2.11.1", 656 | "security-framework-sys", 657 | "tempfile", 658 | ] 659 | 660 | [[package]] 661 | name = "num-traits" 662 | version = "0.2.18" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" 665 | dependencies = [ 666 | "autocfg", 667 | ] 668 | 669 | [[package]] 670 | name = "object" 671 | version = "0.32.2" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 674 | dependencies = [ 675 | "memchr", 676 | ] 677 | 678 | [[package]] 679 | name = "once_cell" 680 | version = "1.19.0" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 683 | 684 | [[package]] 685 | name = "openssl" 686 | version = "0.10.72" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" 689 | dependencies = [ 690 | "bitflags", 691 | "cfg-if", 692 | "foreign-types", 693 | "libc", 694 | "once_cell", 695 | "openssl-macros", 696 | "openssl-sys", 697 | ] 698 | 699 | [[package]] 700 | name = "openssl-macros" 701 | version = "0.1.1" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 704 | dependencies = [ 705 | "proc-macro2", 706 | "quote", 707 | "syn", 708 | ] 709 | 710 | [[package]] 711 | name = "openssl-probe" 712 | version = "0.1.6" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 715 | 716 | [[package]] 717 | name = "openssl-sys" 718 | version = "0.9.107" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" 721 | dependencies = [ 722 | "cc", 723 | "libc", 724 | "pkg-config", 725 | "vcpkg", 726 | ] 727 | 728 | [[package]] 729 | name = "percent-encoding" 730 | version = "2.3.1" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 733 | 734 | [[package]] 735 | name = "pin-project-lite" 736 | version = "0.2.13" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 739 | 740 | [[package]] 741 | name = "pin-utils" 742 | version = "0.1.0" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 745 | 746 | [[package]] 747 | name = "pkg-config" 748 | version = "0.3.32" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 751 | 752 | [[package]] 753 | name = "ppv-lite86" 754 | version = "0.2.20" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 757 | dependencies = [ 758 | "zerocopy", 759 | ] 760 | 761 | [[package]] 762 | name = "proc-macro2" 763 | version = "1.0.78" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" 766 | dependencies = [ 767 | "unicode-ident", 768 | ] 769 | 770 | [[package]] 771 | name = "pure-rust-locales" 772 | version = "0.8.1" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "1190fd18ae6ce9e137184f207593877e70f39b015040156b1e05081cdfe3733a" 775 | 776 | [[package]] 777 | name = "quinn" 778 | version = "0.11.5" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" 781 | dependencies = [ 782 | "bytes", 783 | "pin-project-lite", 784 | "quinn-proto", 785 | "quinn-udp", 786 | "rustc-hash", 787 | "rustls", 788 | "socket2", 789 | "thiserror", 790 | "tokio", 791 | "tracing", 792 | ] 793 | 794 | [[package]] 795 | name = "quinn-proto" 796 | version = "0.11.8" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" 799 | dependencies = [ 800 | "bytes", 801 | "rand", 802 | "ring", 803 | "rustc-hash", 804 | "rustls", 805 | "slab", 806 | "thiserror", 807 | "tinyvec", 808 | "tracing", 809 | ] 810 | 811 | [[package]] 812 | name = "quinn-udp" 813 | version = "0.5.7" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" 816 | dependencies = [ 817 | "cfg_aliases", 818 | "libc", 819 | "once_cell", 820 | "socket2", 821 | "tracing", 822 | "windows-sys 0.52.0", 823 | ] 824 | 825 | [[package]] 826 | name = "quote" 827 | version = "1.0.35" 828 | source = "registry+https://github.com/rust-lang/crates.io-index" 829 | checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" 830 | dependencies = [ 831 | "proc-macro2", 832 | ] 833 | 834 | [[package]] 835 | name = "r-efi" 836 | version = "5.3.0" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 839 | 840 | [[package]] 841 | name = "rand" 842 | version = "0.8.5" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 845 | dependencies = [ 846 | "libc", 847 | "rand_chacha", 848 | "rand_core", 849 | ] 850 | 851 | [[package]] 852 | name = "rand_chacha" 853 | version = "0.3.1" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 856 | dependencies = [ 857 | "ppv-lite86", 858 | "rand_core", 859 | ] 860 | 861 | [[package]] 862 | name = "rand_core" 863 | version = "0.6.4" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 866 | dependencies = [ 867 | "getrandom 0.2.12", 868 | ] 869 | 870 | [[package]] 871 | name = "reqwest" 872 | version = "0.12.9" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" 875 | dependencies = [ 876 | "base64", 877 | "bytes", 878 | "encoding_rs", 879 | "futures-channel", 880 | "futures-core", 881 | "futures-util", 882 | "h2", 883 | "http", 884 | "http-body", 885 | "http-body-util", 886 | "hyper", 887 | "hyper-rustls", 888 | "hyper-tls", 889 | "hyper-util", 890 | "ipnet", 891 | "js-sys", 892 | "log", 893 | "mime", 894 | "native-tls", 895 | "once_cell", 896 | "percent-encoding", 897 | "pin-project-lite", 898 | "quinn", 899 | "rustls", 900 | "rustls-native-certs", 901 | "rustls-pemfile", 902 | "rustls-pki-types", 903 | "serde", 904 | "serde_json", 905 | "serde_urlencoded", 906 | "sync_wrapper", 907 | "system-configuration", 908 | "tokio", 909 | "tokio-native-tls", 910 | "tokio-rustls", 911 | "tower-service", 912 | "url", 913 | "wasm-bindgen", 914 | "wasm-bindgen-futures", 915 | "web-sys", 916 | "windows-registry", 917 | ] 918 | 919 | [[package]] 920 | name = "ring" 921 | version = "0.17.8" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 924 | dependencies = [ 925 | "cc", 926 | "cfg-if", 927 | "getrandom 0.2.12", 928 | "libc", 929 | "spin", 930 | "untrusted", 931 | "windows-sys 0.52.0", 932 | ] 933 | 934 | [[package]] 935 | name = "rustc-demangle" 936 | version = "0.1.23" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 939 | 940 | [[package]] 941 | name = "rustc-hash" 942 | version = "2.0.0" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" 945 | 946 | [[package]] 947 | name = "rustix" 948 | version = "0.38.44" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 951 | dependencies = [ 952 | "bitflags", 953 | "errno", 954 | "libc", 955 | "linux-raw-sys", 956 | "windows-sys 0.52.0", 957 | ] 958 | 959 | [[package]] 960 | name = "rustls" 961 | version = "0.23.29" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" 964 | dependencies = [ 965 | "once_cell", 966 | "ring", 967 | "rustls-pki-types", 968 | "rustls-webpki", 969 | "subtle", 970 | "zeroize", 971 | ] 972 | 973 | [[package]] 974 | name = "rustls-native-certs" 975 | version = "0.8.1" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" 978 | dependencies = [ 979 | "openssl-probe", 980 | "rustls-pki-types", 981 | "schannel", 982 | "security-framework 3.2.0", 983 | ] 984 | 985 | [[package]] 986 | name = "rustls-pemfile" 987 | version = "2.2.0" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 990 | dependencies = [ 991 | "rustls-pki-types", 992 | ] 993 | 994 | [[package]] 995 | name = "rustls-pki-types" 996 | version = "1.12.0" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 999 | dependencies = [ 1000 | "zeroize", 1001 | ] 1002 | 1003 | [[package]] 1004 | name = "rustls-webpki" 1005 | version = "0.103.4" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" 1008 | dependencies = [ 1009 | "ring", 1010 | "rustls-pki-types", 1011 | "untrusted", 1012 | ] 1013 | 1014 | [[package]] 1015 | name = "ryu" 1016 | version = "1.0.17" 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" 1018 | checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" 1019 | 1020 | [[package]] 1021 | name = "schannel" 1022 | version = "0.1.27" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1025 | dependencies = [ 1026 | "windows-sys 0.59.0", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "security-framework" 1031 | version = "2.11.1" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1034 | dependencies = [ 1035 | "bitflags", 1036 | "core-foundation 0.9.4", 1037 | "core-foundation-sys", 1038 | "libc", 1039 | "security-framework-sys", 1040 | ] 1041 | 1042 | [[package]] 1043 | name = "security-framework" 1044 | version = "3.2.0" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" 1047 | dependencies = [ 1048 | "bitflags", 1049 | "core-foundation 0.10.1", 1050 | "core-foundation-sys", 1051 | "libc", 1052 | "security-framework-sys", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "security-framework-sys" 1057 | version = "2.14.0" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1060 | dependencies = [ 1061 | "core-foundation-sys", 1062 | "libc", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "serde" 1067 | version = "1.0.197" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" 1070 | dependencies = [ 1071 | "serde_derive", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "serde_derive" 1076 | version = "1.0.197" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" 1079 | dependencies = [ 1080 | "proc-macro2", 1081 | "quote", 1082 | "syn", 1083 | ] 1084 | 1085 | [[package]] 1086 | name = "serde_json" 1087 | version = "1.0.133" 1088 | source = "registry+https://github.com/rust-lang/crates.io-index" 1089 | checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" 1090 | dependencies = [ 1091 | "itoa", 1092 | "memchr", 1093 | "ryu", 1094 | "serde", 1095 | ] 1096 | 1097 | [[package]] 1098 | name = "serde_urlencoded" 1099 | version = "0.7.1" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1102 | dependencies = [ 1103 | "form_urlencoded", 1104 | "itoa", 1105 | "ryu", 1106 | "serde", 1107 | ] 1108 | 1109 | [[package]] 1110 | name = "slab" 1111 | version = "0.4.9" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1114 | dependencies = [ 1115 | "autocfg", 1116 | ] 1117 | 1118 | [[package]] 1119 | name = "smallvec" 1120 | version = "1.13.2" 1121 | source = "registry+https://github.com/rust-lang/crates.io-index" 1122 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1123 | 1124 | [[package]] 1125 | name = "socket2" 1126 | version = "0.5.6" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" 1129 | dependencies = [ 1130 | "libc", 1131 | "windows-sys 0.52.0", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "spin" 1136 | version = "0.9.8" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1139 | 1140 | [[package]] 1141 | name = "strsim" 1142 | version = "0.11.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" 1145 | 1146 | [[package]] 1147 | name = "subtle" 1148 | version = "2.6.1" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1151 | 1152 | [[package]] 1153 | name = "syn" 1154 | version = "2.0.51" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "6ab617d94515e94ae53b8406c628598680aa0c9587474ecbe58188f7b345d66c" 1157 | dependencies = [ 1158 | "proc-macro2", 1159 | "quote", 1160 | "unicode-ident", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "sync_wrapper" 1165 | version = "1.0.1" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" 1168 | dependencies = [ 1169 | "futures-core", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "system-configuration" 1174 | version = "0.6.1" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 1177 | dependencies = [ 1178 | "bitflags", 1179 | "core-foundation 0.9.4", 1180 | "system-configuration-sys", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "system-configuration-sys" 1185 | version = "0.6.0" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 1188 | dependencies = [ 1189 | "core-foundation-sys", 1190 | "libc", 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "tempfile" 1195 | version = "3.17.1" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" 1198 | dependencies = [ 1199 | "cfg-if", 1200 | "fastrand", 1201 | "getrandom 0.3.3", 1202 | "once_cell", 1203 | "rustix", 1204 | "windows-sys 0.52.0", 1205 | ] 1206 | 1207 | [[package]] 1208 | name = "thiserror" 1209 | version = "1.0.65" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" 1212 | dependencies = [ 1213 | "thiserror-impl", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "thiserror-impl" 1218 | version = "1.0.65" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" 1221 | dependencies = [ 1222 | "proc-macro2", 1223 | "quote", 1224 | "syn", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "tinyvec" 1229 | version = "1.6.0" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1232 | dependencies = [ 1233 | "tinyvec_macros", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "tinyvec_macros" 1238 | version = "0.1.1" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1241 | 1242 | [[package]] 1243 | name = "tokio" 1244 | version = "1.36.0" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" 1247 | dependencies = [ 1248 | "backtrace", 1249 | "bytes", 1250 | "libc", 1251 | "mio", 1252 | "pin-project-lite", 1253 | "socket2", 1254 | "windows-sys 0.48.0", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "tokio-native-tls" 1259 | version = "0.3.1" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1262 | dependencies = [ 1263 | "native-tls", 1264 | "tokio", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "tokio-rustls" 1269 | version = "0.26.0" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" 1272 | dependencies = [ 1273 | "rustls", 1274 | "rustls-pki-types", 1275 | "tokio", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "tokio-util" 1280 | version = "0.7.15" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 1283 | dependencies = [ 1284 | "bytes", 1285 | "futures-core", 1286 | "futures-sink", 1287 | "pin-project-lite", 1288 | "tokio", 1289 | ] 1290 | 1291 | [[package]] 1292 | name = "tower-service" 1293 | version = "0.3.2" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1296 | 1297 | [[package]] 1298 | name = "tracing" 1299 | version = "0.1.40" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1302 | dependencies = [ 1303 | "pin-project-lite", 1304 | "tracing-core", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "tracing-core" 1309 | version = "0.1.32" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1312 | dependencies = [ 1313 | "once_cell", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "try-lock" 1318 | version = "0.2.5" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1321 | 1322 | [[package]] 1323 | name = "unicode-bidi" 1324 | version = "0.3.15" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 1327 | 1328 | [[package]] 1329 | name = "unicode-ident" 1330 | version = "1.0.12" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 1333 | 1334 | [[package]] 1335 | name = "unicode-normalization" 1336 | version = "0.1.23" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 1339 | dependencies = [ 1340 | "tinyvec", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "untrusted" 1345 | version = "0.9.0" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1348 | 1349 | [[package]] 1350 | name = "url" 1351 | version = "2.5.0" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 1354 | dependencies = [ 1355 | "form_urlencoded", 1356 | "idna", 1357 | "percent-encoding", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "utf8parse" 1362 | version = "0.2.1" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 1365 | 1366 | [[package]] 1367 | name = "vcpkg" 1368 | version = "0.2.15" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1371 | 1372 | [[package]] 1373 | name = "want" 1374 | version = "0.3.1" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1377 | dependencies = [ 1378 | "try-lock", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "wasi" 1383 | version = "0.11.0+wasi-snapshot-preview1" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1386 | 1387 | [[package]] 1388 | name = "wasi" 1389 | version = "0.14.2+wasi-0.2.4" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1392 | dependencies = [ 1393 | "wit-bindgen-rt", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "wasm-bindgen" 1398 | version = "0.2.91" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" 1401 | dependencies = [ 1402 | "cfg-if", 1403 | "wasm-bindgen-macro", 1404 | ] 1405 | 1406 | [[package]] 1407 | name = "wasm-bindgen-backend" 1408 | version = "0.2.91" 1409 | source = "registry+https://github.com/rust-lang/crates.io-index" 1410 | checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" 1411 | dependencies = [ 1412 | "bumpalo", 1413 | "log", 1414 | "once_cell", 1415 | "proc-macro2", 1416 | "quote", 1417 | "syn", 1418 | "wasm-bindgen-shared", 1419 | ] 1420 | 1421 | [[package]] 1422 | name = "wasm-bindgen-futures" 1423 | version = "0.4.41" 1424 | source = "registry+https://github.com/rust-lang/crates.io-index" 1425 | checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" 1426 | dependencies = [ 1427 | "cfg-if", 1428 | "js-sys", 1429 | "wasm-bindgen", 1430 | "web-sys", 1431 | ] 1432 | 1433 | [[package]] 1434 | name = "wasm-bindgen-macro" 1435 | version = "0.2.91" 1436 | source = "registry+https://github.com/rust-lang/crates.io-index" 1437 | checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" 1438 | dependencies = [ 1439 | "quote", 1440 | "wasm-bindgen-macro-support", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "wasm-bindgen-macro-support" 1445 | version = "0.2.91" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" 1448 | dependencies = [ 1449 | "proc-macro2", 1450 | "quote", 1451 | "syn", 1452 | "wasm-bindgen-backend", 1453 | "wasm-bindgen-shared", 1454 | ] 1455 | 1456 | [[package]] 1457 | name = "wasm-bindgen-shared" 1458 | version = "0.2.91" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" 1461 | 1462 | [[package]] 1463 | name = "web-sys" 1464 | version = "0.3.68" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" 1467 | dependencies = [ 1468 | "js-sys", 1469 | "wasm-bindgen", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "windows-core" 1474 | version = "0.52.0" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1477 | dependencies = [ 1478 | "windows-targets 0.52.6", 1479 | ] 1480 | 1481 | [[package]] 1482 | name = "windows-registry" 1483 | version = "0.2.0" 1484 | source = "registry+https://github.com/rust-lang/crates.io-index" 1485 | checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" 1486 | dependencies = [ 1487 | "windows-result", 1488 | "windows-strings", 1489 | "windows-targets 0.52.6", 1490 | ] 1491 | 1492 | [[package]] 1493 | name = "windows-result" 1494 | version = "0.2.0" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 1497 | dependencies = [ 1498 | "windows-targets 0.52.6", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "windows-strings" 1503 | version = "0.1.0" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 1506 | dependencies = [ 1507 | "windows-result", 1508 | "windows-targets 0.52.6", 1509 | ] 1510 | 1511 | [[package]] 1512 | name = "windows-sys" 1513 | version = "0.48.0" 1514 | source = "registry+https://github.com/rust-lang/crates.io-index" 1515 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1516 | dependencies = [ 1517 | "windows-targets 0.48.5", 1518 | ] 1519 | 1520 | [[package]] 1521 | name = "windows-sys" 1522 | version = "0.52.0" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1525 | dependencies = [ 1526 | "windows-targets 0.52.6", 1527 | ] 1528 | 1529 | [[package]] 1530 | name = "windows-sys" 1531 | version = "0.59.0" 1532 | source = "registry+https://github.com/rust-lang/crates.io-index" 1533 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1534 | dependencies = [ 1535 | "windows-targets 0.52.6", 1536 | ] 1537 | 1538 | [[package]] 1539 | name = "windows-targets" 1540 | version = "0.48.5" 1541 | source = "registry+https://github.com/rust-lang/crates.io-index" 1542 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1543 | dependencies = [ 1544 | "windows_aarch64_gnullvm 0.48.5", 1545 | "windows_aarch64_msvc 0.48.5", 1546 | "windows_i686_gnu 0.48.5", 1547 | "windows_i686_msvc 0.48.5", 1548 | "windows_x86_64_gnu 0.48.5", 1549 | "windows_x86_64_gnullvm 0.48.5", 1550 | "windows_x86_64_msvc 0.48.5", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "windows-targets" 1555 | version = "0.52.6" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1558 | dependencies = [ 1559 | "windows_aarch64_gnullvm 0.52.6", 1560 | "windows_aarch64_msvc 0.52.6", 1561 | "windows_i686_gnu 0.52.6", 1562 | "windows_i686_gnullvm", 1563 | "windows_i686_msvc 0.52.6", 1564 | "windows_x86_64_gnu 0.52.6", 1565 | "windows_x86_64_gnullvm 0.52.6", 1566 | "windows_x86_64_msvc 0.52.6", 1567 | ] 1568 | 1569 | [[package]] 1570 | name = "windows_aarch64_gnullvm" 1571 | version = "0.48.5" 1572 | source = "registry+https://github.com/rust-lang/crates.io-index" 1573 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1574 | 1575 | [[package]] 1576 | name = "windows_aarch64_gnullvm" 1577 | version = "0.52.6" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1580 | 1581 | [[package]] 1582 | name = "windows_aarch64_msvc" 1583 | version = "0.48.5" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1586 | 1587 | [[package]] 1588 | name = "windows_aarch64_msvc" 1589 | version = "0.52.6" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1592 | 1593 | [[package]] 1594 | name = "windows_i686_gnu" 1595 | version = "0.48.5" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1598 | 1599 | [[package]] 1600 | name = "windows_i686_gnu" 1601 | version = "0.52.6" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1604 | 1605 | [[package]] 1606 | name = "windows_i686_gnullvm" 1607 | version = "0.52.6" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1610 | 1611 | [[package]] 1612 | name = "windows_i686_msvc" 1613 | version = "0.48.5" 1614 | source = "registry+https://github.com/rust-lang/crates.io-index" 1615 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1616 | 1617 | [[package]] 1618 | name = "windows_i686_msvc" 1619 | version = "0.52.6" 1620 | source = "registry+https://github.com/rust-lang/crates.io-index" 1621 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1622 | 1623 | [[package]] 1624 | name = "windows_x86_64_gnu" 1625 | version = "0.48.5" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1628 | 1629 | [[package]] 1630 | name = "windows_x86_64_gnu" 1631 | version = "0.52.6" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1634 | 1635 | [[package]] 1636 | name = "windows_x86_64_gnullvm" 1637 | version = "0.48.5" 1638 | source = "registry+https://github.com/rust-lang/crates.io-index" 1639 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1640 | 1641 | [[package]] 1642 | name = "windows_x86_64_gnullvm" 1643 | version = "0.52.6" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1646 | 1647 | [[package]] 1648 | name = "windows_x86_64_msvc" 1649 | version = "0.48.5" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1652 | 1653 | [[package]] 1654 | name = "windows_x86_64_msvc" 1655 | version = "0.52.6" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1658 | 1659 | [[package]] 1660 | name = "wit-bindgen-rt" 1661 | version = "0.39.0" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 1664 | dependencies = [ 1665 | "bitflags", 1666 | ] 1667 | 1668 | [[package]] 1669 | name = "wttrbar" 1670 | version = "0.13.0" 1671 | dependencies = [ 1672 | "chrono", 1673 | "clap", 1674 | "reqwest", 1675 | "serde_json", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "zerocopy" 1680 | version = "0.7.35" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1683 | dependencies = [ 1684 | "byteorder", 1685 | "zerocopy-derive", 1686 | ] 1687 | 1688 | [[package]] 1689 | name = "zerocopy-derive" 1690 | version = "0.7.35" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1693 | dependencies = [ 1694 | "proc-macro2", 1695 | "quote", 1696 | "syn", 1697 | ] 1698 | 1699 | [[package]] 1700 | name = "zeroize" 1701 | version = "1.8.1" 1702 | source = "registry+https://github.com/rust-lang/crates.io-index" 1703 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 1704 | --------------------------------------------------------------------------------