├── .gitignore ├── Shuttle.toml ├── README.md ├── templates ├── users.html ├── user.html ├── login.html ├── signup.html ├── base.html └── index.html ├── schema.sql ├── .github └── workflows │ └── deploy.yml ├── Cargo.toml ├── tests └── password.rs ├── public └── styles.css ├── src ├── utils.rs ├── errors.rs ├── authentication.rs └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .env 3 | .vscode 4 | todo.txt -------------------------------------------------------------------------------- /Shuttle.toml: -------------------------------------------------------------------------------- 1 | name = "axum-postgres-authentication" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # axum-shuttle-postgres-authentication-demo 2 | Full stack authenticated site built in Rust with Axum, Postgres and Shuttle 3 | 4 | # full write up 5 | https://www.shuttle.rs/blog/2022/08/11/authentication-tutorial 6 | -------------------------------------------------------------------------------- /templates/users.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Users:{% endblock title %} 3 | {% block content %} 4 | 9 | {% endblock content %} -------------------------------------------------------------------------------- /templates/user.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}{{username}}{% endblock title %} 3 | {% block content %} 4 |

@{{ username }}

5 | {% if is_self %} 6 |
7 | 8 |
9 | {% endif %} 10 | {% endblock content %} -------------------------------------------------------------------------------- /schema.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS users ( 2 | id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, 3 | username text NOT NULL UNIQUE, -- CHECK (name <> '') 4 | password text NOT NULL 5 | ); 6 | 7 | CREATE TABLE IF NOT EXISTS sessions ( 8 | session_token BYTEA PRIMARY KEY, 9 | user_id integer REFERENCES users (id) ON DELETE CASCADE 10 | ); -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Shuttle deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - "main" 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: shuttle-hq/deploy-action@main 13 | with: 14 | allow-dirty: true 15 | deploy-key: ${{ secrets.SHUTTLE_DEPLOY_KEY }} 16 | -------------------------------------------------------------------------------- /templates/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Login{% endblock title %} 3 | {% block content %} 4 |
5 | 6 | 7 | 8 | 9 | 10 |
11 | {% endblock content %} -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "axum-postgres-authentication" 3 | version = "0.1.0" 4 | edition = "2021" 5 | publish = false 6 | 7 | [dependencies] 8 | axum = { version = "0.6.18", features = ["multipart"] } 9 | cookie = "0.17.0" 10 | http = "0.2.9" 11 | shuttle-axum = "0.24.0" 12 | shuttle-runtime = "0.24.0" 13 | sqlx = { version = "0.7.1", features = ["runtime-tokio-native-tls", "postgres"] } 14 | tokio = "1.28.2" 15 | pbkdf2 = { version = "0.12", features = ["simple"] } 16 | rand_core = { version = "0.6", features = ["std"] } 17 | rand_chacha = "0.3.1" 18 | http-body = "0.4.5" 19 | shuttle-service = "0.24.0" 20 | tera = "1.19.0" 21 | shuttle-shared-db = { version = "0.24.0", features = ["postgres-rustls", "sqlx", "postgres"] } 22 | -------------------------------------------------------------------------------- /tests/password.rs: -------------------------------------------------------------------------------- 1 | #[test] 2 | fn passwords() { 3 | use pbkdf2::{ 4 | password_hash::{ 5 | rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString, 6 | }, 7 | Pbkdf2, 8 | }; 9 | 10 | let password = b"hunter42"; // Bad password; don't actually use! 11 | let salt = SaltString::generate(&mut OsRng); 12 | 13 | // Hash password to PHC string ($pbkdf2-sha256$...) 14 | let password_hash = Pbkdf2.hash_password(password, &salt).unwrap().to_string(); 15 | 16 | // Verify password against PHC string 17 | let parsed_hash = PasswordHash::new(&password_hash).unwrap(); 18 | assert!(Pbkdf2.verify_password(password, &parsed_hash).is_ok()); 19 | } 20 | -------------------------------------------------------------------------------- /templates/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Signup{% endblock title %} 3 | {% block content %} 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | {% endblock content %} -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Axum, Postgres, Shuttle Authentication Demo 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |

{% block title %}{% endblock title %}

18 | {% if not home_screen %} 19 | Back to home screen 20 | {% endif %} 21 |
22 |
23 | {% block content %}{% endblock content %} 24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /public/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | display: grid; 3 | grid-template-columns: 1fr 400px 1fr; 4 | grid-template-rows: 1fr 400px 1fr; 5 | min-height: 100vh; 6 | margin: 0; 7 | font-family: 'Karla', sans-serif; 8 | user-select: none; 9 | font-size: 12pt; 10 | } 11 | 12 | body>header { 13 | margin-top: auto; 14 | grid-column: 2; 15 | margin-bottom: 20px; 16 | } 17 | 18 | body>header>h1 { 19 | margin: 10px 0; 20 | } 21 | 22 | body>main { 23 | grid-column: 2; 24 | grid-row: 2; 25 | } 26 | 27 | form { 28 | gap: 10px; 29 | display: flex; 30 | flex-direction: column; 31 | } 32 | 33 | input { 34 | font-size: inherit; 35 | font-family: inherit; 36 | padding: 4px 8px; 37 | border-radius: 6px; 38 | border: 2px solid #d8d8d8; 39 | } 40 | 41 | input[type="submit"] { 42 | border: none; 43 | margin-right: auto; 44 | padding: 10px 22px; 45 | margin-top: 20px; 46 | font-size: 12pt; 47 | } -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block title %}Axum Shuttle Postgres Authentication Demo Site{% endblock title %} 3 | {% block content %} 4 |

5 | Built on a Axum web server with Tera templates, a postgres database with sqlx and hosted on Shuttle! 6 |

7 | {% if logged_in %} 8 | View my page 9 |
10 | 11 |
12 | {% else %} 13 |

14 | Signup or Login 15 |

16 | {% endif %} 17 |

18 | View full article 19 |

20 |

21 | View repository 22 |

23 |

24 | View all users 25 |

26 | {% endblock content %} 27 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | 3 | use axum::extract::Multipart; 4 | use http::Response; 5 | use http_body::Empty; 6 | 7 | use crate::{ 8 | authentication::SessionToken, errors::MultipartError, COOKIE_MAX_AGE, USER_COOKIE_NAME, 9 | }; 10 | 11 | pub(crate) fn login_response(session_token: SessionToken) -> impl axum::response::IntoResponse { 12 | http::Response::builder() 13 | .status(http::StatusCode::SEE_OTHER) 14 | .header("Location", "/") 15 | .header( 16 | "Set-Cookie", 17 | format!( 18 | "{}={}; Max-Age={}", 19 | USER_COOKIE_NAME, 20 | session_token.into_cookie_value(), 21 | COOKIE_MAX_AGE 22 | ), 23 | ) 24 | .body(http_body::Empty::new()) 25 | .unwrap() 26 | } 27 | 28 | // TODO database and change session...? 29 | pub(crate) async fn logout_response() -> impl axum::response::IntoResponse { 30 | Response::builder() 31 | .status(http::StatusCode::SEE_OTHER) 32 | .header("Location", "/") 33 | .header("Set-Cookie", format!("{}=_; Max-Age=0", USER_COOKIE_NAME,)) 34 | .body(Empty::new()) 35 | .unwrap() 36 | } 37 | 38 | pub(crate) fn error_page(err: &dyn std::error::Error) -> impl axum::response::IntoResponse { 39 | Response::builder() 40 | .status(http::StatusCode::INTERNAL_SERVER_ERROR) 41 | .body(format!("Err: {}", err)) 42 | .unwrap() 43 | } 44 | 45 | pub(crate) async fn parse_multipart( 46 | mut multipart: Multipart, 47 | ) -> Result, MultipartError> { 48 | let mut map = HashMap::new(); 49 | while let Some(field) = multipart 50 | .next_field() 51 | .await 52 | .map_err(|_err| MultipartError::ReadError)? 53 | { 54 | let name = field.name().ok_or(MultipartError::NoName)?.to_string(); 55 | 56 | let data = field 57 | .text() 58 | .await 59 | .map_err(|_| MultipartError::InvalidValue)?; 60 | 61 | map.insert(name, data); 62 | } 63 | Ok(map) 64 | } 65 | -------------------------------------------------------------------------------- /src/errors.rs: -------------------------------------------------------------------------------- 1 | use std::{error::Error, fmt::Display}; 2 | 3 | #[derive(Debug)] 4 | pub(crate) enum MultipartError { 5 | NoName, 6 | InvalidValue, 7 | ReadError, 8 | } 9 | 10 | impl Display for MultipartError { 11 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 12 | match self { 13 | MultipartError::NoName => f.write_str("No named field in multipart"), 14 | MultipartError::InvalidValue => f.write_str("Invalid value in multipart"), 15 | MultipartError::ReadError => f.write_str("Reading multipart error"), 16 | } 17 | } 18 | } 19 | 20 | impl Error for MultipartError {} 21 | 22 | #[derive(Debug)] 23 | pub(crate) struct NotLoggedIn; 24 | 25 | impl Display for NotLoggedIn { 26 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 27 | f.write_str("Not logged in") 28 | } 29 | } 30 | 31 | impl Error for NotLoggedIn {} 32 | 33 | #[derive(Debug)] 34 | pub(crate) enum SignupError { 35 | UsernameExists, 36 | InvalidUsername, 37 | PasswordsDoNotMatch, 38 | MissingDetails, 39 | InvalidPassword, 40 | InternalError, 41 | } 42 | 43 | impl Display for SignupError { 44 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 45 | match self { 46 | SignupError::InvalidUsername => f.write_str("Invalid username"), 47 | SignupError::UsernameExists => f.write_str("Username already exists"), 48 | SignupError::PasswordsDoNotMatch => f.write_str("Passwords do not match"), 49 | SignupError::MissingDetails => f.write_str("Missing Details"), 50 | SignupError::InvalidPassword => f.write_str("Invalid Password"), 51 | SignupError::InternalError => f.write_str("Internal Error"), 52 | } 53 | } 54 | } 55 | 56 | impl Error for SignupError {} 57 | 58 | #[derive(Debug)] 59 | pub(crate) enum LoginError { 60 | MissingDetails, 61 | UserDoesNotExist, 62 | WrongPassword, 63 | } 64 | 65 | impl Display for LoginError { 66 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 67 | match self { 68 | LoginError::UserDoesNotExist => f.write_str("User does not exist"), 69 | LoginError::MissingDetails => f.write_str("Missing details"), 70 | LoginError::WrongPassword => f.write_str("Wrong password"), 71 | } 72 | } 73 | } 74 | 75 | impl Error for LoginError {} 76 | 77 | #[derive(Debug)] 78 | pub(crate) struct NoUser(pub String); 79 | 80 | impl Display for NoUser { 81 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 82 | f.write_fmt(format_args!("could not find user '{}'", self.0)) 83 | } 84 | } 85 | 86 | impl Error for NoUser {} 87 | -------------------------------------------------------------------------------- /src/authentication.rs: -------------------------------------------------------------------------------- 1 | use std::str::FromStr; 2 | 3 | use pbkdf2::{ 4 | password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString}, 5 | Pbkdf2, 6 | }; 7 | use rand_core::{OsRng, RngCore}; 8 | 9 | use crate::{ 10 | errors::{LoginError, SignupError}, 11 | Database, Random, USER_COOKIE_NAME, 12 | }; 13 | 14 | #[derive(Clone, Copy)] 15 | pub(crate) struct SessionToken(u128); 16 | 17 | impl FromStr for SessionToken { 18 | type Err = ::Err; 19 | 20 | fn from_str(s: &str) -> Result { 21 | s.parse().map(Self) 22 | } 23 | } 24 | 25 | impl SessionToken { 26 | pub fn generate_new(random: Random) -> Self { 27 | let mut u128_pool = [0u8; 16]; 28 | random.lock().unwrap().fill_bytes(&mut u128_pool); 29 | Self(u128::from_le_bytes(u128_pool)) 30 | } 31 | 32 | pub fn into_cookie_value(self) -> String { 33 | // TODO Opportunity for a smaller format that is still a valid cookie value 34 | self.0.to_string() 35 | } 36 | 37 | pub fn into_database_value(self) -> Vec { 38 | self.0.to_le_bytes().to_vec() 39 | } 40 | } 41 | 42 | #[derive(Clone)] 43 | pub(crate) struct User { 44 | pub username: String, 45 | } 46 | 47 | #[derive(Clone)] 48 | pub(crate) struct AuthState(Option<(SessionToken, Option, Database)>); 49 | 50 | impl AuthState { 51 | pub fn logged_in(&self) -> bool { 52 | self.0.is_some() 53 | } 54 | 55 | pub async fn get_user(&mut self) -> Option<&User> { 56 | let (session_token, store, database) = self.0.as_mut()?; 57 | if store.is_none() { 58 | const QUERY: &str = 59 | "SELECT id, username FROM users JOIN sessions ON user_id = id WHERE session_token = $1;"; 60 | 61 | let user: Option<(i32, String)> = sqlx::query_as(QUERY) 62 | .bind(&session_token.into_database_value()) 63 | .fetch_optional(&*database) 64 | .await 65 | .unwrap(); 66 | 67 | if let Some((_id, username)) = user { 68 | *store = Some(User { username }); 69 | } 70 | } 71 | store.as_ref() 72 | } 73 | } 74 | 75 | /// TODO date 76 | pub(crate) async fn new_session(database: &Database, random: Random, user_id: i32) -> SessionToken { 77 | const QUERY: &str = "INSERT INTO sessions (session_token, user_id) VALUES ($1, $2);"; 78 | 79 | let session_token = SessionToken::generate_new(random); 80 | 81 | let _result = sqlx::query(QUERY) 82 | .bind(&session_token.into_database_value()) 83 | .bind(user_id) 84 | .execute(database) 85 | .await 86 | .unwrap(); 87 | 88 | session_token 89 | } 90 | 91 | /// **AUTH MIDDLEWARE** 92 | pub(crate) async fn auth( 93 | mut req: http::Request, 94 | next: axum::middleware::Next, 95 | database: Database, 96 | ) -> axum::response::Response { 97 | let session_token = req 98 | .headers() 99 | .get_all("Cookie") 100 | .iter() 101 | .filter_map(|cookie| { 102 | cookie 103 | .to_str() 104 | .ok() 105 | .and_then(|cookie| cookie.parse::().ok()) 106 | }) 107 | .find_map(|cookie| { 108 | (cookie.name() == USER_COOKIE_NAME).then(move || cookie.value().to_owned()) 109 | }) 110 | .and_then(|cookie_value| cookie_value.parse::().ok()); 111 | 112 | req.extensions_mut() 113 | .insert(AuthState(session_token.map(|v| (v, None, database)))); 114 | 115 | next.run(req).await 116 | } 117 | 118 | pub(crate) async fn signup( 119 | database: &Database, 120 | random: Random, 121 | username: &str, 122 | password: &str, 123 | ) -> Result { 124 | fn valid_username(username: &str) -> bool { 125 | (1..20).contains(&username.len()) 126 | && username 127 | .chars() 128 | .all(|c| matches!(c, 'a'..='z' | '0'..='9' | '-')) 129 | } 130 | 131 | if !valid_username(username) { 132 | return Err(SignupError::InvalidUsername); 133 | } 134 | 135 | const INSERT_QUERY: &str = 136 | "INSERT INTO users (username, password) VALUES ($1, $2) RETURNING id;"; 137 | 138 | let salt = SaltString::generate(&mut OsRng); 139 | 140 | // Hash password to PHC string ($pbkdf2-sha256$...) 141 | let password_hash = Pbkdf2.hash_password(password.as_bytes(), &salt); 142 | 143 | let hashed_password = if let Ok(password) = password_hash { 144 | password.to_string() 145 | } else { 146 | return Err(SignupError::InvalidPassword); 147 | }; 148 | 149 | let fetch_one = sqlx::query_as(INSERT_QUERY) 150 | .bind(username) 151 | .bind(hashed_password) 152 | .fetch_one(database) 153 | .await; 154 | 155 | let user_id: i32 = match fetch_one { 156 | Ok((user_id,)) => user_id, 157 | Err(sqlx::Error::Database(database)) 158 | if database.constraint() == Some("users_username_key") => 159 | { 160 | return Err(SignupError::UsernameExists); 161 | } 162 | Err(_err) => { 163 | return Err(SignupError::InternalError); 164 | } 165 | }; 166 | 167 | Ok(new_session(database, random, user_id).await) 168 | } 169 | 170 | pub(crate) async fn login( 171 | database: &Database, 172 | random: Random, 173 | username: &str, 174 | password: &str, 175 | ) -> Result { 176 | const LOGIN_QUERY: &str = "SELECT id, password FROM users WHERE users.username = $1;"; 177 | 178 | let row: Option<(i32, String)> = sqlx::query_as(LOGIN_QUERY) 179 | .bind(username) 180 | .fetch_optional(database) 181 | .await 182 | .unwrap(); 183 | 184 | let (user_id, hashed_password) = if let Some(row) = row { 185 | row 186 | } else { 187 | return Err(LoginError::UserDoesNotExist); 188 | }; 189 | 190 | // Verify password against PHC string 191 | let parsed_hash = PasswordHash::new(&hashed_password).unwrap(); 192 | if let Err(_err) = Pbkdf2.verify_password(password.as_bytes(), &parsed_hash) { 193 | return Err(LoginError::WrongPassword); 194 | } 195 | 196 | Ok(new_session(database, random, user_id).await) 197 | } 198 | 199 | pub(crate) async fn delete_user(auth_state: AuthState) { 200 | const DELETE_QUERY: &str = "DELETE FROM users 201 | WHERE users.id = ( 202 | SELECT user_id FROM sessions WHERE sessions.session_token = $1 203 | );"; 204 | 205 | let auth_state = auth_state.0.unwrap(); 206 | let _res = sqlx::query(DELETE_QUERY) 207 | .bind(&auth_state.0.into_database_value()) 208 | .execute(&auth_state.2) 209 | .await 210 | .unwrap(); 211 | } 212 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod authentication; 2 | mod errors; 3 | mod utils; 4 | 5 | use std::sync::{Arc, Mutex}; 6 | use sqlx::Postgres; 7 | 8 | use axum::{ 9 | extract::{Extension, Multipart, Path}, 10 | middleware, 11 | response::{Html, IntoResponse, Redirect}, 12 | routing::{any, get, post}, 13 | Router, 14 | }; 15 | use http::Response; 16 | 17 | use authentication::{auth, delete_user, login, signup, AuthState}; 18 | use errors::{LoginError, NoUser, NotLoggedIn, SignupError}; 19 | use pbkdf2::password_hash::rand_core::OsRng; 20 | use rand_chacha::ChaCha8Rng; 21 | use rand_core::{RngCore, SeedableRng}; 22 | use shuttle_service::{error::CustomError}; 23 | use shuttle_axum::ShuttleAxum; 24 | use sqlx::Executor; 25 | use tera::{Context, Tera}; 26 | use utils::*; 27 | 28 | use sqlx::PgPool; 29 | type Templates = Arc; 30 | type Database = sqlx::PgPool; 31 | type Random = Arc>; 32 | 33 | const USER_COOKIE_NAME: &str = "user_token"; 34 | const COOKIE_MAX_AGE: &str = "9999999"; 35 | 36 | 37 | #[shuttle_runtime::main] 38 | async fn server( 39 | #[shuttle_shared_db::Postgres] pool: PgPool 40 | ) -> ShuttleAxum { 41 | pool.execute(include_str!("../schema.sql")) 42 | .await 43 | .map_err(CustomError::new)?; 44 | 45 | Ok(get_router(pool).into()) 46 | } 47 | 48 | 49 | pub fn get_router(database: Database) -> Router { 50 | let mut tera = Tera::default(); 51 | tera.add_raw_templates(vec![ 52 | ("base.html", include_str!("../templates/base.html")), 53 | ("index", include_str!("../templates/index.html")), 54 | ("signup", include_str!("../templates/signup.html")), 55 | ("login", include_str!("../templates/login.html")), 56 | ("users", include_str!("../templates/users.html")), 57 | ("user", include_str!("../templates/user.html")), 58 | ]) 59 | .unwrap(); 60 | 61 | let middleware_database = database.clone(); 62 | let random = ChaCha8Rng::seed_from_u64(OsRng.next_u64()); 63 | 64 | Router::new() 65 | .route("/", get(index)) 66 | .route("/signup", get(get_signup).post(post_signup)) 67 | .route("/login", get(get_login).post(post_login)) 68 | .route("/logout", post(logout_response)) 69 | .route("/delete", post(post_delete)) 70 | .route("/me", get(me)) 71 | .route("/user/:username", get(user)) 72 | .route("/users", get(users)) 73 | .route("/styles.css", any(styles)) 74 | .layer(middleware::from_fn(move |req, next| { 75 | auth(req, next, middleware_database.clone()) 76 | })) 77 | .layer(Extension(Arc::new(tera))) 78 | .layer(Extension(database)) 79 | .layer(Extension(Arc::new(Mutex::new(random)))) 80 | } 81 | 82 | async fn index( 83 | Extension(current_user): Extension, 84 | Extension(templates): Extension, 85 | ) -> impl IntoResponse { 86 | let mut context = Context::new(); 87 | context.insert("logged_in", ¤t_user.logged_in()); 88 | context.insert("home_screen", &true); 89 | Html(templates.render("index", &context).unwrap()) 90 | } 91 | 92 | async fn user( 93 | Path(username): Path, 94 | Extension(mut auth_state): Extension, 95 | Extension(database): Extension, 96 | Extension(templates): Extension, 97 | ) -> impl IntoResponse { 98 | const QUERY: &str = "SELECT username FROM users WHERE username = $1;"; 99 | 100 | let user: Option<(String,)> = sqlx::query_as(QUERY) 101 | .bind(&username) 102 | .fetch_optional(&database) 103 | .await 104 | .unwrap(); 105 | 106 | if let Some((username,)) = user { 107 | let user_is_self = auth_state 108 | .get_user() 109 | .await 110 | .map(|logged_in_user| logged_in_user.username == username) 111 | .unwrap_or_default(); 112 | let mut context = Context::new(); 113 | context.insert("username", &username); 114 | context.insert("is_self", &user_is_self); 115 | Ok(Html(templates.render("user", &context).unwrap())) 116 | } else { 117 | Err(error_page(&NoUser(username))) 118 | } 119 | } 120 | 121 | async fn get_signup(Extension(templates): Extension) -> impl IntoResponse { 122 | Html(templates.render("signup", &Context::new()).unwrap()) 123 | } 124 | 125 | async fn get_login(Extension(templates): Extension) -> impl IntoResponse { 126 | Html(templates.render("login", &Context::new()).unwrap()) 127 | } 128 | 129 | async fn post_signup( 130 | Extension(database): Extension, 131 | Extension(random): Extension, 132 | multipart: Multipart, 133 | ) -> impl IntoResponse { 134 | let data = parse_multipart(multipart) 135 | .await 136 | .map_err(|err| error_page(&err))?; 137 | 138 | if let (Some(username), Some(password), Some(confirm_password)) = ( 139 | data.get("username"), 140 | data.get("password"), 141 | data.get("confirm_password"), 142 | ) { 143 | if password != confirm_password { 144 | return Err(error_page(&SignupError::PasswordsDoNotMatch)); 145 | } 146 | 147 | match signup(&database, random, username, password).await { 148 | Ok(session_token) => Ok(login_response(session_token)), 149 | Err(error) => Err(error_page(&error)), 150 | } 151 | } else { 152 | Err(error_page(&SignupError::MissingDetails)) 153 | } 154 | } 155 | 156 | async fn post_login( 157 | Extension(database): Extension, 158 | Extension(random): Extension, 159 | multipart: Multipart, 160 | ) -> impl IntoResponse { 161 | let data = parse_multipart(multipart) 162 | .await 163 | .map_err(|err| error_page(&err))?; 164 | 165 | if let (Some(username), Some(password)) = (data.get("username"), data.get("password")) { 166 | match login(&database, random, username, password).await { 167 | Ok(session_token) => Ok(login_response(session_token)), 168 | Err(err) => Err(error_page(&err)), 169 | } 170 | } else { 171 | Err(error_page(&LoginError::MissingDetails)) 172 | } 173 | } 174 | 175 | async fn post_delete(Extension(current_user): Extension) -> impl IntoResponse { 176 | if !current_user.logged_in() { 177 | return Err(error_page(&NotLoggedIn)); 178 | } 179 | 180 | delete_user(current_user).await; 181 | 182 | Ok(logout_response().await) 183 | } 184 | 185 | async fn styles() -> impl IntoResponse { 186 | Response::builder() 187 | .status(http::StatusCode::OK) 188 | .header("Content-Type", "text/css") 189 | .body(include_str!("../public/styles.css").to_owned()) 190 | .unwrap() 191 | } 192 | 193 | async fn me( 194 | Extension(mut current_user): Extension, 195 | ) -> Result { 196 | if let Some(user) = current_user.get_user().await { 197 | Ok(Redirect::to(&format!("/user/{}", user.username))) 198 | } else { 199 | Err(error_page(&NotLoggedIn)) 200 | } 201 | } 202 | 203 | async fn users( 204 | Extension(database): Extension, 205 | Extension(templates): Extension, 206 | ) -> impl IntoResponse { 207 | const QUERY: &str = "SELECT username FROM users LIMIT 100;"; 208 | 209 | let users: Vec<(String,)> = sqlx::query_as(QUERY).fetch_all(&database).await.unwrap(); 210 | 211 | // This should be a no op right :) 212 | let users = users.into_iter().map(|(value,)| value).collect::>(); 213 | 214 | let mut context = Context::new(); 215 | context.insert("users", &users); 216 | 217 | Html(templates.render("users", &context).unwrap()) 218 | } 219 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "ahash" 22 | version = "0.7.6" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 25 | dependencies = [ 26 | "getrandom", 27 | "once_cell", 28 | "version_check", 29 | ] 30 | 31 | [[package]] 32 | name = "ahash" 33 | version = "0.8.3" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" 36 | dependencies = [ 37 | "cfg-if", 38 | "getrandom", 39 | "once_cell", 40 | "version_check", 41 | ] 42 | 43 | [[package]] 44 | name = "aho-corasick" 45 | version = "1.0.4" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" 48 | dependencies = [ 49 | "memchr", 50 | ] 51 | 52 | [[package]] 53 | name = "android-tzdata" 54 | version = "0.1.1" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 57 | 58 | [[package]] 59 | name = "android_system_properties" 60 | version = "0.1.5" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 63 | dependencies = [ 64 | "libc", 65 | ] 66 | 67 | [[package]] 68 | name = "anyhow" 69 | version = "1.0.75" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" 72 | 73 | [[package]] 74 | name = "arrayvec" 75 | version = "0.7.4" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 78 | 79 | [[package]] 80 | name = "async-stream" 81 | version = "0.3.5" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" 84 | dependencies = [ 85 | "async-stream-impl", 86 | "futures-core", 87 | "pin-project-lite", 88 | ] 89 | 90 | [[package]] 91 | name = "async-stream-impl" 92 | version = "0.3.5" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" 95 | dependencies = [ 96 | "proc-macro2", 97 | "quote", 98 | "syn 2.0.29", 99 | ] 100 | 101 | [[package]] 102 | name = "async-trait" 103 | version = "0.1.73" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" 106 | dependencies = [ 107 | "proc-macro2", 108 | "quote", 109 | "syn 2.0.29", 110 | ] 111 | 112 | [[package]] 113 | name = "atoi" 114 | version = "2.0.0" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 117 | dependencies = [ 118 | "num-traits", 119 | ] 120 | 121 | [[package]] 122 | name = "autocfg" 123 | version = "1.1.0" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 126 | 127 | [[package]] 128 | name = "axum" 129 | version = "0.6.20" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" 132 | dependencies = [ 133 | "async-trait", 134 | "axum-core", 135 | "bitflags 1.3.2", 136 | "bytes", 137 | "futures-util", 138 | "http", 139 | "http-body", 140 | "hyper", 141 | "itoa", 142 | "matchit", 143 | "memchr", 144 | "mime", 145 | "multer", 146 | "percent-encoding", 147 | "pin-project-lite", 148 | "rustversion", 149 | "serde", 150 | "serde_json", 151 | "serde_path_to_error", 152 | "serde_urlencoded", 153 | "sync_wrapper", 154 | "tokio", 155 | "tower", 156 | "tower-layer", 157 | "tower-service", 158 | ] 159 | 160 | [[package]] 161 | name = "axum-core" 162 | version = "0.3.4" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" 165 | dependencies = [ 166 | "async-trait", 167 | "bytes", 168 | "futures-util", 169 | "http", 170 | "http-body", 171 | "mime", 172 | "rustversion", 173 | "tower-layer", 174 | "tower-service", 175 | ] 176 | 177 | [[package]] 178 | name = "backtrace" 179 | version = "0.3.69" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 182 | dependencies = [ 183 | "addr2line", 184 | "cc", 185 | "cfg-if", 186 | "libc", 187 | "miniz_oxide", 188 | "object", 189 | "rustc-demangle", 190 | ] 191 | 192 | [[package]] 193 | name = "base64" 194 | version = "0.13.0" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 197 | 198 | [[package]] 199 | name = "base64" 200 | version = "0.21.2" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" 203 | 204 | [[package]] 205 | name = "base64ct" 206 | version = "1.5.2" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474" 209 | 210 | [[package]] 211 | name = "bitflags" 212 | version = "1.3.2" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 215 | 216 | [[package]] 217 | name = "bitflags" 218 | version = "2.4.0" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" 221 | dependencies = [ 222 | "serde", 223 | ] 224 | 225 | [[package]] 226 | name = "block-buffer" 227 | version = "0.10.3" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 230 | dependencies = [ 231 | "generic-array", 232 | ] 233 | 234 | [[package]] 235 | name = "bstr" 236 | version = "1.6.0" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" 239 | dependencies = [ 240 | "memchr", 241 | "serde", 242 | ] 243 | 244 | [[package]] 245 | name = "bumpalo" 246 | version = "3.11.0" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" 249 | 250 | [[package]] 251 | name = "byteorder" 252 | version = "1.4.3" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 255 | 256 | [[package]] 257 | name = "bytes" 258 | version = "1.4.0" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 261 | 262 | [[package]] 263 | name = "cc" 264 | version = "1.0.73" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 267 | 268 | [[package]] 269 | name = "cfg-if" 270 | version = "1.0.0" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 273 | 274 | [[package]] 275 | name = "chrono" 276 | version = "0.4.26" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" 279 | dependencies = [ 280 | "android-tzdata", 281 | "iana-time-zone", 282 | "num-traits", 283 | "serde", 284 | "winapi", 285 | ] 286 | 287 | [[package]] 288 | name = "chrono-tz" 289 | version = "0.6.1" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "58549f1842da3080ce63002102d5bc954c7bc843d4f47818e642abdc36253552" 292 | dependencies = [ 293 | "chrono", 294 | "chrono-tz-build", 295 | "phf", 296 | ] 297 | 298 | [[package]] 299 | name = "chrono-tz-build" 300 | version = "0.0.2" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "db058d493fb2f65f41861bfed7e3fe6335264a9f0f92710cab5bdf01fef09069" 303 | dependencies = [ 304 | "parse-zoneinfo", 305 | "phf", 306 | "phf_codegen", 307 | ] 308 | 309 | [[package]] 310 | name = "codespan-reporting" 311 | version = "0.11.1" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 314 | dependencies = [ 315 | "termcolor", 316 | "unicode-width", 317 | ] 318 | 319 | [[package]] 320 | name = "const-oid" 321 | version = "0.9.5" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" 324 | 325 | [[package]] 326 | name = "cookie" 327 | version = "0.17.0" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" 330 | dependencies = [ 331 | "time", 332 | "version_check", 333 | ] 334 | 335 | [[package]] 336 | name = "core-foundation" 337 | version = "0.9.3" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 340 | dependencies = [ 341 | "core-foundation-sys", 342 | "libc", 343 | ] 344 | 345 | [[package]] 346 | name = "core-foundation-sys" 347 | version = "0.8.3" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 350 | 351 | [[package]] 352 | name = "cpufeatures" 353 | version = "0.2.5" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 356 | dependencies = [ 357 | "libc", 358 | ] 359 | 360 | [[package]] 361 | name = "crc" 362 | version = "3.0.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" 365 | dependencies = [ 366 | "crc-catalog", 367 | ] 368 | 369 | [[package]] 370 | name = "crc-catalog" 371 | version = "2.1.0" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" 374 | 375 | [[package]] 376 | name = "crossbeam-channel" 377 | version = "0.5.6" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 380 | dependencies = [ 381 | "cfg-if", 382 | "crossbeam-utils", 383 | ] 384 | 385 | [[package]] 386 | name = "crossbeam-queue" 387 | version = "0.3.6" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" 390 | dependencies = [ 391 | "cfg-if", 392 | "crossbeam-utils", 393 | ] 394 | 395 | [[package]] 396 | name = "crossbeam-utils" 397 | version = "0.8.12" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" 400 | dependencies = [ 401 | "cfg-if", 402 | ] 403 | 404 | [[package]] 405 | name = "crypto-common" 406 | version = "0.1.6" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 409 | dependencies = [ 410 | "generic-array", 411 | "typenum", 412 | ] 413 | 414 | [[package]] 415 | name = "cxx" 416 | version = "1.0.79" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "3f83d0ebf42c6eafb8d7c52f7e5f2d3003b89c7aa4fd2b79229209459a849af8" 419 | dependencies = [ 420 | "cc", 421 | "cxxbridge-flags", 422 | "cxxbridge-macro", 423 | "link-cplusplus", 424 | ] 425 | 426 | [[package]] 427 | name = "cxx-build" 428 | version = "1.0.79" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "07d050484b55975889284352b0ffc2ecbda25c0c55978017c132b29ba0818a86" 431 | dependencies = [ 432 | "cc", 433 | "codespan-reporting", 434 | "once_cell", 435 | "proc-macro2", 436 | "quote", 437 | "scratch", 438 | "syn 1.0.102", 439 | ] 440 | 441 | [[package]] 442 | name = "cxxbridge-flags" 443 | version = "1.0.79" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "99d2199b00553eda8012dfec8d3b1c75fce747cf27c169a270b3b99e3448ab78" 446 | 447 | [[package]] 448 | name = "cxxbridge-macro" 449 | version = "1.0.79" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "dcb67a6de1f602736dd7eaead0080cf3435df806c61b24b13328db128c58868f" 452 | dependencies = [ 453 | "proc-macro2", 454 | "quote", 455 | "syn 1.0.102", 456 | ] 457 | 458 | [[package]] 459 | name = "dashmap" 460 | version = "5.4.0" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" 463 | dependencies = [ 464 | "cfg-if", 465 | "hashbrown 0.12.3", 466 | "lock_api", 467 | "once_cell", 468 | "parking_lot_core", 469 | ] 470 | 471 | [[package]] 472 | name = "der" 473 | version = "0.7.8" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" 476 | dependencies = [ 477 | "const-oid", 478 | "pem-rfc7468", 479 | "zeroize", 480 | ] 481 | 482 | [[package]] 483 | name = "deunicode" 484 | version = "0.4.4" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "d95203a6a50906215a502507c0f879a0ce7ff205a6111e2db2a5ef8e4bb92e43" 487 | 488 | [[package]] 489 | name = "digest" 490 | version = "0.10.7" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 493 | dependencies = [ 494 | "block-buffer", 495 | "const-oid", 496 | "crypto-common", 497 | "subtle", 498 | ] 499 | 500 | [[package]] 501 | name = "doc-comment" 502 | version = "0.3.3" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" 505 | 506 | [[package]] 507 | name = "dotenvy" 508 | version = "0.15.6" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" 511 | 512 | [[package]] 513 | name = "either" 514 | version = "1.8.0" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 517 | dependencies = [ 518 | "serde", 519 | ] 520 | 521 | [[package]] 522 | name = "encoding_rs" 523 | version = "0.8.33" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 526 | dependencies = [ 527 | "cfg-if", 528 | ] 529 | 530 | [[package]] 531 | name = "equivalent" 532 | version = "1.0.1" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 535 | 536 | [[package]] 537 | name = "etcetera" 538 | version = "0.8.0" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 541 | dependencies = [ 542 | "cfg-if", 543 | "home", 544 | "windows-sys", 545 | ] 546 | 547 | [[package]] 548 | name = "event-listener" 549 | version = "2.5.3" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 552 | 553 | [[package]] 554 | name = "fastrand" 555 | version = "1.8.0" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 558 | dependencies = [ 559 | "instant", 560 | ] 561 | 562 | [[package]] 563 | name = "finl_unicode" 564 | version = "1.2.0" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" 567 | 568 | [[package]] 569 | name = "flume" 570 | version = "0.10.14" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" 573 | dependencies = [ 574 | "futures-core", 575 | "futures-sink", 576 | "pin-project", 577 | "spin 0.9.4", 578 | ] 579 | 580 | [[package]] 581 | name = "fnv" 582 | version = "1.0.7" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 585 | 586 | [[package]] 587 | name = "foreign-types" 588 | version = "0.3.2" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 591 | dependencies = [ 592 | "foreign-types-shared", 593 | ] 594 | 595 | [[package]] 596 | name = "foreign-types-shared" 597 | version = "0.1.1" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 600 | 601 | [[package]] 602 | name = "form_urlencoded" 603 | version = "1.1.0" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 606 | dependencies = [ 607 | "percent-encoding", 608 | ] 609 | 610 | [[package]] 611 | name = "futures" 612 | version = "0.3.24" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" 615 | dependencies = [ 616 | "futures-channel", 617 | "futures-core", 618 | "futures-io", 619 | "futures-sink", 620 | "futures-task", 621 | "futures-util", 622 | ] 623 | 624 | [[package]] 625 | name = "futures-channel" 626 | version = "0.3.24" 627 | source = "registry+https://github.com/rust-lang/crates.io-index" 628 | checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" 629 | dependencies = [ 630 | "futures-core", 631 | "futures-sink", 632 | ] 633 | 634 | [[package]] 635 | name = "futures-core" 636 | version = "0.3.24" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" 639 | 640 | [[package]] 641 | name = "futures-executor" 642 | version = "0.3.24" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" 645 | dependencies = [ 646 | "futures-core", 647 | "futures-task", 648 | "futures-util", 649 | ] 650 | 651 | [[package]] 652 | name = "futures-intrusive" 653 | version = "0.5.0" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 656 | dependencies = [ 657 | "futures-core", 658 | "lock_api", 659 | "parking_lot", 660 | ] 661 | 662 | [[package]] 663 | name = "futures-io" 664 | version = "0.3.24" 665 | source = "registry+https://github.com/rust-lang/crates.io-index" 666 | checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" 667 | 668 | [[package]] 669 | name = "futures-macro" 670 | version = "0.3.24" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" 673 | dependencies = [ 674 | "proc-macro2", 675 | "quote", 676 | "syn 1.0.102", 677 | ] 678 | 679 | [[package]] 680 | name = "futures-sink" 681 | version = "0.3.24" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" 684 | 685 | [[package]] 686 | name = "futures-task" 687 | version = "0.3.24" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" 690 | 691 | [[package]] 692 | name = "futures-util" 693 | version = "0.3.24" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" 696 | dependencies = [ 697 | "futures-channel", 698 | "futures-core", 699 | "futures-io", 700 | "futures-macro", 701 | "futures-sink", 702 | "futures-task", 703 | "memchr", 704 | "pin-project-lite", 705 | "pin-utils", 706 | "slab", 707 | ] 708 | 709 | [[package]] 710 | name = "generic-array" 711 | version = "0.14.6" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 714 | dependencies = [ 715 | "typenum", 716 | "version_check", 717 | ] 718 | 719 | [[package]] 720 | name = "getrandom" 721 | version = "0.2.7" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 724 | dependencies = [ 725 | "cfg-if", 726 | "libc", 727 | "wasi", 728 | ] 729 | 730 | [[package]] 731 | name = "gimli" 732 | version = "0.28.0" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" 735 | 736 | [[package]] 737 | name = "globset" 738 | version = "0.4.13" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" 741 | dependencies = [ 742 | "aho-corasick", 743 | "bstr", 744 | "fnv", 745 | "log", 746 | "regex", 747 | ] 748 | 749 | [[package]] 750 | name = "globwalk" 751 | version = "0.8.1" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" 754 | dependencies = [ 755 | "bitflags 1.3.2", 756 | "ignore", 757 | "walkdir", 758 | ] 759 | 760 | [[package]] 761 | name = "h2" 762 | version = "0.3.21" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" 765 | dependencies = [ 766 | "bytes", 767 | "fnv", 768 | "futures-core", 769 | "futures-sink", 770 | "futures-util", 771 | "http", 772 | "indexmap 1.9.1", 773 | "slab", 774 | "tokio", 775 | "tokio-util", 776 | "tracing", 777 | ] 778 | 779 | [[package]] 780 | name = "hashbrown" 781 | version = "0.12.3" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 784 | dependencies = [ 785 | "ahash 0.7.6", 786 | ] 787 | 788 | [[package]] 789 | name = "hashbrown" 790 | version = "0.14.0" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" 793 | 794 | [[package]] 795 | name = "hashlink" 796 | version = "0.8.1" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" 799 | dependencies = [ 800 | "hashbrown 0.12.3", 801 | ] 802 | 803 | [[package]] 804 | name = "headers" 805 | version = "0.3.8" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" 808 | dependencies = [ 809 | "base64 0.13.0", 810 | "bitflags 1.3.2", 811 | "bytes", 812 | "headers-core", 813 | "http", 814 | "httpdate", 815 | "mime", 816 | "sha1", 817 | ] 818 | 819 | [[package]] 820 | name = "headers-core" 821 | version = "0.2.0" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 824 | dependencies = [ 825 | "http", 826 | ] 827 | 828 | [[package]] 829 | name = "heck" 830 | version = "0.4.0" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 833 | dependencies = [ 834 | "unicode-segmentation", 835 | ] 836 | 837 | [[package]] 838 | name = "hermit-abi" 839 | version = "0.1.19" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 842 | dependencies = [ 843 | "libc", 844 | ] 845 | 846 | [[package]] 847 | name = "hex" 848 | version = "0.4.3" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 851 | 852 | [[package]] 853 | name = "hkdf" 854 | version = "0.12.3" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" 857 | dependencies = [ 858 | "hmac", 859 | ] 860 | 861 | [[package]] 862 | name = "hmac" 863 | version = "0.12.1" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 866 | dependencies = [ 867 | "digest", 868 | ] 869 | 870 | [[package]] 871 | name = "home" 872 | version = "0.5.5" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" 875 | dependencies = [ 876 | "windows-sys", 877 | ] 878 | 879 | [[package]] 880 | name = "http" 881 | version = "0.2.9" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 884 | dependencies = [ 885 | "bytes", 886 | "fnv", 887 | "itoa", 888 | ] 889 | 890 | [[package]] 891 | name = "http-body" 892 | version = "0.4.5" 893 | source = "registry+https://github.com/rust-lang/crates.io-index" 894 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 895 | dependencies = [ 896 | "bytes", 897 | "http", 898 | "pin-project-lite", 899 | ] 900 | 901 | [[package]] 902 | name = "http-range-header" 903 | version = "0.3.0" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" 906 | 907 | [[package]] 908 | name = "http-serde" 909 | version = "1.1.3" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "6f560b665ad9f1572cfcaf034f7fb84338a7ce945216d64a90fd81f046a3caee" 912 | dependencies = [ 913 | "http", 914 | "serde", 915 | ] 916 | 917 | [[package]] 918 | name = "httparse" 919 | version = "1.8.0" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 922 | 923 | [[package]] 924 | name = "httpdate" 925 | version = "1.0.2" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 928 | 929 | [[package]] 930 | name = "humansize" 931 | version = "2.1.3" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" 934 | dependencies = [ 935 | "libm", 936 | ] 937 | 938 | [[package]] 939 | name = "hyper" 940 | version = "0.14.27" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" 943 | dependencies = [ 944 | "bytes", 945 | "futures-channel", 946 | "futures-core", 947 | "futures-util", 948 | "h2", 949 | "http", 950 | "http-body", 951 | "httparse", 952 | "httpdate", 953 | "itoa", 954 | "pin-project-lite", 955 | "socket2 0.4.7", 956 | "tokio", 957 | "tower-service", 958 | "tracing", 959 | "want", 960 | ] 961 | 962 | [[package]] 963 | name = "hyper-timeout" 964 | version = "0.4.1" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" 967 | dependencies = [ 968 | "hyper", 969 | "pin-project-lite", 970 | "tokio", 971 | "tokio-io-timeout", 972 | ] 973 | 974 | [[package]] 975 | name = "iana-time-zone" 976 | version = "0.1.51" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed" 979 | dependencies = [ 980 | "android_system_properties", 981 | "core-foundation-sys", 982 | "iana-time-zone-haiku", 983 | "js-sys", 984 | "wasm-bindgen", 985 | "winapi", 986 | ] 987 | 988 | [[package]] 989 | name = "iana-time-zone-haiku" 990 | version = "0.1.1" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" 993 | dependencies = [ 994 | "cxx", 995 | "cxx-build", 996 | ] 997 | 998 | [[package]] 999 | name = "idna" 1000 | version = "0.3.0" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 1003 | dependencies = [ 1004 | "unicode-bidi", 1005 | "unicode-normalization", 1006 | ] 1007 | 1008 | [[package]] 1009 | name = "ignore" 1010 | version = "0.4.20" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" 1013 | dependencies = [ 1014 | "globset", 1015 | "lazy_static", 1016 | "log", 1017 | "memchr", 1018 | "regex", 1019 | "same-file", 1020 | "thread_local", 1021 | "walkdir", 1022 | "winapi-util", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "indexmap" 1027 | version = "1.9.1" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 1030 | dependencies = [ 1031 | "autocfg", 1032 | "hashbrown 0.12.3", 1033 | ] 1034 | 1035 | [[package]] 1036 | name = "indexmap" 1037 | version = "2.0.0" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" 1040 | dependencies = [ 1041 | "equivalent", 1042 | "hashbrown 0.14.0", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "instant" 1047 | version = "0.1.12" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1050 | dependencies = [ 1051 | "cfg-if", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "itertools" 1056 | version = "0.10.5" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1059 | dependencies = [ 1060 | "either", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "itoa" 1065 | version = "1.0.9" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 1068 | 1069 | [[package]] 1070 | name = "js-sys" 1071 | version = "0.3.60" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" 1074 | dependencies = [ 1075 | "wasm-bindgen", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "jsonwebtoken" 1080 | version = "8.3.0" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" 1083 | dependencies = [ 1084 | "base64 0.21.2", 1085 | "pem", 1086 | "ring", 1087 | "serde", 1088 | "serde_json", 1089 | "simple_asn1", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "lazy_static" 1094 | version = "1.4.0" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1097 | dependencies = [ 1098 | "spin 0.5.2", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "libc" 1103 | version = "0.2.147" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" 1106 | 1107 | [[package]] 1108 | name = "libm" 1109 | version = "0.2.7" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" 1112 | 1113 | [[package]] 1114 | name = "libsqlite3-sys" 1115 | version = "0.26.0" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" 1118 | dependencies = [ 1119 | "cc", 1120 | "pkg-config", 1121 | "vcpkg", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "link-cplusplus" 1126 | version = "1.0.7" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" 1129 | dependencies = [ 1130 | "cc", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "linked-hash-map" 1135 | version = "0.5.6" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1138 | 1139 | [[package]] 1140 | name = "lock_api" 1141 | version = "0.4.9" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 1144 | dependencies = [ 1145 | "autocfg", 1146 | "scopeguard", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "log" 1151 | version = "0.4.17" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1154 | dependencies = [ 1155 | "cfg-if", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "matchers" 1160 | version = "0.1.0" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1163 | dependencies = [ 1164 | "regex-automata 0.1.10", 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "matchit" 1169 | version = "0.7.2" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" 1172 | 1173 | [[package]] 1174 | name = "md-5" 1175 | version = "0.10.5" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" 1178 | dependencies = [ 1179 | "digest", 1180 | ] 1181 | 1182 | [[package]] 1183 | name = "memchr" 1184 | version = "2.5.0" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1187 | 1188 | [[package]] 1189 | name = "mime" 1190 | version = "0.3.16" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1193 | 1194 | [[package]] 1195 | name = "minimal-lexical" 1196 | version = "0.2.1" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1199 | 1200 | [[package]] 1201 | name = "miniz_oxide" 1202 | version = "0.7.1" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1205 | dependencies = [ 1206 | "adler", 1207 | ] 1208 | 1209 | [[package]] 1210 | name = "mio" 1211 | version = "0.8.8" 1212 | source = "registry+https://github.com/rust-lang/crates.io-index" 1213 | checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" 1214 | dependencies = [ 1215 | "libc", 1216 | "wasi", 1217 | "windows-sys", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "multer" 1222 | version = "2.1.0" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" 1225 | dependencies = [ 1226 | "bytes", 1227 | "encoding_rs", 1228 | "futures-util", 1229 | "http", 1230 | "httparse", 1231 | "log", 1232 | "memchr", 1233 | "mime", 1234 | "spin 0.9.4", 1235 | "version_check", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "native-tls" 1240 | version = "0.2.11" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1243 | dependencies = [ 1244 | "lazy_static", 1245 | "libc", 1246 | "log", 1247 | "openssl", 1248 | "openssl-probe", 1249 | "openssl-sys", 1250 | "schannel", 1251 | "security-framework", 1252 | "security-framework-sys", 1253 | "tempfile", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "nom" 1258 | version = "7.1.1" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" 1261 | dependencies = [ 1262 | "memchr", 1263 | "minimal-lexical", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "nu-ansi-term" 1268 | version = "0.46.0" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1271 | dependencies = [ 1272 | "overload", 1273 | "winapi", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "num-bigint" 1278 | version = "0.4.3" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" 1281 | dependencies = [ 1282 | "autocfg", 1283 | "num-integer", 1284 | "num-traits", 1285 | ] 1286 | 1287 | [[package]] 1288 | name = "num-bigint-dig" 1289 | version = "0.8.4" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1292 | dependencies = [ 1293 | "byteorder", 1294 | "lazy_static", 1295 | "libm", 1296 | "num-integer", 1297 | "num-iter", 1298 | "num-traits", 1299 | "rand", 1300 | "smallvec", 1301 | "zeroize", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "num-integer" 1306 | version = "0.1.45" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1309 | dependencies = [ 1310 | "autocfg", 1311 | "num-traits", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "num-iter" 1316 | version = "0.1.43" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" 1319 | dependencies = [ 1320 | "autocfg", 1321 | "num-integer", 1322 | "num-traits", 1323 | ] 1324 | 1325 | [[package]] 1326 | name = "num-traits" 1327 | version = "0.2.15" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1330 | dependencies = [ 1331 | "autocfg", 1332 | "libm", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "num_cpus" 1337 | version = "1.13.1" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1340 | dependencies = [ 1341 | "hermit-abi", 1342 | "libc", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "num_threads" 1347 | version = "0.1.6" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" 1350 | dependencies = [ 1351 | "libc", 1352 | ] 1353 | 1354 | [[package]] 1355 | name = "object" 1356 | version = "0.32.0" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" 1359 | dependencies = [ 1360 | "memchr", 1361 | ] 1362 | 1363 | [[package]] 1364 | name = "once_cell" 1365 | version = "1.18.0" 1366 | source = "registry+https://github.com/rust-lang/crates.io-index" 1367 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 1368 | 1369 | [[package]] 1370 | name = "openssl" 1371 | version = "0.10.56" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" 1374 | dependencies = [ 1375 | "bitflags 1.3.2", 1376 | "cfg-if", 1377 | "foreign-types", 1378 | "libc", 1379 | "once_cell", 1380 | "openssl-macros", 1381 | "openssl-sys", 1382 | ] 1383 | 1384 | [[package]] 1385 | name = "openssl-macros" 1386 | version = "0.1.1" 1387 | source = "registry+https://github.com/rust-lang/crates.io-index" 1388 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1389 | dependencies = [ 1390 | "proc-macro2", 1391 | "quote", 1392 | "syn 2.0.29", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "openssl-probe" 1397 | version = "0.1.5" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1400 | 1401 | [[package]] 1402 | name = "openssl-sys" 1403 | version = "0.9.91" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" 1406 | dependencies = [ 1407 | "cc", 1408 | "libc", 1409 | "pkg-config", 1410 | "vcpkg", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "opentelemetry" 1415 | version = "0.19.0" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" 1418 | dependencies = [ 1419 | "opentelemetry_api", 1420 | "opentelemetry_sdk", 1421 | ] 1422 | 1423 | [[package]] 1424 | name = "opentelemetry-http" 1425 | version = "0.8.0" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "a819b71d6530c4297b49b3cae2939ab3a8cc1b9f382826a1bc29dd0ca3864906" 1428 | dependencies = [ 1429 | "async-trait", 1430 | "bytes", 1431 | "http", 1432 | "opentelemetry_api", 1433 | ] 1434 | 1435 | [[package]] 1436 | name = "opentelemetry-otlp" 1437 | version = "0.12.0" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "8af72d59a4484654ea8eb183fea5ae4eb6a41d7ac3e3bae5f4d2a282a3a7d3ca" 1440 | dependencies = [ 1441 | "async-trait", 1442 | "futures", 1443 | "futures-util", 1444 | "http", 1445 | "opentelemetry", 1446 | "opentelemetry-proto", 1447 | "prost", 1448 | "thiserror", 1449 | "tokio", 1450 | "tonic", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "opentelemetry-proto" 1455 | version = "0.2.0" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "045f8eea8c0fa19f7d48e7bc3128a39c2e5c533d5c61298c548dfefc1064474c" 1458 | dependencies = [ 1459 | "futures", 1460 | "futures-util", 1461 | "opentelemetry", 1462 | "prost", 1463 | "tonic", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "opentelemetry_api" 1468 | version = "0.19.0" 1469 | source = "registry+https://github.com/rust-lang/crates.io-index" 1470 | checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" 1471 | dependencies = [ 1472 | "fnv", 1473 | "futures-channel", 1474 | "futures-util", 1475 | "indexmap 1.9.1", 1476 | "once_cell", 1477 | "pin-project-lite", 1478 | "thiserror", 1479 | "urlencoding", 1480 | ] 1481 | 1482 | [[package]] 1483 | name = "opentelemetry_sdk" 1484 | version = "0.19.0" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "8b3a2a91fdbfdd4d212c0dcc2ab540de2c2bcbbd90be17de7a7daf8822d010c1" 1487 | dependencies = [ 1488 | "async-trait", 1489 | "crossbeam-channel", 1490 | "dashmap", 1491 | "fnv", 1492 | "futures-channel", 1493 | "futures-executor", 1494 | "futures-util", 1495 | "once_cell", 1496 | "opentelemetry_api", 1497 | "percent-encoding", 1498 | "rand", 1499 | "thiserror", 1500 | "tokio", 1501 | "tokio-stream", 1502 | ] 1503 | 1504 | [[package]] 1505 | name = "overload" 1506 | version = "0.1.1" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1509 | 1510 | [[package]] 1511 | name = "parking_lot" 1512 | version = "0.12.1" 1513 | source = "registry+https://github.com/rust-lang/crates.io-index" 1514 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1515 | dependencies = [ 1516 | "lock_api", 1517 | "parking_lot_core", 1518 | ] 1519 | 1520 | [[package]] 1521 | name = "parking_lot_core" 1522 | version = "0.9.8" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" 1525 | dependencies = [ 1526 | "cfg-if", 1527 | "libc", 1528 | "redox_syscall 0.3.5", 1529 | "smallvec", 1530 | "windows-targets", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "parse-zoneinfo" 1535 | version = "0.3.0" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" 1538 | dependencies = [ 1539 | "regex", 1540 | ] 1541 | 1542 | [[package]] 1543 | name = "password-hash" 1544 | version = "0.5.0" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" 1547 | dependencies = [ 1548 | "base64ct", 1549 | "rand_core", 1550 | "subtle", 1551 | ] 1552 | 1553 | [[package]] 1554 | name = "paste" 1555 | version = "1.0.9" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" 1558 | 1559 | [[package]] 1560 | name = "pbkdf2" 1561 | version = "0.12.2" 1562 | source = "registry+https://github.com/rust-lang/crates.io-index" 1563 | checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" 1564 | dependencies = [ 1565 | "digest", 1566 | "hmac", 1567 | "password-hash", 1568 | "sha2", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "pem" 1573 | version = "1.1.1" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" 1576 | dependencies = [ 1577 | "base64 0.13.0", 1578 | ] 1579 | 1580 | [[package]] 1581 | name = "pem-rfc7468" 1582 | version = "0.7.0" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1585 | dependencies = [ 1586 | "base64ct", 1587 | ] 1588 | 1589 | [[package]] 1590 | name = "percent-encoding" 1591 | version = "2.2.0" 1592 | source = "registry+https://github.com/rust-lang/crates.io-index" 1593 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 1594 | 1595 | [[package]] 1596 | name = "pest" 1597 | version = "2.7.2" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" 1600 | dependencies = [ 1601 | "thiserror", 1602 | "ucd-trie", 1603 | ] 1604 | 1605 | [[package]] 1606 | name = "pest_derive" 1607 | version = "2.7.2" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" 1610 | dependencies = [ 1611 | "pest", 1612 | "pest_generator", 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "pest_generator" 1617 | version = "2.7.2" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" 1620 | dependencies = [ 1621 | "pest", 1622 | "pest_meta", 1623 | "proc-macro2", 1624 | "quote", 1625 | "syn 2.0.29", 1626 | ] 1627 | 1628 | [[package]] 1629 | name = "pest_meta" 1630 | version = "2.7.2" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" 1633 | dependencies = [ 1634 | "once_cell", 1635 | "pest", 1636 | "sha2", 1637 | ] 1638 | 1639 | [[package]] 1640 | name = "phf" 1641 | version = "0.10.1" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 1644 | dependencies = [ 1645 | "phf_shared", 1646 | ] 1647 | 1648 | [[package]] 1649 | name = "phf_codegen" 1650 | version = "0.10.0" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" 1653 | dependencies = [ 1654 | "phf_generator", 1655 | "phf_shared", 1656 | ] 1657 | 1658 | [[package]] 1659 | name = "phf_generator" 1660 | version = "0.10.0" 1661 | source = "registry+https://github.com/rust-lang/crates.io-index" 1662 | checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" 1663 | dependencies = [ 1664 | "phf_shared", 1665 | "rand", 1666 | ] 1667 | 1668 | [[package]] 1669 | name = "phf_shared" 1670 | version = "0.10.0" 1671 | source = "registry+https://github.com/rust-lang/crates.io-index" 1672 | checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" 1673 | dependencies = [ 1674 | "siphasher", 1675 | "uncased", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "pin-project" 1680 | version = "1.0.12" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 1683 | dependencies = [ 1684 | "pin-project-internal", 1685 | ] 1686 | 1687 | [[package]] 1688 | name = "pin-project-internal" 1689 | version = "1.0.12" 1690 | source = "registry+https://github.com/rust-lang/crates.io-index" 1691 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 1692 | dependencies = [ 1693 | "proc-macro2", 1694 | "quote", 1695 | "syn 1.0.102", 1696 | ] 1697 | 1698 | [[package]] 1699 | name = "pin-project-lite" 1700 | version = "0.2.13" 1701 | source = "registry+https://github.com/rust-lang/crates.io-index" 1702 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1703 | 1704 | [[package]] 1705 | name = "pin-utils" 1706 | version = "0.1.0" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1709 | 1710 | [[package]] 1711 | name = "pkcs1" 1712 | version = "0.7.5" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1715 | dependencies = [ 1716 | "der", 1717 | "pkcs8", 1718 | "spki", 1719 | ] 1720 | 1721 | [[package]] 1722 | name = "pkcs8" 1723 | version = "0.10.2" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1726 | dependencies = [ 1727 | "der", 1728 | "spki", 1729 | ] 1730 | 1731 | [[package]] 1732 | name = "pkg-config" 1733 | version = "0.3.25" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 1736 | 1737 | [[package]] 1738 | name = "ppv-lite86" 1739 | version = "0.2.16" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1742 | 1743 | [[package]] 1744 | name = "proc-macro-error" 1745 | version = "1.0.4" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1748 | dependencies = [ 1749 | "proc-macro-error-attr", 1750 | "proc-macro2", 1751 | "quote", 1752 | "syn 1.0.102", 1753 | "version_check", 1754 | ] 1755 | 1756 | [[package]] 1757 | name = "proc-macro-error-attr" 1758 | version = "1.0.4" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1761 | dependencies = [ 1762 | "proc-macro2", 1763 | "quote", 1764 | "version_check", 1765 | ] 1766 | 1767 | [[package]] 1768 | name = "proc-macro2" 1769 | version = "1.0.66" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" 1772 | dependencies = [ 1773 | "unicode-ident", 1774 | ] 1775 | 1776 | [[package]] 1777 | name = "prost" 1778 | version = "0.11.9" 1779 | source = "registry+https://github.com/rust-lang/crates.io-index" 1780 | checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" 1781 | dependencies = [ 1782 | "bytes", 1783 | "prost-derive", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "prost-derive" 1788 | version = "0.11.9" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" 1791 | dependencies = [ 1792 | "anyhow", 1793 | "itertools", 1794 | "proc-macro2", 1795 | "quote", 1796 | "syn 1.0.102", 1797 | ] 1798 | 1799 | [[package]] 1800 | name = "prost-types" 1801 | version = "0.11.9" 1802 | source = "registry+https://github.com/rust-lang/crates.io-index" 1803 | checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" 1804 | dependencies = [ 1805 | "prost", 1806 | ] 1807 | 1808 | [[package]] 1809 | name = "quote" 1810 | version = "1.0.33" 1811 | source = "registry+https://github.com/rust-lang/crates.io-index" 1812 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 1813 | dependencies = [ 1814 | "proc-macro2", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "rand" 1819 | version = "0.8.5" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1822 | dependencies = [ 1823 | "libc", 1824 | "rand_chacha", 1825 | "rand_core", 1826 | ] 1827 | 1828 | [[package]] 1829 | name = "rand_chacha" 1830 | version = "0.3.1" 1831 | source = "registry+https://github.com/rust-lang/crates.io-index" 1832 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1833 | dependencies = [ 1834 | "ppv-lite86", 1835 | "rand_core", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "rand_core" 1840 | version = "0.6.4" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1843 | dependencies = [ 1844 | "getrandom", 1845 | ] 1846 | 1847 | [[package]] 1848 | name = "redox_syscall" 1849 | version = "0.2.16" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1852 | dependencies = [ 1853 | "bitflags 1.3.2", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "redox_syscall" 1858 | version = "0.3.5" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 1861 | dependencies = [ 1862 | "bitflags 1.3.2", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "regex" 1867 | version = "1.9.3" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" 1870 | dependencies = [ 1871 | "aho-corasick", 1872 | "memchr", 1873 | "regex-automata 0.3.6", 1874 | "regex-syntax 0.7.4", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "regex-automata" 1879 | version = "0.1.10" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1882 | dependencies = [ 1883 | "regex-syntax 0.6.27", 1884 | ] 1885 | 1886 | [[package]] 1887 | name = "regex-automata" 1888 | version = "0.3.6" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" 1891 | dependencies = [ 1892 | "aho-corasick", 1893 | "memchr", 1894 | "regex-syntax 0.7.4", 1895 | ] 1896 | 1897 | [[package]] 1898 | name = "regex-syntax" 1899 | version = "0.6.27" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 1902 | 1903 | [[package]] 1904 | name = "regex-syntax" 1905 | version = "0.7.4" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" 1908 | 1909 | [[package]] 1910 | name = "remove_dir_all" 1911 | version = "0.5.3" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 1914 | dependencies = [ 1915 | "winapi", 1916 | ] 1917 | 1918 | [[package]] 1919 | name = "ring" 1920 | version = "0.16.20" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 1923 | dependencies = [ 1924 | "cc", 1925 | "libc", 1926 | "once_cell", 1927 | "spin 0.5.2", 1928 | "untrusted", 1929 | "web-sys", 1930 | "winapi", 1931 | ] 1932 | 1933 | [[package]] 1934 | name = "rmp" 1935 | version = "0.8.12" 1936 | source = "registry+https://github.com/rust-lang/crates.io-index" 1937 | checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" 1938 | dependencies = [ 1939 | "byteorder", 1940 | "num-traits", 1941 | "paste", 1942 | ] 1943 | 1944 | [[package]] 1945 | name = "rmp-serde" 1946 | version = "1.1.2" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" 1949 | dependencies = [ 1950 | "byteorder", 1951 | "rmp", 1952 | "serde", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "rsa" 1957 | version = "0.9.2" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" 1960 | dependencies = [ 1961 | "byteorder", 1962 | "const-oid", 1963 | "digest", 1964 | "num-bigint-dig", 1965 | "num-integer", 1966 | "num-iter", 1967 | "num-traits", 1968 | "pkcs1", 1969 | "pkcs8", 1970 | "rand_core", 1971 | "signature", 1972 | "spki", 1973 | "subtle", 1974 | "zeroize", 1975 | ] 1976 | 1977 | [[package]] 1978 | name = "rustc-demangle" 1979 | version = "0.1.23" 1980 | source = "registry+https://github.com/rust-lang/crates.io-index" 1981 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1982 | 1983 | [[package]] 1984 | name = "rustc-hash" 1985 | version = "1.1.0" 1986 | source = "registry+https://github.com/rust-lang/crates.io-index" 1987 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1988 | 1989 | [[package]] 1990 | name = "rustls" 1991 | version = "0.21.6" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" 1994 | dependencies = [ 1995 | "ring", 1996 | "rustls-webpki", 1997 | "sct", 1998 | ] 1999 | 2000 | [[package]] 2001 | name = "rustls-pemfile" 2002 | version = "1.0.3" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" 2005 | dependencies = [ 2006 | "base64 0.21.2", 2007 | ] 2008 | 2009 | [[package]] 2010 | name = "rustls-webpki" 2011 | version = "0.101.4" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" 2014 | dependencies = [ 2015 | "ring", 2016 | "untrusted", 2017 | ] 2018 | 2019 | [[package]] 2020 | name = "rustrict" 2021 | version = "0.7.8" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "3a6b50905364a8bafca05898f2816b2f75e00d4aaf4c0c33a17fc898b9bc7153" 2024 | dependencies = [ 2025 | "arrayvec", 2026 | "bitflags 1.3.2", 2027 | "doc-comment", 2028 | "finl_unicode", 2029 | "itertools", 2030 | "lazy_static", 2031 | "rustc-hash", 2032 | "strsim", 2033 | "unicode-normalization", 2034 | ] 2035 | 2036 | [[package]] 2037 | name = "rustversion" 2038 | version = "1.0.9" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" 2041 | 2042 | [[package]] 2043 | name = "ryu" 2044 | version = "1.0.11" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 2047 | 2048 | [[package]] 2049 | name = "same-file" 2050 | version = "1.0.6" 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" 2052 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2053 | dependencies = [ 2054 | "winapi-util", 2055 | ] 2056 | 2057 | [[package]] 2058 | name = "schannel" 2059 | version = "0.1.22" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" 2062 | dependencies = [ 2063 | "windows-sys", 2064 | ] 2065 | 2066 | [[package]] 2067 | name = "scopeguard" 2068 | version = "1.1.0" 2069 | source = "registry+https://github.com/rust-lang/crates.io-index" 2070 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2071 | 2072 | [[package]] 2073 | name = "scratch" 2074 | version = "1.0.2" 2075 | source = "registry+https://github.com/rust-lang/crates.io-index" 2076 | checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" 2077 | 2078 | [[package]] 2079 | name = "sct" 2080 | version = "0.7.0" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 2083 | dependencies = [ 2084 | "ring", 2085 | "untrusted", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "security-framework" 2090 | version = "2.9.2" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" 2093 | dependencies = [ 2094 | "bitflags 1.3.2", 2095 | "core-foundation", 2096 | "core-foundation-sys", 2097 | "libc", 2098 | "security-framework-sys", 2099 | ] 2100 | 2101 | [[package]] 2102 | name = "security-framework-sys" 2103 | version = "2.9.1" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" 2106 | dependencies = [ 2107 | "core-foundation-sys", 2108 | "libc", 2109 | ] 2110 | 2111 | [[package]] 2112 | name = "serde" 2113 | version = "1.0.186" 2114 | source = "registry+https://github.com/rust-lang/crates.io-index" 2115 | checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" 2116 | dependencies = [ 2117 | "serde_derive", 2118 | ] 2119 | 2120 | [[package]] 2121 | name = "serde_derive" 2122 | version = "1.0.186" 2123 | source = "registry+https://github.com/rust-lang/crates.io-index" 2124 | checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" 2125 | dependencies = [ 2126 | "proc-macro2", 2127 | "quote", 2128 | "syn 2.0.29", 2129 | ] 2130 | 2131 | [[package]] 2132 | name = "serde_json" 2133 | version = "1.0.105" 2134 | source = "registry+https://github.com/rust-lang/crates.io-index" 2135 | checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" 2136 | dependencies = [ 2137 | "itoa", 2138 | "ryu", 2139 | "serde", 2140 | ] 2141 | 2142 | [[package]] 2143 | name = "serde_path_to_error" 2144 | version = "0.1.14" 2145 | source = "registry+https://github.com/rust-lang/crates.io-index" 2146 | checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" 2147 | dependencies = [ 2148 | "itoa", 2149 | "serde", 2150 | ] 2151 | 2152 | [[package]] 2153 | name = "serde_urlencoded" 2154 | version = "0.7.1" 2155 | source = "registry+https://github.com/rust-lang/crates.io-index" 2156 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2157 | dependencies = [ 2158 | "form_urlencoded", 2159 | "itoa", 2160 | "ryu", 2161 | "serde", 2162 | ] 2163 | 2164 | [[package]] 2165 | name = "sha1" 2166 | version = "0.10.5" 2167 | source = "registry+https://github.com/rust-lang/crates.io-index" 2168 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 2169 | dependencies = [ 2170 | "cfg-if", 2171 | "cpufeatures", 2172 | "digest", 2173 | ] 2174 | 2175 | [[package]] 2176 | name = "sha2" 2177 | version = "0.10.6" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 2180 | dependencies = [ 2181 | "cfg-if", 2182 | "cpufeatures", 2183 | "digest", 2184 | ] 2185 | 2186 | [[package]] 2187 | name = "sharded-slab" 2188 | version = "0.1.4" 2189 | source = "registry+https://github.com/rust-lang/crates.io-index" 2190 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2191 | dependencies = [ 2192 | "lazy_static", 2193 | ] 2194 | 2195 | [[package]] 2196 | name = "shuttle-axum" 2197 | version = "0.24.0" 2198 | source = "registry+https://github.com/rust-lang/crates.io-index" 2199 | checksum = "0f23bb81553e64db9af6d1c3002a2e1c80b9b448b8377ccdcaaba5b9cc413007" 2200 | dependencies = [ 2201 | "axum", 2202 | "shuttle-runtime", 2203 | ] 2204 | 2205 | [[package]] 2206 | name = "shuttle-codegen" 2207 | version = "0.24.0" 2208 | source = "registry+https://github.com/rust-lang/crates.io-index" 2209 | checksum = "c98aa9ad7b2058e8c9f5a2756503966aec238cf7ec31093a437f468e6242f176" 2210 | dependencies = [ 2211 | "proc-macro-error", 2212 | "proc-macro2", 2213 | "quote", 2214 | "syn 2.0.29", 2215 | ] 2216 | 2217 | [[package]] 2218 | name = "shuttle-common" 2219 | version = "0.24.0" 2220 | source = "registry+https://github.com/rust-lang/crates.io-index" 2221 | checksum = "c23f31b5227a86de62657dde1130af96b9536bdd9708a19b66d45698a81364fd" 2222 | dependencies = [ 2223 | "anyhow", 2224 | "async-trait", 2225 | "axum", 2226 | "bytes", 2227 | "chrono", 2228 | "headers", 2229 | "http", 2230 | "http-body", 2231 | "http-serde", 2232 | "hyper", 2233 | "jsonwebtoken", 2234 | "once_cell", 2235 | "opentelemetry", 2236 | "opentelemetry-http", 2237 | "opentelemetry-otlp", 2238 | "pin-project", 2239 | "prost-types", 2240 | "rmp-serde", 2241 | "rustrict", 2242 | "serde", 2243 | "serde_json", 2244 | "strum", 2245 | "thiserror", 2246 | "tower", 2247 | "tower-http", 2248 | "tracing", 2249 | "tracing-opentelemetry", 2250 | "tracing-subscriber", 2251 | "ttl_cache", 2252 | "uuid", 2253 | ] 2254 | 2255 | [[package]] 2256 | name = "shuttle-proto" 2257 | version = "0.24.0" 2258 | source = "registry+https://github.com/rust-lang/crates.io-index" 2259 | checksum = "2ded5e27c6281d14d66f3970302c878472e82bce6c28e04e9e664c8eaa086054" 2260 | dependencies = [ 2261 | "anyhow", 2262 | "chrono", 2263 | "home", 2264 | "prost", 2265 | "prost-types", 2266 | "serde_json", 2267 | "shuttle-common", 2268 | "tokio", 2269 | "tonic", 2270 | "tower", 2271 | "tracing", 2272 | ] 2273 | 2274 | [[package]] 2275 | name = "shuttle-runtime" 2276 | version = "0.24.0" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "4f734c5310cfed64c86bddc32ae6c7e0cd6f773ecaf2a93370690cc13f0e7d8a" 2279 | dependencies = [ 2280 | "anyhow", 2281 | "async-trait", 2282 | "chrono", 2283 | "prost-types", 2284 | "serde", 2285 | "serde_json", 2286 | "shuttle-codegen", 2287 | "shuttle-common", 2288 | "shuttle-proto", 2289 | "shuttle-service", 2290 | "strfmt", 2291 | "thiserror", 2292 | "tokio", 2293 | "tokio-stream", 2294 | "tonic", 2295 | "tower", 2296 | "tracing", 2297 | "tracing-subscriber", 2298 | ] 2299 | 2300 | [[package]] 2301 | name = "shuttle-service" 2302 | version = "0.24.0" 2303 | source = "registry+https://github.com/rust-lang/crates.io-index" 2304 | checksum = "9853b0443da1b2040d6f46368872584c86aaad73219c60b3506251c4e77bbc9e" 2305 | dependencies = [ 2306 | "anyhow", 2307 | "async-trait", 2308 | "serde", 2309 | "shuttle-common", 2310 | "strfmt", 2311 | "thiserror", 2312 | ] 2313 | 2314 | [[package]] 2315 | name = "shuttle-shared-db" 2316 | version = "0.24.0" 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" 2318 | checksum = "420bbe668adc7f1709083a5a15fc8350fee4da9217446509837365eb0f307920" 2319 | dependencies = [ 2320 | "async-trait", 2321 | "serde", 2322 | "shuttle-service", 2323 | "sqlx", 2324 | ] 2325 | 2326 | [[package]] 2327 | name = "signal-hook-registry" 2328 | version = "1.4.1" 2329 | source = "registry+https://github.com/rust-lang/crates.io-index" 2330 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 2331 | dependencies = [ 2332 | "libc", 2333 | ] 2334 | 2335 | [[package]] 2336 | name = "signature" 2337 | version = "2.1.0" 2338 | source = "registry+https://github.com/rust-lang/crates.io-index" 2339 | checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" 2340 | dependencies = [ 2341 | "digest", 2342 | "rand_core", 2343 | ] 2344 | 2345 | [[package]] 2346 | name = "simple_asn1" 2347 | version = "0.6.2" 2348 | source = "registry+https://github.com/rust-lang/crates.io-index" 2349 | checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" 2350 | dependencies = [ 2351 | "num-bigint", 2352 | "num-traits", 2353 | "thiserror", 2354 | "time", 2355 | ] 2356 | 2357 | [[package]] 2358 | name = "siphasher" 2359 | version = "0.3.11" 2360 | source = "registry+https://github.com/rust-lang/crates.io-index" 2361 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 2362 | 2363 | [[package]] 2364 | name = "slab" 2365 | version = "0.4.7" 2366 | source = "registry+https://github.com/rust-lang/crates.io-index" 2367 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 2368 | dependencies = [ 2369 | "autocfg", 2370 | ] 2371 | 2372 | [[package]] 2373 | name = "slug" 2374 | version = "0.1.4" 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" 2376 | checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" 2377 | dependencies = [ 2378 | "deunicode", 2379 | ] 2380 | 2381 | [[package]] 2382 | name = "smallvec" 2383 | version = "1.10.0" 2384 | source = "registry+https://github.com/rust-lang/crates.io-index" 2385 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 2386 | 2387 | [[package]] 2388 | name = "socket2" 2389 | version = "0.4.7" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 2392 | dependencies = [ 2393 | "libc", 2394 | "winapi", 2395 | ] 2396 | 2397 | [[package]] 2398 | name = "socket2" 2399 | version = "0.5.3" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" 2402 | dependencies = [ 2403 | "libc", 2404 | "windows-sys", 2405 | ] 2406 | 2407 | [[package]] 2408 | name = "spin" 2409 | version = "0.5.2" 2410 | source = "registry+https://github.com/rust-lang/crates.io-index" 2411 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 2412 | 2413 | [[package]] 2414 | name = "spin" 2415 | version = "0.9.4" 2416 | source = "registry+https://github.com/rust-lang/crates.io-index" 2417 | checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" 2418 | dependencies = [ 2419 | "lock_api", 2420 | ] 2421 | 2422 | [[package]] 2423 | name = "spki" 2424 | version = "0.7.2" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" 2427 | dependencies = [ 2428 | "base64ct", 2429 | "der", 2430 | ] 2431 | 2432 | [[package]] 2433 | name = "sqlformat" 2434 | version = "0.2.0" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | checksum = "f87e292b4291f154971a43c3774364e2cbcaec599d3f5bf6fa9d122885dbc38a" 2437 | dependencies = [ 2438 | "itertools", 2439 | "nom", 2440 | "unicode_categories", 2441 | ] 2442 | 2443 | [[package]] 2444 | name = "sqlx" 2445 | version = "0.7.1" 2446 | source = "registry+https://github.com/rust-lang/crates.io-index" 2447 | checksum = "8e58421b6bc416714d5115a2ca953718f6c621a51b68e4f4922aea5a4391a721" 2448 | dependencies = [ 2449 | "sqlx-core", 2450 | "sqlx-macros", 2451 | "sqlx-mysql", 2452 | "sqlx-postgres", 2453 | "sqlx-sqlite", 2454 | ] 2455 | 2456 | [[package]] 2457 | name = "sqlx-core" 2458 | version = "0.7.1" 2459 | source = "registry+https://github.com/rust-lang/crates.io-index" 2460 | checksum = "dd4cef4251aabbae751a3710927945901ee1d97ee96d757f6880ebb9a79bfd53" 2461 | dependencies = [ 2462 | "ahash 0.8.3", 2463 | "atoi", 2464 | "byteorder", 2465 | "bytes", 2466 | "crc", 2467 | "crossbeam-queue", 2468 | "dotenvy", 2469 | "either", 2470 | "event-listener", 2471 | "futures-channel", 2472 | "futures-core", 2473 | "futures-intrusive", 2474 | "futures-io", 2475 | "futures-util", 2476 | "hashlink", 2477 | "hex", 2478 | "indexmap 2.0.0", 2479 | "log", 2480 | "memchr", 2481 | "native-tls", 2482 | "once_cell", 2483 | "paste", 2484 | "percent-encoding", 2485 | "rustls", 2486 | "rustls-pemfile", 2487 | "serde", 2488 | "serde_json", 2489 | "sha2", 2490 | "smallvec", 2491 | "sqlformat", 2492 | "thiserror", 2493 | "tokio", 2494 | "tokio-stream", 2495 | "tracing", 2496 | "url", 2497 | "webpki-roots", 2498 | ] 2499 | 2500 | [[package]] 2501 | name = "sqlx-macros" 2502 | version = "0.7.1" 2503 | source = "registry+https://github.com/rust-lang/crates.io-index" 2504 | checksum = "208e3165167afd7f3881b16c1ef3f2af69fa75980897aac8874a0696516d12c2" 2505 | dependencies = [ 2506 | "proc-macro2", 2507 | "quote", 2508 | "sqlx-core", 2509 | "sqlx-macros-core", 2510 | "syn 1.0.102", 2511 | ] 2512 | 2513 | [[package]] 2514 | name = "sqlx-macros-core" 2515 | version = "0.7.1" 2516 | source = "registry+https://github.com/rust-lang/crates.io-index" 2517 | checksum = "8a4a8336d278c62231d87f24e8a7a74898156e34c1c18942857be2acb29c7dfc" 2518 | dependencies = [ 2519 | "dotenvy", 2520 | "either", 2521 | "heck", 2522 | "hex", 2523 | "once_cell", 2524 | "proc-macro2", 2525 | "quote", 2526 | "serde", 2527 | "serde_json", 2528 | "sha2", 2529 | "sqlx-core", 2530 | "sqlx-mysql", 2531 | "sqlx-postgres", 2532 | "sqlx-sqlite", 2533 | "syn 1.0.102", 2534 | "tempfile", 2535 | "tokio", 2536 | "url", 2537 | ] 2538 | 2539 | [[package]] 2540 | name = "sqlx-mysql" 2541 | version = "0.7.1" 2542 | source = "registry+https://github.com/rust-lang/crates.io-index" 2543 | checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482" 2544 | dependencies = [ 2545 | "atoi", 2546 | "base64 0.21.2", 2547 | "bitflags 2.4.0", 2548 | "byteorder", 2549 | "bytes", 2550 | "crc", 2551 | "digest", 2552 | "dotenvy", 2553 | "either", 2554 | "futures-channel", 2555 | "futures-core", 2556 | "futures-io", 2557 | "futures-util", 2558 | "generic-array", 2559 | "hex", 2560 | "hkdf", 2561 | "hmac", 2562 | "itoa", 2563 | "log", 2564 | "md-5", 2565 | "memchr", 2566 | "once_cell", 2567 | "percent-encoding", 2568 | "rand", 2569 | "rsa", 2570 | "serde", 2571 | "sha1", 2572 | "sha2", 2573 | "smallvec", 2574 | "sqlx-core", 2575 | "stringprep", 2576 | "thiserror", 2577 | "tracing", 2578 | "whoami", 2579 | ] 2580 | 2581 | [[package]] 2582 | name = "sqlx-postgres" 2583 | version = "0.7.1" 2584 | source = "registry+https://github.com/rust-lang/crates.io-index" 2585 | checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e" 2586 | dependencies = [ 2587 | "atoi", 2588 | "base64 0.21.2", 2589 | "bitflags 2.4.0", 2590 | "byteorder", 2591 | "crc", 2592 | "dotenvy", 2593 | "etcetera", 2594 | "futures-channel", 2595 | "futures-core", 2596 | "futures-io", 2597 | "futures-util", 2598 | "hex", 2599 | "hkdf", 2600 | "hmac", 2601 | "home", 2602 | "itoa", 2603 | "log", 2604 | "md-5", 2605 | "memchr", 2606 | "once_cell", 2607 | "rand", 2608 | "serde", 2609 | "serde_json", 2610 | "sha1", 2611 | "sha2", 2612 | "smallvec", 2613 | "sqlx-core", 2614 | "stringprep", 2615 | "thiserror", 2616 | "tracing", 2617 | "whoami", 2618 | ] 2619 | 2620 | [[package]] 2621 | name = "sqlx-sqlite" 2622 | version = "0.7.1" 2623 | source = "registry+https://github.com/rust-lang/crates.io-index" 2624 | checksum = "be4c21bf34c7cae5b283efb3ac1bcc7670df7561124dc2f8bdc0b59be40f79a2" 2625 | dependencies = [ 2626 | "atoi", 2627 | "flume", 2628 | "futures-channel", 2629 | "futures-core", 2630 | "futures-executor", 2631 | "futures-intrusive", 2632 | "futures-util", 2633 | "libsqlite3-sys", 2634 | "log", 2635 | "percent-encoding", 2636 | "serde", 2637 | "sqlx-core", 2638 | "tracing", 2639 | "url", 2640 | ] 2641 | 2642 | [[package]] 2643 | name = "strfmt" 2644 | version = "0.2.4" 2645 | source = "registry+https://github.com/rust-lang/crates.io-index" 2646 | checksum = "7a8348af2d9fc3258c8733b8d9d8db2e56f54b2363a4b5b81585c7875ed65e65" 2647 | 2648 | [[package]] 2649 | name = "stringprep" 2650 | version = "0.1.2" 2651 | source = "registry+https://github.com/rust-lang/crates.io-index" 2652 | checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" 2653 | dependencies = [ 2654 | "unicode-bidi", 2655 | "unicode-normalization", 2656 | ] 2657 | 2658 | [[package]] 2659 | name = "strsim" 2660 | version = "0.10.0" 2661 | source = "registry+https://github.com/rust-lang/crates.io-index" 2662 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2663 | 2664 | [[package]] 2665 | name = "strum" 2666 | version = "0.24.1" 2667 | source = "registry+https://github.com/rust-lang/crates.io-index" 2668 | checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" 2669 | dependencies = [ 2670 | "strum_macros", 2671 | ] 2672 | 2673 | [[package]] 2674 | name = "strum_macros" 2675 | version = "0.24.3" 2676 | source = "registry+https://github.com/rust-lang/crates.io-index" 2677 | checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" 2678 | dependencies = [ 2679 | "heck", 2680 | "proc-macro2", 2681 | "quote", 2682 | "rustversion", 2683 | "syn 1.0.102", 2684 | ] 2685 | 2686 | [[package]] 2687 | name = "subtle" 2688 | version = "2.4.1" 2689 | source = "registry+https://github.com/rust-lang/crates.io-index" 2690 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 2691 | 2692 | [[package]] 2693 | name = "syn" 2694 | version = "1.0.102" 2695 | source = "registry+https://github.com/rust-lang/crates.io-index" 2696 | checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1" 2697 | dependencies = [ 2698 | "proc-macro2", 2699 | "quote", 2700 | "unicode-ident", 2701 | ] 2702 | 2703 | [[package]] 2704 | name = "syn" 2705 | version = "2.0.29" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" 2708 | dependencies = [ 2709 | "proc-macro2", 2710 | "quote", 2711 | "unicode-ident", 2712 | ] 2713 | 2714 | [[package]] 2715 | name = "sync_wrapper" 2716 | version = "0.1.1" 2717 | source = "registry+https://github.com/rust-lang/crates.io-index" 2718 | checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" 2719 | 2720 | [[package]] 2721 | name = "tecdev" 2722 | version = "0.1.0" 2723 | dependencies = [ 2724 | "axum", 2725 | "cookie", 2726 | "http", 2727 | "http-body", 2728 | "pbkdf2", 2729 | "rand_chacha", 2730 | "rand_core", 2731 | "shuttle-axum", 2732 | "shuttle-runtime", 2733 | "shuttle-service", 2734 | "shuttle-shared-db", 2735 | "sqlx", 2736 | "tera", 2737 | "tokio", 2738 | ] 2739 | 2740 | [[package]] 2741 | name = "tempfile" 2742 | version = "3.3.0" 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" 2744 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 2745 | dependencies = [ 2746 | "cfg-if", 2747 | "fastrand", 2748 | "libc", 2749 | "redox_syscall 0.2.16", 2750 | "remove_dir_all", 2751 | "winapi", 2752 | ] 2753 | 2754 | [[package]] 2755 | name = "tera" 2756 | version = "1.19.0" 2757 | source = "registry+https://github.com/rust-lang/crates.io-index" 2758 | checksum = "a5ab29bb4f3e256ae6ad5c3e2775aa1f8829f2c0c101fc407bfd3a6df15c60c5" 2759 | dependencies = [ 2760 | "chrono", 2761 | "chrono-tz", 2762 | "globwalk", 2763 | "humansize", 2764 | "lazy_static", 2765 | "percent-encoding", 2766 | "pest", 2767 | "pest_derive", 2768 | "rand", 2769 | "regex", 2770 | "serde", 2771 | "serde_json", 2772 | "slug", 2773 | "thread_local", 2774 | "unic-segment", 2775 | ] 2776 | 2777 | [[package]] 2778 | name = "termcolor" 2779 | version = "1.1.3" 2780 | source = "registry+https://github.com/rust-lang/crates.io-index" 2781 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 2782 | dependencies = [ 2783 | "winapi-util", 2784 | ] 2785 | 2786 | [[package]] 2787 | name = "thiserror" 2788 | version = "1.0.37" 2789 | source = "registry+https://github.com/rust-lang/crates.io-index" 2790 | checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" 2791 | dependencies = [ 2792 | "thiserror-impl", 2793 | ] 2794 | 2795 | [[package]] 2796 | name = "thiserror-impl" 2797 | version = "1.0.37" 2798 | source = "registry+https://github.com/rust-lang/crates.io-index" 2799 | checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" 2800 | dependencies = [ 2801 | "proc-macro2", 2802 | "quote", 2803 | "syn 1.0.102", 2804 | ] 2805 | 2806 | [[package]] 2807 | name = "thread_local" 2808 | version = "1.1.4" 2809 | source = "registry+https://github.com/rust-lang/crates.io-index" 2810 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 2811 | dependencies = [ 2812 | "once_cell", 2813 | ] 2814 | 2815 | [[package]] 2816 | name = "time" 2817 | version = "0.3.15" 2818 | source = "registry+https://github.com/rust-lang/crates.io-index" 2819 | checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c" 2820 | dependencies = [ 2821 | "itoa", 2822 | "libc", 2823 | "num_threads", 2824 | "time-macros", 2825 | ] 2826 | 2827 | [[package]] 2828 | name = "time-macros" 2829 | version = "0.2.4" 2830 | source = "registry+https://github.com/rust-lang/crates.io-index" 2831 | checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" 2832 | 2833 | [[package]] 2834 | name = "tinyvec" 2835 | version = "1.6.0" 2836 | source = "registry+https://github.com/rust-lang/crates.io-index" 2837 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2838 | dependencies = [ 2839 | "tinyvec_macros", 2840 | ] 2841 | 2842 | [[package]] 2843 | name = "tinyvec_macros" 2844 | version = "0.1.0" 2845 | source = "registry+https://github.com/rust-lang/crates.io-index" 2846 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2847 | 2848 | [[package]] 2849 | name = "tokio" 2850 | version = "1.32.0" 2851 | source = "registry+https://github.com/rust-lang/crates.io-index" 2852 | checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" 2853 | dependencies = [ 2854 | "backtrace", 2855 | "bytes", 2856 | "libc", 2857 | "mio", 2858 | "num_cpus", 2859 | "parking_lot", 2860 | "pin-project-lite", 2861 | "signal-hook-registry", 2862 | "socket2 0.5.3", 2863 | "tokio-macros", 2864 | "windows-sys", 2865 | ] 2866 | 2867 | [[package]] 2868 | name = "tokio-io-timeout" 2869 | version = "1.2.0" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" 2872 | dependencies = [ 2873 | "pin-project-lite", 2874 | "tokio", 2875 | ] 2876 | 2877 | [[package]] 2878 | name = "tokio-macros" 2879 | version = "2.1.0" 2880 | source = "registry+https://github.com/rust-lang/crates.io-index" 2881 | checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" 2882 | dependencies = [ 2883 | "proc-macro2", 2884 | "quote", 2885 | "syn 2.0.29", 2886 | ] 2887 | 2888 | [[package]] 2889 | name = "tokio-stream" 2890 | version = "0.1.11" 2891 | source = "registry+https://github.com/rust-lang/crates.io-index" 2892 | checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" 2893 | dependencies = [ 2894 | "futures-core", 2895 | "pin-project-lite", 2896 | "tokio", 2897 | ] 2898 | 2899 | [[package]] 2900 | name = "tokio-util" 2901 | version = "0.7.8" 2902 | source = "registry+https://github.com/rust-lang/crates.io-index" 2903 | checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" 2904 | dependencies = [ 2905 | "bytes", 2906 | "futures-core", 2907 | "futures-sink", 2908 | "pin-project-lite", 2909 | "tokio", 2910 | "tracing", 2911 | ] 2912 | 2913 | [[package]] 2914 | name = "tonic" 2915 | version = "0.8.3" 2916 | source = "registry+https://github.com/rust-lang/crates.io-index" 2917 | checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" 2918 | dependencies = [ 2919 | "async-stream", 2920 | "async-trait", 2921 | "axum", 2922 | "base64 0.13.0", 2923 | "bytes", 2924 | "futures-core", 2925 | "futures-util", 2926 | "h2", 2927 | "http", 2928 | "http-body", 2929 | "hyper", 2930 | "hyper-timeout", 2931 | "percent-encoding", 2932 | "pin-project", 2933 | "prost", 2934 | "prost-derive", 2935 | "tokio", 2936 | "tokio-stream", 2937 | "tokio-util", 2938 | "tower", 2939 | "tower-layer", 2940 | "tower-service", 2941 | "tracing", 2942 | "tracing-futures", 2943 | ] 2944 | 2945 | [[package]] 2946 | name = "tower" 2947 | version = "0.4.13" 2948 | source = "registry+https://github.com/rust-lang/crates.io-index" 2949 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 2950 | dependencies = [ 2951 | "futures-core", 2952 | "futures-util", 2953 | "indexmap 1.9.1", 2954 | "pin-project", 2955 | "pin-project-lite", 2956 | "rand", 2957 | "slab", 2958 | "tokio", 2959 | "tokio-util", 2960 | "tower-layer", 2961 | "tower-service", 2962 | "tracing", 2963 | ] 2964 | 2965 | [[package]] 2966 | name = "tower-http" 2967 | version = "0.4.3" 2968 | source = "registry+https://github.com/rust-lang/crates.io-index" 2969 | checksum = "55ae70283aba8d2a8b411c695c437fe25b8b5e44e23e780662002fc72fb47a82" 2970 | dependencies = [ 2971 | "bitflags 2.4.0", 2972 | "bytes", 2973 | "futures-core", 2974 | "futures-util", 2975 | "http", 2976 | "http-body", 2977 | "http-range-header", 2978 | "pin-project-lite", 2979 | "tower-layer", 2980 | "tower-service", 2981 | "tracing", 2982 | ] 2983 | 2984 | [[package]] 2985 | name = "tower-layer" 2986 | version = "0.3.2" 2987 | source = "registry+https://github.com/rust-lang/crates.io-index" 2988 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 2989 | 2990 | [[package]] 2991 | name = "tower-service" 2992 | version = "0.3.2" 2993 | source = "registry+https://github.com/rust-lang/crates.io-index" 2994 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2995 | 2996 | [[package]] 2997 | name = "tracing" 2998 | version = "0.1.37" 2999 | source = "registry+https://github.com/rust-lang/crates.io-index" 3000 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 3001 | dependencies = [ 3002 | "cfg-if", 3003 | "log", 3004 | "pin-project-lite", 3005 | "tracing-attributes", 3006 | "tracing-core", 3007 | ] 3008 | 3009 | [[package]] 3010 | name = "tracing-attributes" 3011 | version = "0.1.23" 3012 | source = "registry+https://github.com/rust-lang/crates.io-index" 3013 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" 3014 | dependencies = [ 3015 | "proc-macro2", 3016 | "quote", 3017 | "syn 1.0.102", 3018 | ] 3019 | 3020 | [[package]] 3021 | name = "tracing-core" 3022 | version = "0.1.30" 3023 | source = "registry+https://github.com/rust-lang/crates.io-index" 3024 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 3025 | dependencies = [ 3026 | "once_cell", 3027 | "valuable", 3028 | ] 3029 | 3030 | [[package]] 3031 | name = "tracing-futures" 3032 | version = "0.2.5" 3033 | source = "registry+https://github.com/rust-lang/crates.io-index" 3034 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 3035 | dependencies = [ 3036 | "pin-project", 3037 | "tracing", 3038 | ] 3039 | 3040 | [[package]] 3041 | name = "tracing-log" 3042 | version = "0.1.3" 3043 | source = "registry+https://github.com/rust-lang/crates.io-index" 3044 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 3045 | dependencies = [ 3046 | "lazy_static", 3047 | "log", 3048 | "tracing-core", 3049 | ] 3050 | 3051 | [[package]] 3052 | name = "tracing-opentelemetry" 3053 | version = "0.19.0" 3054 | source = "registry+https://github.com/rust-lang/crates.io-index" 3055 | checksum = "00a39dcf9bfc1742fa4d6215253b33a6e474be78275884c216fc2a06267b3600" 3056 | dependencies = [ 3057 | "once_cell", 3058 | "opentelemetry", 3059 | "tracing", 3060 | "tracing-core", 3061 | "tracing-log", 3062 | "tracing-subscriber", 3063 | ] 3064 | 3065 | [[package]] 3066 | name = "tracing-subscriber" 3067 | version = "0.3.16" 3068 | source = "registry+https://github.com/rust-lang/crates.io-index" 3069 | checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" 3070 | dependencies = [ 3071 | "matchers", 3072 | "nu-ansi-term", 3073 | "once_cell", 3074 | "regex", 3075 | "sharded-slab", 3076 | "smallvec", 3077 | "thread_local", 3078 | "tracing", 3079 | "tracing-core", 3080 | "tracing-log", 3081 | ] 3082 | 3083 | [[package]] 3084 | name = "try-lock" 3085 | version = "0.2.3" 3086 | source = "registry+https://github.com/rust-lang/crates.io-index" 3087 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 3088 | 3089 | [[package]] 3090 | name = "ttl_cache" 3091 | version = "0.5.1" 3092 | source = "registry+https://github.com/rust-lang/crates.io-index" 3093 | checksum = "4189890526f0168710b6ee65ceaedf1460c48a14318ceec933cb26baa492096a" 3094 | dependencies = [ 3095 | "linked-hash-map", 3096 | ] 3097 | 3098 | [[package]] 3099 | name = "typenum" 3100 | version = "1.15.0" 3101 | source = "registry+https://github.com/rust-lang/crates.io-index" 3102 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 3103 | 3104 | [[package]] 3105 | name = "ucd-trie" 3106 | version = "0.1.6" 3107 | source = "registry+https://github.com/rust-lang/crates.io-index" 3108 | checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" 3109 | 3110 | [[package]] 3111 | name = "uncased" 3112 | version = "0.9.9" 3113 | source = "registry+https://github.com/rust-lang/crates.io-index" 3114 | checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" 3115 | dependencies = [ 3116 | "version_check", 3117 | ] 3118 | 3119 | [[package]] 3120 | name = "unic-char-property" 3121 | version = "0.9.0" 3122 | source = "registry+https://github.com/rust-lang/crates.io-index" 3123 | checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" 3124 | dependencies = [ 3125 | "unic-char-range", 3126 | ] 3127 | 3128 | [[package]] 3129 | name = "unic-char-range" 3130 | version = "0.9.0" 3131 | source = "registry+https://github.com/rust-lang/crates.io-index" 3132 | checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" 3133 | 3134 | [[package]] 3135 | name = "unic-common" 3136 | version = "0.9.0" 3137 | source = "registry+https://github.com/rust-lang/crates.io-index" 3138 | checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" 3139 | 3140 | [[package]] 3141 | name = "unic-segment" 3142 | version = "0.9.0" 3143 | source = "registry+https://github.com/rust-lang/crates.io-index" 3144 | checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" 3145 | dependencies = [ 3146 | "unic-ucd-segment", 3147 | ] 3148 | 3149 | [[package]] 3150 | name = "unic-ucd-segment" 3151 | version = "0.9.0" 3152 | source = "registry+https://github.com/rust-lang/crates.io-index" 3153 | checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" 3154 | dependencies = [ 3155 | "unic-char-property", 3156 | "unic-char-range", 3157 | "unic-ucd-version", 3158 | ] 3159 | 3160 | [[package]] 3161 | name = "unic-ucd-version" 3162 | version = "0.9.0" 3163 | source = "registry+https://github.com/rust-lang/crates.io-index" 3164 | checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" 3165 | dependencies = [ 3166 | "unic-common", 3167 | ] 3168 | 3169 | [[package]] 3170 | name = "unicode-bidi" 3171 | version = "0.3.8" 3172 | source = "registry+https://github.com/rust-lang/crates.io-index" 3173 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 3174 | 3175 | [[package]] 3176 | name = "unicode-ident" 3177 | version = "1.0.5" 3178 | source = "registry+https://github.com/rust-lang/crates.io-index" 3179 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" 3180 | 3181 | [[package]] 3182 | name = "unicode-normalization" 3183 | version = "0.1.22" 3184 | source = "registry+https://github.com/rust-lang/crates.io-index" 3185 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 3186 | dependencies = [ 3187 | "tinyvec", 3188 | ] 3189 | 3190 | [[package]] 3191 | name = "unicode-segmentation" 3192 | version = "1.10.0" 3193 | source = "registry+https://github.com/rust-lang/crates.io-index" 3194 | checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" 3195 | 3196 | [[package]] 3197 | name = "unicode-width" 3198 | version = "0.1.10" 3199 | source = "registry+https://github.com/rust-lang/crates.io-index" 3200 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 3201 | 3202 | [[package]] 3203 | name = "unicode_categories" 3204 | version = "0.1.1" 3205 | source = "registry+https://github.com/rust-lang/crates.io-index" 3206 | checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 3207 | 3208 | [[package]] 3209 | name = "untrusted" 3210 | version = "0.7.1" 3211 | source = "registry+https://github.com/rust-lang/crates.io-index" 3212 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 3213 | 3214 | [[package]] 3215 | name = "url" 3216 | version = "2.3.1" 3217 | source = "registry+https://github.com/rust-lang/crates.io-index" 3218 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 3219 | dependencies = [ 3220 | "form_urlencoded", 3221 | "idna", 3222 | "percent-encoding", 3223 | ] 3224 | 3225 | [[package]] 3226 | name = "urlencoding" 3227 | version = "2.1.3" 3228 | source = "registry+https://github.com/rust-lang/crates.io-index" 3229 | checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 3230 | 3231 | [[package]] 3232 | name = "uuid" 3233 | version = "1.4.1" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" 3236 | dependencies = [ 3237 | "getrandom", 3238 | "serde", 3239 | ] 3240 | 3241 | [[package]] 3242 | name = "valuable" 3243 | version = "0.1.0" 3244 | source = "registry+https://github.com/rust-lang/crates.io-index" 3245 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3246 | 3247 | [[package]] 3248 | name = "vcpkg" 3249 | version = "0.2.15" 3250 | source = "registry+https://github.com/rust-lang/crates.io-index" 3251 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3252 | 3253 | [[package]] 3254 | name = "version_check" 3255 | version = "0.9.4" 3256 | source = "registry+https://github.com/rust-lang/crates.io-index" 3257 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3258 | 3259 | [[package]] 3260 | name = "walkdir" 3261 | version = "2.3.3" 3262 | source = "registry+https://github.com/rust-lang/crates.io-index" 3263 | checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" 3264 | dependencies = [ 3265 | "same-file", 3266 | "winapi-util", 3267 | ] 3268 | 3269 | [[package]] 3270 | name = "want" 3271 | version = "0.3.0" 3272 | source = "registry+https://github.com/rust-lang/crates.io-index" 3273 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 3274 | dependencies = [ 3275 | "log", 3276 | "try-lock", 3277 | ] 3278 | 3279 | [[package]] 3280 | name = "wasi" 3281 | version = "0.11.0+wasi-snapshot-preview1" 3282 | source = "registry+https://github.com/rust-lang/crates.io-index" 3283 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3284 | 3285 | [[package]] 3286 | name = "wasm-bindgen" 3287 | version = "0.2.83" 3288 | source = "registry+https://github.com/rust-lang/crates.io-index" 3289 | checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" 3290 | dependencies = [ 3291 | "cfg-if", 3292 | "wasm-bindgen-macro", 3293 | ] 3294 | 3295 | [[package]] 3296 | name = "wasm-bindgen-backend" 3297 | version = "0.2.83" 3298 | source = "registry+https://github.com/rust-lang/crates.io-index" 3299 | checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" 3300 | dependencies = [ 3301 | "bumpalo", 3302 | "log", 3303 | "once_cell", 3304 | "proc-macro2", 3305 | "quote", 3306 | "syn 1.0.102", 3307 | "wasm-bindgen-shared", 3308 | ] 3309 | 3310 | [[package]] 3311 | name = "wasm-bindgen-macro" 3312 | version = "0.2.83" 3313 | source = "registry+https://github.com/rust-lang/crates.io-index" 3314 | checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" 3315 | dependencies = [ 3316 | "quote", 3317 | "wasm-bindgen-macro-support", 3318 | ] 3319 | 3320 | [[package]] 3321 | name = "wasm-bindgen-macro-support" 3322 | version = "0.2.83" 3323 | source = "registry+https://github.com/rust-lang/crates.io-index" 3324 | checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" 3325 | dependencies = [ 3326 | "proc-macro2", 3327 | "quote", 3328 | "syn 1.0.102", 3329 | "wasm-bindgen-backend", 3330 | "wasm-bindgen-shared", 3331 | ] 3332 | 3333 | [[package]] 3334 | name = "wasm-bindgen-shared" 3335 | version = "0.2.83" 3336 | source = "registry+https://github.com/rust-lang/crates.io-index" 3337 | checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" 3338 | 3339 | [[package]] 3340 | name = "web-sys" 3341 | version = "0.3.60" 3342 | source = "registry+https://github.com/rust-lang/crates.io-index" 3343 | checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" 3344 | dependencies = [ 3345 | "js-sys", 3346 | "wasm-bindgen", 3347 | ] 3348 | 3349 | [[package]] 3350 | name = "webpki-roots" 3351 | version = "0.24.0" 3352 | source = "registry+https://github.com/rust-lang/crates.io-index" 3353 | checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" 3354 | dependencies = [ 3355 | "rustls-webpki", 3356 | ] 3357 | 3358 | [[package]] 3359 | name = "whoami" 3360 | version = "1.2.3" 3361 | source = "registry+https://github.com/rust-lang/crates.io-index" 3362 | checksum = "d6631b6a2fd59b1841b622e8f1a7ad241ef0a46f2d580464ce8140ac94cbd571" 3363 | dependencies = [ 3364 | "bumpalo", 3365 | "wasm-bindgen", 3366 | "web-sys", 3367 | ] 3368 | 3369 | [[package]] 3370 | name = "winapi" 3371 | version = "0.3.9" 3372 | source = "registry+https://github.com/rust-lang/crates.io-index" 3373 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3374 | dependencies = [ 3375 | "winapi-i686-pc-windows-gnu", 3376 | "winapi-x86_64-pc-windows-gnu", 3377 | ] 3378 | 3379 | [[package]] 3380 | name = "winapi-i686-pc-windows-gnu" 3381 | version = "0.4.0" 3382 | source = "registry+https://github.com/rust-lang/crates.io-index" 3383 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3384 | 3385 | [[package]] 3386 | name = "winapi-util" 3387 | version = "0.1.5" 3388 | source = "registry+https://github.com/rust-lang/crates.io-index" 3389 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 3390 | dependencies = [ 3391 | "winapi", 3392 | ] 3393 | 3394 | [[package]] 3395 | name = "winapi-x86_64-pc-windows-gnu" 3396 | version = "0.4.0" 3397 | source = "registry+https://github.com/rust-lang/crates.io-index" 3398 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3399 | 3400 | [[package]] 3401 | name = "windows-sys" 3402 | version = "0.48.0" 3403 | source = "registry+https://github.com/rust-lang/crates.io-index" 3404 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3405 | dependencies = [ 3406 | "windows-targets", 3407 | ] 3408 | 3409 | [[package]] 3410 | name = "windows-targets" 3411 | version = "0.48.5" 3412 | source = "registry+https://github.com/rust-lang/crates.io-index" 3413 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3414 | dependencies = [ 3415 | "windows_aarch64_gnullvm", 3416 | "windows_aarch64_msvc", 3417 | "windows_i686_gnu", 3418 | "windows_i686_msvc", 3419 | "windows_x86_64_gnu", 3420 | "windows_x86_64_gnullvm", 3421 | "windows_x86_64_msvc", 3422 | ] 3423 | 3424 | [[package]] 3425 | name = "windows_aarch64_gnullvm" 3426 | version = "0.48.5" 3427 | source = "registry+https://github.com/rust-lang/crates.io-index" 3428 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3429 | 3430 | [[package]] 3431 | name = "windows_aarch64_msvc" 3432 | version = "0.48.5" 3433 | source = "registry+https://github.com/rust-lang/crates.io-index" 3434 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3435 | 3436 | [[package]] 3437 | name = "windows_i686_gnu" 3438 | version = "0.48.5" 3439 | source = "registry+https://github.com/rust-lang/crates.io-index" 3440 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3441 | 3442 | [[package]] 3443 | name = "windows_i686_msvc" 3444 | version = "0.48.5" 3445 | source = "registry+https://github.com/rust-lang/crates.io-index" 3446 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3447 | 3448 | [[package]] 3449 | name = "windows_x86_64_gnu" 3450 | version = "0.48.5" 3451 | source = "registry+https://github.com/rust-lang/crates.io-index" 3452 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3453 | 3454 | [[package]] 3455 | name = "windows_x86_64_gnullvm" 3456 | version = "0.48.5" 3457 | source = "registry+https://github.com/rust-lang/crates.io-index" 3458 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3459 | 3460 | [[package]] 3461 | name = "windows_x86_64_msvc" 3462 | version = "0.48.5" 3463 | source = "registry+https://github.com/rust-lang/crates.io-index" 3464 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3465 | 3466 | [[package]] 3467 | name = "zeroize" 3468 | version = "1.6.0" 3469 | source = "registry+https://github.com/rust-lang/crates.io-index" 3470 | checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" 3471 | --------------------------------------------------------------------------------