├── .gitignore ├── rustfmt.toml ├── LICENSE ├── Cargo.toml ├── README.md ├── src ├── drivers │ ├── mod.rs │ ├── null.rs │ ├── memory.rs │ ├── redis.rs │ ├── database.rs │ └── dynamodb.rs └── lib.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces = 4 2 | hard_tabs = true 3 | edition = "2021" 4 | use_try_shorthand = true 5 | imports_granularity = "Crate" 6 | use_field_init_shorthand = true 7 | condense_wildcard_suffixes = true 8 | match_block_trailing_comma = true 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Miguel Piedrafita 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "amnesia" 3 | edition = "2021" 4 | license = "MIT" 5 | version = "0.1.5" 6 | readme = "README.md" 7 | repository = "https://github.com/m1guelpf/amnesia" 8 | authors = ["Miguel Piedrafita "] 9 | description = "An expressive interface for interacting with a Cache." 10 | 11 | [dependencies] 12 | serde = "1.0.193" 13 | thiserror = "1.0.50" 14 | aws-types = { version = "1.1.1", optional = true } 15 | serde_json = { version = "1.0.108", optional = true } 16 | aws-sdk-dynamodb = { version = "1.7.0", optional = true } 17 | aws-smithy-runtime-api = { version = "1.1.1", optional = true } 18 | ensemble = { version = "0.0.5", default-features = false, optional = true } 19 | bitcode = { version = "0.5.0", optional = true, default-features = false, features = ["serde"] } 20 | redis = { version = "0.24.0", default-features = false, features = ["tokio-comp", "aio"], optional = true } 21 | 22 | [dev-dependencies] 23 | ensemble = { version = "0.0.5", features = ["mysql"] } 24 | tokio = { version = "1.35.0", features = ["macros", "rt-multi-thread"] } 25 | 26 | [features] 27 | default = ["memory"] 28 | memory = ["dep:bitcode"] 29 | redis = ["dep:redis", "dep:bitcode"] 30 | database = ["dep:ensemble", "dep:serde_json"] 31 | dynamodb = ["dep:aws-sdk-dynamodb", "dep:aws-smithy-runtime-api", "dep:aws-types"] 32 | 33 | [package.metadata.docs.rs] 34 | features = ["memory", "database", "redis", "dynamodb"] 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Amnesia 2 | 3 | > An expressive Rust library for interacting with a Cache. 4 | 5 | [![crates.io](https://img.shields.io/crates/v/amnesia.svg)](https://crates.io/crates/amnesia) 6 | [![download count badge](https://img.shields.io/crates/d/amnesia.svg)](https://crates.io/crates/amnesia) 7 | [![docs.rs](https://img.shields.io/badge/docs-latest-blue.svg)](https://docs.rs/amnesia) 8 | 9 | ## Features 10 | 11 | - **Driver-Based Architecture**: Easily switch between different caching strategies by using drivers. 12 | - **Asynchronous API**: Built with async/await for non-blocking I/O operations. 13 | - **Serialization**: Leverage Serde for serializing and deserializing cache values. 14 | - **Time-to-Live (TTL)**: Set expiration times for cache entries to ensure stale data is not served. 15 | - **Extensible**: Implement your own cache drivers to extend functionality. 16 | 17 | ## Usage 18 | 19 | ```rust 20 | let mut cache = Cache::::new(RedisConfig { // or DynamoDBDriver, DatabaseDriver, MemoryDriver, etc. 21 | redis_url: "..." 22 | }).await?; 23 | 24 | let my_value = cache.remember("test-value", Duration::from_secs(10), my_value).await?; 25 | 26 | cache.forget("test-value").await?; 27 | ``` 28 | 29 | Please refer to the [documentation on docs.rs](https://docs.rs/amnesia) for detailed usage instructions. 30 | 31 | ## License 32 | 33 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 34 | -------------------------------------------------------------------------------- /src/drivers/mod.rs: -------------------------------------------------------------------------------- 1 | use serde::{de::DeserializeOwned, Serialize}; 2 | use std::{future::Future, time::Duration}; 3 | 4 | #[cfg(feature = "database")] 5 | pub mod database; 6 | #[cfg(feature = "dynamodb")] 7 | pub mod dynamodb; 8 | #[cfg(feature = "memory")] 9 | pub mod memory; 10 | pub mod null; 11 | #[cfg(feature = "redis")] 12 | pub mod redis; 13 | 14 | #[cfg(feature = "database")] 15 | pub use database::DatabaseDriver; 16 | #[cfg(feature = "dynamodb")] 17 | pub use dynamodb::DynamoDBDriver; 18 | #[cfg(feature = "memory")] 19 | pub use memory::MemoryDriver; 20 | pub use null::NullDriver; 21 | #[cfg(feature = "redis")] 22 | pub use redis::RedisDriver; 23 | 24 | /// Cache driver. 25 | pub trait Driver: Sized + Send + Sync { 26 | type Error: Send; 27 | type Config: Send; 28 | 29 | fn new(config: Self::Config) -> impl Future> + Send; 30 | 31 | /// Get a value from the cache. 32 | fn get( 33 | &self, 34 | key: &str, 35 | ) -> impl Future, Self::Error>> + Send; 36 | 37 | /// Check if a value exists in the cache. 38 | fn has(&self, key: &str) -> impl Future> + Send; 39 | 40 | /// Put a value into the cache. 41 | fn put( 42 | &mut self, 43 | key: &str, 44 | data: &T, 45 | expiry: Option, 46 | ) -> impl Future> + Send; 47 | 48 | /// Remove a value from the cache. 49 | fn forget(&mut self, key: &str) -> impl Future> + Send; 50 | 51 | /// Remove all values from the cache. 52 | fn flush(&mut self) -> impl Future> + Send; 53 | } 54 | -------------------------------------------------------------------------------- /src/drivers/null.rs: -------------------------------------------------------------------------------- 1 | use super::Driver; 2 | use serde::{de::DeserializeOwned, Serialize}; 3 | use std::{convert::Infallible, time::Duration}; 4 | 5 | #[allow(clippy::module_name_repetitions)] 6 | /// A driver that does nothing. 7 | pub struct NullDriver; 8 | 9 | impl Driver for NullDriver { 10 | type Config = (); 11 | type Error = Infallible; 12 | 13 | async fn new((): Self::Config) -> Result { 14 | Ok(Self) 15 | } 16 | 17 | async fn get(&self, _key: &str) -> Result, Self::Error> { 18 | Ok(None) 19 | } 20 | 21 | async fn has(&self, _key: &str) -> Result { 22 | Ok(false) 23 | } 24 | 25 | async fn put( 26 | &mut self, 27 | _: &str, 28 | _: &T, 29 | _: Option, 30 | ) -> Result<(), Self::Error> { 31 | Ok(()) 32 | } 33 | 34 | async fn forget(&mut self, _: &str) -> Result<(), Self::Error> { 35 | Ok(()) 36 | } 37 | 38 | async fn flush(&mut self) -> Result<(), Self::Error> { 39 | Ok(()) 40 | } 41 | } 42 | 43 | #[cfg(test)] 44 | mod tests { 45 | use super::*; 46 | use crate::Cache; 47 | 48 | #[tokio::test] 49 | async fn test_null_driver() { 50 | let mut cache = Cache::::new(()).await.unwrap(); 51 | 52 | assert_eq!(cache.get::("foo").await.unwrap(), None); 53 | assert!(!cache.has("foo").await.unwrap()); 54 | 55 | cache 56 | .put("foo", &"bar", Duration::from_secs(1)) 57 | .await 58 | .unwrap(); 59 | 60 | assert_eq!(cache.get::("foo").await.unwrap(), None); 61 | assert!(!cache.has("foo").await.unwrap()); 62 | 63 | cache.forget("foo").await.unwrap(); 64 | 65 | assert_eq!(cache.get::("foo").await.unwrap(), None); 66 | assert!(!cache.has("foo").await.unwrap()); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/drivers/memory.rs: -------------------------------------------------------------------------------- 1 | use super::Driver; 2 | use serde::{de::DeserializeOwned, Serialize}; 3 | use std::{ 4 | collections::HashMap, 5 | time::{Duration, SystemTime}, 6 | }; 7 | 8 | #[allow(clippy::module_name_repetitions)] 9 | /// A driver that stores values in memory. 10 | pub struct MemoryDriver { 11 | cache: HashMap, Option)>, 12 | } 13 | 14 | impl Driver for MemoryDriver { 15 | type Config = (); 16 | type Error = Error; 17 | 18 | async fn new((): Self::Config) -> Result { 19 | Ok(Self { 20 | cache: HashMap::new(), 21 | }) 22 | } 23 | 24 | async fn get(&self, key: &str) -> Result, Self::Error> { 25 | let Some((data, expires_at)) = self.cache.get(key) else { 26 | return Ok(None); 27 | }; 28 | 29 | if let Some(expires_at) = expires_at { 30 | if expires_at < &SystemTime::now() { 31 | // We would ideally clean up expired values here, but that would require a mutable reference to self, 32 | // which provides a worse developer experience than just letting the cache grow. 33 | return Ok(None); 34 | } 35 | } 36 | 37 | Ok(Some(bitcode::deserialize(data)?)) 38 | } 39 | 40 | async fn has(&self, key: &str) -> Result { 41 | Ok(self.cache.contains_key(key)) 42 | } 43 | 44 | async fn put( 45 | &mut self, 46 | key: &str, 47 | value: &T, 48 | duration: Option, 49 | ) -> Result<(), Self::Error> { 50 | let data = bitcode::serialize(value)?; 51 | let expires_at = duration.map(|duration| SystemTime::now() + duration); 52 | 53 | self.cache.insert(key.to_owned(), (data, expires_at)); 54 | 55 | Ok(()) 56 | } 57 | 58 | async fn forget(&mut self, key: &str) -> Result<(), Self::Error> { 59 | self.cache.remove(key); 60 | 61 | Ok(()) 62 | } 63 | 64 | async fn flush(&mut self) -> Result<(), Self::Error> { 65 | self.cache.clear(); 66 | 67 | Ok(()) 68 | } 69 | } 70 | 71 | #[derive(Debug, thiserror::Error)] 72 | pub enum Error { 73 | #[error("failed to deserialize data")] 74 | DeserializationError(#[from] bitcode::Error), 75 | } 76 | 77 | #[cfg(test)] 78 | mod tests { 79 | use super::*; 80 | use crate::Cache; 81 | 82 | #[tokio::test] 83 | async fn test_memory_driver() { 84 | let mut cache = Cache::::new(()).await.unwrap(); 85 | 86 | assert_eq!(cache.get::("foo").await.unwrap(), None); 87 | assert!(!cache.has("foo").await.unwrap()); 88 | 89 | cache 90 | .put("foo", &"bar".to_string(), Duration::from_secs(10)) 91 | .await 92 | .unwrap(); 93 | 94 | assert_eq!(cache.get("foo").await.unwrap(), Some("bar".to_string())); 95 | assert!(cache.has("foo").await.unwrap()); 96 | 97 | cache.forget("foo").await.unwrap(); 98 | 99 | assert_eq!(cache.get::("foo").await.unwrap(), None); 100 | assert!(!cache.has("foo").await.unwrap()); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/drivers/redis.rs: -------------------------------------------------------------------------------- 1 | use super::Driver; 2 | use redis::AsyncCommands; 3 | use serde::{de::DeserializeOwned, Serialize}; 4 | use std::time::Duration; 5 | 6 | pub struct Config { 7 | pub prefix: String, 8 | pub redis_url: String, 9 | } 10 | 11 | impl Default for Config { 12 | fn default() -> Self { 13 | Self { 14 | prefix: String::new(), 15 | redis_url: "redis://localhost".to_string(), 16 | } 17 | } 18 | } 19 | 20 | #[allow(clippy::module_name_repetitions)] 21 | /// A driver that uses Redis. 22 | pub struct RedisDriver { 23 | prefix: String, 24 | client: redis::Client, 25 | } 26 | 27 | impl Driver for RedisDriver { 28 | type Error = Error; 29 | type Config = Config; 30 | 31 | async fn new(config: Self::Config) -> Result { 32 | Ok(Self { 33 | prefix: config.prefix, 34 | client: redis::Client::open(config.redis_url)?, 35 | }) 36 | } 37 | 38 | async fn get(&self, key: &str) -> Result, Self::Error> { 39 | let mut conn = self.client.get_async_connection().await?; 40 | 41 | let Some(data) = conn 42 | .get::<_, Option>>(format!("{}{key}", self.prefix)) 43 | .await? 44 | else { 45 | return Ok(None); 46 | }; 47 | 48 | Ok(Some(bitcode::deserialize(&data)?)) 49 | } 50 | 51 | async fn has(&self, key: &str) -> Result { 52 | let mut conn = self.client.get_async_connection().await?; 53 | 54 | Ok(conn.exists(format!("{}{key}", self.prefix)).await?) 55 | } 56 | 57 | async fn put( 58 | &mut self, 59 | key: &str, 60 | value: &T, 61 | expiry: Option, 62 | ) -> Result<(), Self::Error> { 63 | let mut conn = self.client.get_async_connection().await?; 64 | let data = bitcode::serialize(value)?; 65 | 66 | if let Some(expiry) = expiry { 67 | conn.set_ex(format!("{}{key}", self.prefix), data, expiry.as_secs()) 68 | .await?; 69 | } else { 70 | conn.set(format!("{}{key}", self.prefix), data).await?; 71 | } 72 | 73 | Ok(()) 74 | } 75 | 76 | async fn forget(&mut self, key: &str) -> Result<(), Self::Error> { 77 | let mut conn = self.client.get_async_connection().await?; 78 | conn.del(format!("{}{key}", self.prefix)).await?; 79 | 80 | Ok(()) 81 | } 82 | 83 | async fn flush(&mut self) -> Result<(), Self::Error> { 84 | let mut conn = self.client.get_async_connection().await?; 85 | redis::cmd("FLUSHDB").query_async(&mut conn).await?; 86 | 87 | Ok(()) 88 | } 89 | } 90 | 91 | #[derive(Debug, thiserror::Error)] 92 | pub enum Error { 93 | #[error(transparent)] 94 | Redis(#[from] redis::RedisError), 95 | #[error(transparent)] 96 | Serialization(#[from] bitcode::Error), 97 | } 98 | 99 | #[cfg(test)] 100 | mod tests { 101 | use std::env; 102 | 103 | use super::*; 104 | use crate::Cache; 105 | 106 | #[tokio::test] 107 | async fn test_redis_driver() { 108 | let mut cache = Cache::::new(Config { 109 | redis_url: env::var("REDIS_URL").expect("REDIS_URL not set"), 110 | ..Default::default() 111 | }) 112 | .await 113 | .unwrap(); 114 | 115 | assert_eq!(cache.get::("foo").await.unwrap(), None); 116 | assert!(!cache.has("foo").await.unwrap()); 117 | 118 | cache 119 | .put("foo", &"bar", Duration::from_secs(1)) 120 | .await 121 | .unwrap(); 122 | 123 | assert_eq!( 124 | cache.get::("foo").await.unwrap(), 125 | Some("bar".to_string()) 126 | ); 127 | assert!(cache.has("foo").await.unwrap()); 128 | 129 | cache.forget("foo").await.unwrap(); 130 | 131 | assert_eq!(cache.get::("foo").await.unwrap(), None); 132 | assert!(!cache.has("foo").await.unwrap()); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/drivers/database.rs: -------------------------------------------------------------------------------- 1 | use super::Driver; 2 | use ensemble::{types::DateTime, Model}; 3 | use serde::{de::DeserializeOwned, Serialize}; 4 | use std::time::Duration; 5 | 6 | #[derive(Debug, Model)] 7 | #[ensemble(table = "cache")] 8 | struct CacheEntry { 9 | #[model(primary)] 10 | pub key: String, 11 | pub value: String, 12 | pub expiration: Option, 13 | } 14 | 15 | #[allow(clippy::module_name_repetitions)] 16 | /// A driver that stores cache entries in a database. 17 | pub struct DatabaseDriver; 18 | 19 | impl Driver for DatabaseDriver { 20 | type Config = (); 21 | type Error = Error; 22 | 23 | async fn new((): Self::Config) -> Result { 24 | Ok(Self) 25 | } 26 | 27 | async fn get(&self, key: &str) -> Result, Self::Error> { 28 | let Some(entry) = CacheEntry::query() 29 | .r#where("key", '=', key) 30 | .where_group(|query| { 31 | query 32 | .where_null("expiration") 33 | .or_where("expiration", '>', DateTime::now()) 34 | }) 35 | .first::() 36 | .await? 37 | else { 38 | return Ok(None); 39 | }; 40 | 41 | Ok(Some(serde_json::from_str::(&entry.value)?)) 42 | } 43 | 44 | async fn has(&self, key: &str) -> Result { 45 | let count = CacheEntry::query() 46 | .r#where("key", '=', key) 47 | .where_null("expiration") 48 | .or_where("expiration", '>', DateTime::now()) 49 | .count() 50 | .await?; 51 | 52 | Ok(count != 0) 53 | } 54 | 55 | async fn put( 56 | &mut self, 57 | key: &str, 58 | value: &T, 59 | duration: Option, 60 | ) -> Result<(), Self::Error> { 61 | let expiration = duration.map(|duration| DateTime::now() + duration); 62 | 63 | // TODO: This should be a single query. 64 | CacheEntry::query() 65 | .r#where("key", '=', key) 66 | .delete() 67 | .await?; 68 | 69 | CacheEntry::create(CacheEntry { 70 | expiration, 71 | key: key.to_string(), 72 | value: serde_json::to_string(value)?, 73 | }) 74 | .await?; 75 | 76 | Ok(()) 77 | } 78 | 79 | async fn forget(&mut self, key: &str) -> Result<(), Self::Error> { 80 | CacheEntry::query() 81 | .r#where("key", '=', key) 82 | .delete() 83 | .await?; 84 | 85 | Ok(()) 86 | } 87 | 88 | async fn flush(&mut self) -> Result<(), Self::Error> { 89 | CacheEntry::query().delete().await?; 90 | 91 | Ok(()) 92 | } 93 | } 94 | 95 | #[derive(Debug, thiserror::Error)] 96 | pub enum Error { 97 | #[error(transparent)] 98 | Database(#[from] ensemble::Error), 99 | #[error(transparent)] 100 | Serialize(#[from] serde_json::Error), 101 | } 102 | 103 | #[cfg(test)] 104 | mod tests { 105 | use std::env; 106 | 107 | use super::*; 108 | use crate::Cache; 109 | 110 | #[tokio::test] 111 | async fn test_database_driver() { 112 | ensemble::setup(&env::var("DATABASE_URL").expect("DATABASE_URL not set")).unwrap(); 113 | 114 | let mut cache = Cache::::new(()).await.unwrap(); 115 | 116 | assert_eq!(cache.get::("foo").await.unwrap(), None); 117 | assert!(!cache.has("foo").await.unwrap()); 118 | 119 | cache 120 | .put("foo", &"bar".to_string(), Duration::from_secs(10)) 121 | .await 122 | .unwrap(); 123 | 124 | assert_eq!(cache.get("foo").await.unwrap(), Some("bar".to_string())); 125 | assert!(cache.has("foo").await.unwrap()); 126 | 127 | cache.forget("foo").await.unwrap(); 128 | 129 | assert_eq!(cache.get::("foo").await.unwrap(), None); 130 | assert!(!cache.has("foo").await.unwrap()); 131 | 132 | cache 133 | .put("foo", &"bar".to_string(), Duration::from_secs(1)) 134 | .await 135 | .unwrap(); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![warn(clippy::all, clippy::pedantic, clippy::nursery)] 2 | //! An expressive interface for interacting with a Cache. 3 | //! Inspired by [Laravel's Cache](https://laravel.com/docs/cache) facade. 4 | 5 | use drivers::Driver; 6 | use serde::{de::DeserializeOwned, Serialize}; 7 | use std::time::Duration; 8 | 9 | pub mod drivers; 10 | 11 | /// Unified cache interface. 12 | pub struct Cache { 13 | driver: D, 14 | } 15 | 16 | impl Cache { 17 | /// Create a new instance of the cache. 18 | /// 19 | /// # Errors 20 | /// 21 | /// Returns an error if the driver fails to initialize. 22 | pub async fn new(config: D::Config) -> Result { 23 | Ok(Self { 24 | driver: D::new(config).await?, 25 | }) 26 | } 27 | 28 | /// Retrieve an item from the cache. 29 | /// 30 | /// # Errors 31 | /// 32 | /// Returns an error if the driver fails to retrieve the item. 33 | pub async fn get(&self, key: &str) -> Result, D::Error> { 34 | self.driver.get(key).await 35 | } 36 | 37 | /// Check if an item exists in the cache. 38 | /// 39 | /// # Errors 40 | /// 41 | /// Returns an error if the driver fails to check if the item exists. 42 | pub async fn has(&self, key: &str) -> Result { 43 | self.driver.has(key).await 44 | } 45 | 46 | /// Retrieve an item from the cache, or store it for some time if it doesn't exist yet. 47 | /// 48 | /// # Errors 49 | /// 50 | /// Returns an error if the driver fails to retrieve or store the item. 51 | pub async fn remember( 52 | &mut self, 53 | key: &str, 54 | duration: Duration, 55 | value: T, 56 | ) -> Result { 57 | let value = if let Some(value) = self.driver.get::(key).await? { 58 | value 59 | } else { 60 | self.put(key, &value, duration).await?; 61 | 62 | value 63 | }; 64 | 65 | Ok(value) 66 | } 67 | 68 | /// Retrieve an item from the cache, or store it forever if it doesn't exist yet. 69 | /// 70 | /// # Errors 71 | /// 72 | /// Returns an error if the driver fails to retrieve or store the item. 73 | pub async fn remember_forever( 74 | &mut self, 75 | key: &str, 76 | value: T, 77 | ) -> Result { 78 | let value = if let Some(value) = self.driver.get::(key).await? { 79 | value 80 | } else { 81 | self.forever(key, &value).await?; 82 | 83 | value 84 | }; 85 | 86 | Ok(value) 87 | } 88 | 89 | /// Remove an item from the cache and return it. 90 | /// 91 | /// # Errors 92 | /// 93 | /// Returns an error if the driver fails to retrieve or remove the item. 94 | pub async fn pull( 95 | &mut self, 96 | key: &str, 97 | ) -> Result, D::Error> { 98 | let Some(item) = self.get(key).await? else { 99 | return Ok(None); 100 | }; 101 | 102 | self.forget(key).await?; 103 | 104 | Ok(Some(item)) 105 | } 106 | 107 | /// Store an item in the cache for a given duration. 108 | /// 109 | /// # Errors 110 | /// 111 | /// Returns an error if the driver fails to store the item. 112 | pub async fn put( 113 | &mut self, 114 | key: &str, 115 | value: &T, 116 | expiry: Duration, 117 | ) -> Result<(), D::Error> { 118 | self.driver.put(key, value, Some(expiry)).await 119 | } 120 | 121 | /// Store an item in the cache if it doesn't exist yet. 122 | /// 123 | /// # Errors 124 | /// 125 | /// Returns an error if the driver fails to store the item. 126 | pub async fn add( 127 | &mut self, 128 | key: &str, 129 | value: T, 130 | expiry: Duration, 131 | ) -> Result { 132 | if self.has(key).await? { 133 | return Ok(false); 134 | } 135 | 136 | self.put(key, &value, expiry).await?; 137 | 138 | Ok(true) 139 | } 140 | 141 | /// Store an item in the cache indefinitely. 142 | /// 143 | /// # Errors 144 | /// 145 | /// Returns an error if the driver fails to store the item. 146 | pub async fn forever( 147 | &mut self, 148 | key: &str, 149 | value: T, 150 | ) -> Result<(), D::Error> { 151 | self.driver.put(key, &value, None).await 152 | } 153 | 154 | /// Remove an item from the cache. 155 | /// 156 | /// # Errors 157 | /// 158 | /// Returns an error if the driver fails to remove the item. 159 | pub async fn forget(&mut self, key: &str) -> Result<(), D::Error> { 160 | self.driver.forget(key).await 161 | } 162 | 163 | /// Remove all items from the cache. 164 | /// 165 | /// # Errors 166 | /// 167 | /// Returns an error if the driver fails to flush the cache. 168 | pub async fn flush(&mut self) -> Result<(), D::Error> { 169 | self.driver.flush().await 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /src/drivers/dynamodb.rs: -------------------------------------------------------------------------------- 1 | use std::time::{Duration, SystemTime, UNIX_EPOCH}; 2 | 3 | use aws_sdk_dynamodb::{primitives::Blob, types::AttributeValue}; 4 | use serde::{de::DeserializeOwned, Serialize}; 5 | 6 | use super::Driver; 7 | 8 | #[derive(Debug, Clone)] 9 | pub struct Config { 10 | pub table: String, 11 | pub prefix: String, 12 | pub key_attribute: String, 13 | pub value_attribute: String, 14 | pub expiration_attribute: String, 15 | pub aws_config: aws_types::SdkConfig, 16 | } 17 | 18 | impl Default for Config { 19 | fn default() -> Self { 20 | Self { 21 | prefix: String::new(), 22 | table: "cache".to_string(), 23 | key_attribute: String::from("key"), 24 | value_attribute: String::from("value"), 25 | expiration_attribute: String::from("expires_at"), 26 | aws_config: aws_types::SdkConfig::builder().build(), 27 | } 28 | } 29 | } 30 | 31 | #[allow(clippy::module_name_repetitions)] 32 | /// A driver that uses DynamoDB as a backend. 33 | pub struct DynamoDBDriver { 34 | table: String, 35 | prefix: String, 36 | key_attribute: String, 37 | value_attribute: String, 38 | expiration_attribute: String, 39 | client: aws_sdk_dynamodb::Client, 40 | } 41 | 42 | impl DynamoDBDriver { 43 | async fn get_item(&self, key: &str) -> Result>, Error> { 44 | let response = self 45 | .client 46 | .get_item() 47 | .table_name(&self.table) 48 | .key( 49 | self.key_attribute.clone(), 50 | AttributeValue::S(format!("{}{key}", self.prefix)), 51 | ) 52 | .send() 53 | .await?; 54 | 55 | let Some(item) = response.item else { 56 | return Ok(None); 57 | }; 58 | 59 | if let Some(expires_at) = item 60 | .get(&self.expiration_attribute) 61 | .map(|value| value.as_n()) 62 | { 63 | let expires_at: u64 = expires_at 64 | .map_err(|_| Error::InvalidDataFormat)? 65 | .parse() 66 | .map_err(|_| Error::InvalidDataFormat)?; 67 | 68 | if UNIX_EPOCH + Duration::from_secs(expires_at) < SystemTime::now() { 69 | return Ok(None); 70 | } 71 | } 72 | 73 | let data = if let Some(data) = item.get(&self.value_attribute).map(|value| value.as_b()) { 74 | data.map_err(|_| Error::InvalidDataFormat)? 75 | } else { 76 | return Err(Error::InvalidDataFormat); 77 | }; 78 | 79 | Ok(Some(data.as_ref().to_vec())) 80 | } 81 | } 82 | 83 | impl Driver for DynamoDBDriver { 84 | type Error = Error; 85 | type Config = Config; 86 | 87 | async fn new(config: Self::Config) -> Result { 88 | Ok(Self { 89 | table: config.table, 90 | prefix: config.prefix, 91 | key_attribute: config.key_attribute, 92 | value_attribute: config.value_attribute, 93 | expiration_attribute: config.expiration_attribute, 94 | client: aws_sdk_dynamodb::Client::new(&config.aws_config), 95 | }) 96 | } 97 | 98 | async fn get(&self, key: &str) -> Result, Self::Error> { 99 | let item = self.get_item(key).await?; 100 | 101 | Ok(item 102 | .map(|item| bitcode::deserialize(item.as_ref())) 103 | .transpose()?) 104 | } 105 | 106 | async fn has(&self, key: &str) -> Result { 107 | let item = self.get_item(key).await?; 108 | 109 | Ok(item.is_some()) 110 | } 111 | 112 | async fn put( 113 | &mut self, 114 | key: &str, 115 | value: &T, 116 | expiry: Option, 117 | ) -> Result<(), Self::Error> { 118 | let expires_at = expiry.map(|expiry| SystemTime::now() + expiry); 119 | 120 | self.client 121 | .put_item() 122 | .table_name(&self.table) 123 | .item( 124 | self.key_attribute.clone(), 125 | AttributeValue::S(format!("{}{key}", self.prefix)), 126 | ) 127 | .item( 128 | self.value_attribute.clone(), 129 | AttributeValue::B(Blob::new(bitcode::serialize(value)?)), 130 | ) 131 | .item( 132 | self.expiration_attribute.clone(), 133 | expires_at.map_or(AttributeValue::Null(true), |expires_at| { 134 | AttributeValue::N( 135 | expires_at 136 | .duration_since(SystemTime::UNIX_EPOCH) 137 | .unwrap() 138 | .as_secs() 139 | .to_string(), 140 | ) 141 | }), 142 | ) 143 | .send() 144 | .await?; 145 | 146 | Ok(()) 147 | } 148 | 149 | async fn forget(&mut self, key: &str) -> Result<(), Self::Error> { 150 | self.client 151 | .delete_item() 152 | .table_name(&self.table) 153 | .key(&self.key_attribute, AttributeValue::S(key.to_string())) 154 | .send() 155 | .await?; 156 | 157 | Ok(()) 158 | } 159 | 160 | async fn flush(&mut self) -> Result<(), Self::Error> { 161 | Err(Error::FlushNotSupported) 162 | } 163 | } 164 | 165 | #[derive(Debug, thiserror::Error)] 166 | pub enum Error { 167 | #[error("DynamoDB does not support flushing the cache.")] 168 | FlushNotSupported, 169 | #[error("the stored data was on an unexpected format.")] 170 | InvalidDataFormat, 171 | #[error(transparent)] 172 | GetItem( 173 | #[from] 174 | aws_smithy_runtime_api::client::result::SdkError< 175 | aws_sdk_dynamodb::operation::get_item::GetItemError, 176 | aws_smithy_runtime_api::client::orchestrator::HttpResponse, 177 | >, 178 | ), 179 | #[error(transparent)] 180 | PutItem( 181 | #[from] 182 | aws_smithy_runtime_api::client::result::SdkError< 183 | aws_sdk_dynamodb::operation::put_item::PutItemError, 184 | aws_smithy_runtime_api::client::orchestrator::HttpResponse, 185 | >, 186 | ), 187 | #[error(transparent)] 188 | DeleteItem( 189 | #[from] 190 | aws_smithy_runtime_api::client::result::SdkError< 191 | aws_sdk_dynamodb::operation::delete_item::DeleteItemError, 192 | aws_smithy_runtime_api::client::orchestrator::HttpResponse, 193 | >, 194 | ), 195 | #[error(transparent)] 196 | Serialization(#[from] bitcode::Error), 197 | } 198 | 199 | #[cfg(test)] 200 | mod tests { 201 | use super::*; 202 | use crate::Cache; 203 | 204 | #[tokio::test] 205 | async fn test_dynamodb_driver() { 206 | let mut cache = Cache::::new(Config::default()) 207 | .await 208 | .unwrap(); 209 | 210 | assert_eq!(cache.get::("foo").await.unwrap(), None); 211 | assert!(!cache.has("foo").await.unwrap()); 212 | 213 | cache 214 | .put("foo", &"bar", Duration::from_secs(1)) 215 | .await 216 | .unwrap(); 217 | 218 | assert_eq!( 219 | cache.get::("foo").await.unwrap(), 220 | Some("bar".to_string()) 221 | ); 222 | assert!(cache.has("foo").await.unwrap()); 223 | 224 | cache.forget("foo").await.unwrap(); 225 | 226 | assert_eq!(cache.get::("foo").await.unwrap(), None); 227 | assert!(!cache.has("foo").await.unwrap()); 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /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 = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | dependencies = [ 11 | "lazy_static", 12 | "regex", 13 | ] 14 | 15 | [[package]] 16 | name = "addr2line" 17 | version = "0.21.0" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 20 | dependencies = [ 21 | "gimli", 22 | ] 23 | 24 | [[package]] 25 | name = "adler" 26 | version = "1.0.2" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 29 | 30 | [[package]] 31 | name = "ahash" 32 | version = "0.7.7" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" 35 | dependencies = [ 36 | "getrandom", 37 | "once_cell", 38 | "version_check", 39 | ] 40 | 41 | [[package]] 42 | name = "ahash" 43 | version = "0.8.6" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" 46 | dependencies = [ 47 | "cfg-if", 48 | "once_cell", 49 | "version_check", 50 | "zerocopy", 51 | ] 52 | 53 | [[package]] 54 | name = "aho-corasick" 55 | version = "1.1.2" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" 58 | dependencies = [ 59 | "memchr", 60 | ] 61 | 62 | [[package]] 63 | name = "allocator-api2" 64 | version = "0.2.16" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" 67 | 68 | [[package]] 69 | name = "amnesia" 70 | version = "0.1.5" 71 | dependencies = [ 72 | "aws-sdk-dynamodb", 73 | "aws-smithy-runtime-api", 74 | "aws-types", 75 | "bitcode", 76 | "ensemble", 77 | "redis", 78 | "serde", 79 | "serde_json", 80 | "thiserror", 81 | "tokio", 82 | ] 83 | 84 | [[package]] 85 | name = "arrayvec" 86 | version = "0.7.4" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" 89 | 90 | [[package]] 91 | name = "async-trait" 92 | version = "0.1.74" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" 95 | dependencies = [ 96 | "proc-macro2", 97 | "quote", 98 | "syn 2.0.41", 99 | ] 100 | 101 | [[package]] 102 | name = "atoi" 103 | version = "2.0.0" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 106 | dependencies = [ 107 | "num-traits", 108 | ] 109 | 110 | [[package]] 111 | name = "autocfg" 112 | version = "1.1.0" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 115 | 116 | [[package]] 117 | name = "aws-credential-types" 118 | version = "1.1.1" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "70a1629320d319dc715c6189b172349186557e209d2a7b893ff3d14efd33a47c" 121 | dependencies = [ 122 | "aws-smithy-async", 123 | "aws-smithy-runtime-api", 124 | "aws-smithy-types", 125 | "zeroize", 126 | ] 127 | 128 | [[package]] 129 | name = "aws-http" 130 | version = "0.60.1" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "30e4199d5d62ab09be6a64650c06cc5c4aa45806fed4c74bc4a5c8eaf039a6fa" 133 | dependencies = [ 134 | "aws-smithy-runtime-api", 135 | "aws-smithy-types", 136 | "aws-types", 137 | "bytes", 138 | "http", 139 | "http-body", 140 | "pin-project-lite", 141 | "tracing", 142 | ] 143 | 144 | [[package]] 145 | name = "aws-runtime" 146 | version = "1.1.1" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "87116d357c905b53f1828d15366363fd27b330a0393cbef349e653f686d36bad" 149 | dependencies = [ 150 | "aws-credential-types", 151 | "aws-http", 152 | "aws-sigv4", 153 | "aws-smithy-async", 154 | "aws-smithy-http", 155 | "aws-smithy-runtime-api", 156 | "aws-smithy-types", 157 | "aws-types", 158 | "fastrand", 159 | "http", 160 | "percent-encoding", 161 | "tracing", 162 | "uuid", 163 | ] 164 | 165 | [[package]] 166 | name = "aws-sdk-dynamodb" 167 | version = "1.7.0" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "c864254afab2f38c9a3de5f7b18bd3e524e3a35313a2bdec421f7616f037c855" 170 | dependencies = [ 171 | "aws-credential-types", 172 | "aws-http", 173 | "aws-runtime", 174 | "aws-smithy-async", 175 | "aws-smithy-http", 176 | "aws-smithy-json", 177 | "aws-smithy-runtime", 178 | "aws-smithy-runtime-api", 179 | "aws-smithy-types", 180 | "aws-types", 181 | "bytes", 182 | "fastrand", 183 | "http", 184 | "once_cell", 185 | "regex-lite", 186 | "tracing", 187 | ] 188 | 189 | [[package]] 190 | name = "aws-sigv4" 191 | version = "1.1.1" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "d222297ca90209dc62245f0a490355795f29de362eb5c19caea4f7f55fe69078" 194 | dependencies = [ 195 | "aws-credential-types", 196 | "aws-smithy-http", 197 | "aws-smithy-runtime-api", 198 | "aws-smithy-types", 199 | "bytes", 200 | "form_urlencoded", 201 | "hex", 202 | "hmac", 203 | "http", 204 | "once_cell", 205 | "percent-encoding", 206 | "sha2", 207 | "time", 208 | "tracing", 209 | ] 210 | 211 | [[package]] 212 | name = "aws-smithy-async" 213 | version = "1.1.1" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "1e9f65000917e3aa94c259d67fe01fa9e4cd456187d026067d642436e6311a81" 216 | dependencies = [ 217 | "futures-util", 218 | "pin-project-lite", 219 | "tokio", 220 | ] 221 | 222 | [[package]] 223 | name = "aws-smithy-http" 224 | version = "0.60.1" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "e4e816425a6b9caea4929ac97d0cb33674849bd5f0086418abc0d02c63f7a1bf" 227 | dependencies = [ 228 | "aws-smithy-runtime-api", 229 | "aws-smithy-types", 230 | "bytes", 231 | "bytes-utils", 232 | "futures-core", 233 | "http", 234 | "http-body", 235 | "once_cell", 236 | "percent-encoding", 237 | "pin-project-lite", 238 | "pin-utils", 239 | "tracing", 240 | ] 241 | 242 | [[package]] 243 | name = "aws-smithy-json" 244 | version = "0.60.1" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "8ab3f6d49e08df2f8d05e1bb5b68998e1e67b76054d3c43e7b954becb9a5e9ac" 247 | dependencies = [ 248 | "aws-smithy-types", 249 | ] 250 | 251 | [[package]] 252 | name = "aws-smithy-runtime" 253 | version = "1.1.1" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "8da5b0a3617390e769576321816112f711c13d7e1114685e022505cf51fe5e48" 256 | dependencies = [ 257 | "aws-smithy-async", 258 | "aws-smithy-http", 259 | "aws-smithy-runtime-api", 260 | "aws-smithy-types", 261 | "bytes", 262 | "fastrand", 263 | "h2", 264 | "http", 265 | "http-body", 266 | "hyper", 267 | "hyper-rustls", 268 | "once_cell", 269 | "pin-project-lite", 270 | "pin-utils", 271 | "rustls", 272 | "tokio", 273 | "tracing", 274 | ] 275 | 276 | [[package]] 277 | name = "aws-smithy-runtime-api" 278 | version = "1.1.1" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "2404c9eb08bfe9af255945254d9afc69a367b7ee008b8db75c05e3bca485fc65" 281 | dependencies = [ 282 | "aws-smithy-async", 283 | "aws-smithy-types", 284 | "bytes", 285 | "http", 286 | "pin-project-lite", 287 | "tokio", 288 | "tracing", 289 | ] 290 | 291 | [[package]] 292 | name = "aws-smithy-types" 293 | version = "1.1.1" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "2aba8136605d14ac88f57dc3a693a9f8a4eab4a3f52bc03ff13746f0cd704e97" 296 | dependencies = [ 297 | "base64-simd", 298 | "bytes", 299 | "bytes-utils", 300 | "futures-core", 301 | "http", 302 | "http-body", 303 | "itoa", 304 | "num-integer", 305 | "pin-project-lite", 306 | "pin-utils", 307 | "ryu", 308 | "serde", 309 | "time", 310 | "tokio", 311 | "tokio-util", 312 | ] 313 | 314 | [[package]] 315 | name = "aws-types" 316 | version = "1.1.1" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "4e5d5ee29077e0fcd5ddd0c227b521a33aaf02434b7cdba1c55eec5c1f18ac47" 319 | dependencies = [ 320 | "aws-credential-types", 321 | "aws-smithy-async", 322 | "aws-smithy-runtime-api", 323 | "aws-smithy-types", 324 | "http", 325 | "rustc_version", 326 | "tracing", 327 | ] 328 | 329 | [[package]] 330 | name = "backtrace" 331 | version = "0.3.69" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" 334 | dependencies = [ 335 | "addr2line", 336 | "cc", 337 | "cfg-if", 338 | "libc", 339 | "miniz_oxide", 340 | "object", 341 | "rustc-demangle", 342 | ] 343 | 344 | [[package]] 345 | name = "base64" 346 | version = "0.21.5" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" 349 | 350 | [[package]] 351 | name = "base64-simd" 352 | version = "0.8.0" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" 355 | dependencies = [ 356 | "outref", 357 | "vsimd", 358 | ] 359 | 360 | [[package]] 361 | name = "base64ct" 362 | version = "1.6.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 365 | 366 | [[package]] 367 | name = "bigdecimal" 368 | version = "0.4.2" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "c06619be423ea5bb86c95f087d5707942791a08a85530df0db2209a3ecfb8bc9" 371 | dependencies = [ 372 | "autocfg", 373 | "libm", 374 | "num-bigint", 375 | "num-integer", 376 | "num-traits", 377 | "serde", 378 | ] 379 | 380 | [[package]] 381 | name = "bitcode" 382 | version = "0.5.0" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "4a278afe77ea4781c806c23d1fa50b5f3c38282247ac78c3f85caa11c325bee1" 385 | dependencies = [ 386 | "bitintr", 387 | "bytemuck", 388 | "from_bytes_or_zeroed", 389 | "residua-zigzag", 390 | "serde", 391 | ] 392 | 393 | [[package]] 394 | name = "bitflags" 395 | version = "1.3.2" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 398 | 399 | [[package]] 400 | name = "bitflags" 401 | version = "2.4.1" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 404 | 405 | [[package]] 406 | name = "bitintr" 407 | version = "0.3.0" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "7ba5a5c4df8ac8673f22698f443ef1ce3853d7f22d5a15ebf66b9a7553b173dd" 410 | 411 | [[package]] 412 | name = "block-buffer" 413 | version = "0.10.4" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 416 | dependencies = [ 417 | "generic-array 0.14.7", 418 | ] 419 | 420 | [[package]] 421 | name = "bumpalo" 422 | version = "3.14.0" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 425 | 426 | [[package]] 427 | name = "bytemuck" 428 | version = "1.14.0" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" 431 | 432 | [[package]] 433 | name = "byteorder" 434 | version = "1.5.0" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 437 | 438 | [[package]] 439 | name = "bytes" 440 | version = "1.5.0" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 443 | 444 | [[package]] 445 | name = "bytes-utils" 446 | version = "0.1.4" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" 449 | dependencies = [ 450 | "bytes", 451 | "either", 452 | ] 453 | 454 | [[package]] 455 | name = "cc" 456 | version = "1.0.83" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 459 | dependencies = [ 460 | "libc", 461 | ] 462 | 463 | [[package]] 464 | name = "cfg-if" 465 | version = "1.0.0" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 468 | 469 | [[package]] 470 | name = "combine" 471 | version = "4.6.6" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" 474 | dependencies = [ 475 | "bytes", 476 | "futures-core", 477 | "memchr", 478 | "pin-project-lite", 479 | "tokio", 480 | "tokio-util", 481 | ] 482 | 483 | [[package]] 484 | name = "const-oid" 485 | version = "0.9.5" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" 488 | 489 | [[package]] 490 | name = "core-foundation" 491 | version = "0.9.4" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 494 | dependencies = [ 495 | "core-foundation-sys", 496 | "libc", 497 | ] 498 | 499 | [[package]] 500 | name = "core-foundation-sys" 501 | version = "0.8.6" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 504 | 505 | [[package]] 506 | name = "cpufeatures" 507 | version = "0.2.11" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" 510 | dependencies = [ 511 | "libc", 512 | ] 513 | 514 | [[package]] 515 | name = "crypto-common" 516 | version = "0.1.6" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 519 | dependencies = [ 520 | "generic-array 0.14.7", 521 | "typenum", 522 | ] 523 | 524 | [[package]] 525 | name = "dark-std" 526 | version = "0.2.9" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "042539a16dd7deaa4005f952d0b966573d2f44ff9f9268e207b520dd735e7a6e" 529 | dependencies = [ 530 | "flume", 531 | "parking_lot", 532 | "serde", 533 | ] 534 | 535 | [[package]] 536 | name = "deluxe" 537 | version = "0.5.0" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "8ed332aaf752b459088acf3dd4eca323e3ef4b83c70a84ca48fb0ec5305f1488" 540 | dependencies = [ 541 | "deluxe-core", 542 | "deluxe-macros", 543 | "once_cell", 544 | "proc-macro2", 545 | "syn 2.0.41", 546 | ] 547 | 548 | [[package]] 549 | name = "deluxe-core" 550 | version = "0.5.0" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "eddada51c8576df9d6a8450c351ff63042b092c9458b8ac7d20f89cbd0ffd313" 553 | dependencies = [ 554 | "arrayvec", 555 | "proc-macro2", 556 | "quote", 557 | "strsim", 558 | "syn 2.0.41", 559 | ] 560 | 561 | [[package]] 562 | name = "deluxe-macros" 563 | version = "0.5.0" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "f87546d9c837f0b7557e47b8bd6eae52c3c223141b76aa233c345c9ab41d9117" 566 | dependencies = [ 567 | "deluxe-core", 568 | "heck", 569 | "if_chain", 570 | "proc-macro-crate", 571 | "proc-macro2", 572 | "quote", 573 | "syn 2.0.41", 574 | ] 575 | 576 | [[package]] 577 | name = "der" 578 | version = "0.7.8" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" 581 | dependencies = [ 582 | "const-oid", 583 | "pem-rfc7468", 584 | "zeroize", 585 | ] 586 | 587 | [[package]] 588 | name = "deranged" 589 | version = "0.3.10" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" 592 | dependencies = [ 593 | "powerfmt", 594 | "serde", 595 | ] 596 | 597 | [[package]] 598 | name = "digest" 599 | version = "0.10.7" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 602 | dependencies = [ 603 | "block-buffer", 604 | "const-oid", 605 | "crypto-common", 606 | "subtle", 607 | ] 608 | 609 | [[package]] 610 | name = "dirs" 611 | version = "5.0.1" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 614 | dependencies = [ 615 | "dirs-sys", 616 | ] 617 | 618 | [[package]] 619 | name = "dirs-sys" 620 | version = "0.4.1" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 623 | dependencies = [ 624 | "libc", 625 | "option-ext", 626 | "redox_users", 627 | "windows-sys", 628 | ] 629 | 630 | [[package]] 631 | name = "dyn-clone" 632 | version = "1.0.16" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" 635 | 636 | [[package]] 637 | name = "either" 638 | version = "1.9.0" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" 641 | 642 | [[package]] 643 | name = "ensemble" 644 | version = "0.0.5" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "e46b673b4b2c6c71078a89f5eb5a57de359591b1b83184debca9143656eeed7b" 647 | dependencies = [ 648 | "Inflector", 649 | "async-trait", 650 | "ensemble_derive", 651 | "fastdate", 652 | "itertools", 653 | "rbatis", 654 | "rbdc-mysql", 655 | "rbdc-pg", 656 | "rbs", 657 | "schemars", 658 | "serde", 659 | "serde_json", 660 | "sha256", 661 | "thiserror", 662 | "tokio", 663 | "tracing", 664 | "uuid", 665 | ] 666 | 667 | [[package]] 668 | name = "ensemble_derive" 669 | version = "0.0.4" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "1fe3d62b1e5a883c400592c0106b12de886b07949217bc7236e072613bfa20b7" 672 | dependencies = [ 673 | "Inflector", 674 | "deluxe", 675 | "pluralizer", 676 | "proc-macro2", 677 | "quote", 678 | "syn 2.0.41", 679 | ] 680 | 681 | [[package]] 682 | name = "equivalent" 683 | version = "1.0.1" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 686 | 687 | [[package]] 688 | name = "fastdate" 689 | version = "0.3.25" 690 | source = "registry+https://github.com/rust-lang/crates.io-index" 691 | checksum = "b49bfae95276284d5837c070864a657bcd302cec06957179c6cc227d815dc36e" 692 | dependencies = [ 693 | "libc", 694 | "once_cell", 695 | "serde", 696 | "time", 697 | "winapi", 698 | ] 699 | 700 | [[package]] 701 | name = "fastrand" 702 | version = "2.0.1" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" 705 | 706 | [[package]] 707 | name = "finl_unicode" 708 | version = "1.2.0" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" 711 | 712 | [[package]] 713 | name = "flume" 714 | version = "0.11.0" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" 717 | dependencies = [ 718 | "futures-core", 719 | "futures-sink", 720 | "spin 0.9.8", 721 | ] 722 | 723 | [[package]] 724 | name = "fnv" 725 | version = "1.0.7" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 728 | 729 | [[package]] 730 | name = "form_urlencoded" 731 | version = "1.2.1" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 734 | dependencies = [ 735 | "percent-encoding", 736 | ] 737 | 738 | [[package]] 739 | name = "from_bytes_or_zeroed" 740 | version = "0.1.0" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "3d25934a78435889223e575c7b0fc36a290c5a312e7a7ae901f10587792e142a" 743 | 744 | [[package]] 745 | name = "futures" 746 | version = "0.3.29" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" 749 | dependencies = [ 750 | "futures-channel", 751 | "futures-core", 752 | "futures-executor", 753 | "futures-io", 754 | "futures-sink", 755 | "futures-task", 756 | "futures-util", 757 | ] 758 | 759 | [[package]] 760 | name = "futures-channel" 761 | version = "0.3.29" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" 764 | dependencies = [ 765 | "futures-core", 766 | "futures-sink", 767 | ] 768 | 769 | [[package]] 770 | name = "futures-core" 771 | version = "0.3.29" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" 774 | 775 | [[package]] 776 | name = "futures-executor" 777 | version = "0.3.29" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" 780 | dependencies = [ 781 | "futures-core", 782 | "futures-task", 783 | "futures-util", 784 | ] 785 | 786 | [[package]] 787 | name = "futures-io" 788 | version = "0.3.29" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" 791 | 792 | [[package]] 793 | name = "futures-macro" 794 | version = "0.3.29" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" 797 | dependencies = [ 798 | "proc-macro2", 799 | "quote", 800 | "syn 2.0.41", 801 | ] 802 | 803 | [[package]] 804 | name = "futures-sink" 805 | version = "0.3.29" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" 808 | 809 | [[package]] 810 | name = "futures-task" 811 | version = "0.3.29" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" 814 | 815 | [[package]] 816 | name = "futures-timer" 817 | version = "3.0.2" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" 820 | 821 | [[package]] 822 | name = "futures-util" 823 | version = "0.3.29" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" 826 | dependencies = [ 827 | "futures-channel", 828 | "futures-core", 829 | "futures-io", 830 | "futures-macro", 831 | "futures-sink", 832 | "futures-task", 833 | "memchr", 834 | "pin-project-lite", 835 | "pin-utils", 836 | "slab", 837 | ] 838 | 839 | [[package]] 840 | name = "generic-array" 841 | version = "0.14.7" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 844 | dependencies = [ 845 | "typenum", 846 | "version_check", 847 | ] 848 | 849 | [[package]] 850 | name = "generic-array" 851 | version = "1.0.0" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "fe739944a5406424e080edccb6add95685130b9f160d5407c639c7df0c5836b0" 854 | dependencies = [ 855 | "typenum", 856 | ] 857 | 858 | [[package]] 859 | name = "getrandom" 860 | version = "0.2.11" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" 863 | dependencies = [ 864 | "cfg-if", 865 | "libc", 866 | "wasi", 867 | ] 868 | 869 | [[package]] 870 | name = "gimli" 871 | version = "0.28.1" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 874 | 875 | [[package]] 876 | name = "h2" 877 | version = "0.3.22" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" 880 | dependencies = [ 881 | "bytes", 882 | "fnv", 883 | "futures-core", 884 | "futures-sink", 885 | "futures-util", 886 | "http", 887 | "indexmap", 888 | "slab", 889 | "tokio", 890 | "tokio-util", 891 | "tracing", 892 | ] 893 | 894 | [[package]] 895 | name = "hashbrown" 896 | version = "0.14.3" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 899 | dependencies = [ 900 | "ahash 0.8.6", 901 | "allocator-api2", 902 | ] 903 | 904 | [[package]] 905 | name = "heck" 906 | version = "0.4.1" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 909 | 910 | [[package]] 911 | name = "hermit-abi" 912 | version = "0.3.3" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" 915 | 916 | [[package]] 917 | name = "hex" 918 | version = "0.4.3" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 921 | 922 | [[package]] 923 | name = "hmac" 924 | version = "0.12.1" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 927 | dependencies = [ 928 | "digest", 929 | ] 930 | 931 | [[package]] 932 | name = "html_parser" 933 | version = "0.6.3" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "ec016cabcf7c9c48f9d5fdc6b03f273585bfce640a0f47a69552039e92b1959a" 936 | dependencies = [ 937 | "pest", 938 | "pest_derive", 939 | "serde", 940 | "serde_derive", 941 | "serde_json", 942 | "thiserror", 943 | ] 944 | 945 | [[package]] 946 | name = "http" 947 | version = "0.2.11" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" 950 | dependencies = [ 951 | "bytes", 952 | "fnv", 953 | "itoa", 954 | ] 955 | 956 | [[package]] 957 | name = "http-body" 958 | version = "0.4.6" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 961 | dependencies = [ 962 | "bytes", 963 | "http", 964 | "pin-project-lite", 965 | ] 966 | 967 | [[package]] 968 | name = "httparse" 969 | version = "1.8.0" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 972 | 973 | [[package]] 974 | name = "httpdate" 975 | version = "1.0.3" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 978 | 979 | [[package]] 980 | name = "hyper" 981 | version = "0.14.27" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" 984 | dependencies = [ 985 | "bytes", 986 | "futures-channel", 987 | "futures-core", 988 | "futures-util", 989 | "h2", 990 | "http", 991 | "http-body", 992 | "httparse", 993 | "httpdate", 994 | "itoa", 995 | "pin-project-lite", 996 | "socket2 0.4.10", 997 | "tokio", 998 | "tower-service", 999 | "tracing", 1000 | "want", 1001 | ] 1002 | 1003 | [[package]] 1004 | name = "hyper-rustls" 1005 | version = "0.24.2" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 1008 | dependencies = [ 1009 | "futures-util", 1010 | "http", 1011 | "hyper", 1012 | "log", 1013 | "rustls", 1014 | "rustls-native-certs", 1015 | "tokio", 1016 | "tokio-rustls", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "idna" 1021 | version = "0.5.0" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 1024 | dependencies = [ 1025 | "unicode-bidi", 1026 | "unicode-normalization", 1027 | ] 1028 | 1029 | [[package]] 1030 | name = "if_chain" 1031 | version = "1.0.2" 1032 | source = "registry+https://github.com/rust-lang/crates.io-index" 1033 | checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" 1034 | 1035 | [[package]] 1036 | name = "indexmap" 1037 | version = "2.1.0" 1038 | source = "registry+https://github.com/rust-lang/crates.io-index" 1039 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 1040 | dependencies = [ 1041 | "equivalent", 1042 | "hashbrown", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "itertools" 1047 | version = "0.12.0" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" 1050 | dependencies = [ 1051 | "either", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "itoa" 1056 | version = "1.0.10" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" 1059 | 1060 | [[package]] 1061 | name = "js-sys" 1062 | version = "0.3.66" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" 1065 | dependencies = [ 1066 | "wasm-bindgen", 1067 | ] 1068 | 1069 | [[package]] 1070 | name = "lazy_static" 1071 | version = "1.4.0" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1074 | dependencies = [ 1075 | "spin 0.5.2", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "libc" 1080 | version = "0.2.151" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" 1083 | 1084 | [[package]] 1085 | name = "libm" 1086 | version = "0.2.8" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" 1089 | 1090 | [[package]] 1091 | name = "libredox" 1092 | version = "0.0.1" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" 1095 | dependencies = [ 1096 | "bitflags 2.4.1", 1097 | "libc", 1098 | "redox_syscall", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "lock_api" 1103 | version = "0.4.11" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" 1106 | dependencies = [ 1107 | "autocfg", 1108 | "scopeguard", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "log" 1113 | version = "0.4.20" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 1116 | 1117 | [[package]] 1118 | name = "lru" 1119 | version = "0.12.1" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" 1122 | dependencies = [ 1123 | "hashbrown", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "md-5" 1128 | version = "0.10.6" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 1131 | dependencies = [ 1132 | "cfg-if", 1133 | "digest", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "memchr" 1138 | version = "2.6.4" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 1141 | 1142 | [[package]] 1143 | name = "metrics" 1144 | version = "0.18.1" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "2e52eb6380b6d2a10eb3434aec0885374490f5b82c8aaf5cd487a183c98be834" 1147 | dependencies = [ 1148 | "ahash 0.7.7", 1149 | "metrics-macros", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "metrics-macros" 1154 | version = "0.5.1" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" 1157 | dependencies = [ 1158 | "proc-macro2", 1159 | "quote", 1160 | "syn 1.0.109", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "miniz_oxide" 1165 | version = "0.7.1" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" 1168 | dependencies = [ 1169 | "adler", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "mio" 1174 | version = "0.8.10" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" 1177 | dependencies = [ 1178 | "libc", 1179 | "wasi", 1180 | "windows-sys", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "mobc" 1185 | version = "0.8.3" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "90eb49dc5d193287ff80e72a86f34cfb27aae562299d22fea215e06ea1059dd3" 1188 | dependencies = [ 1189 | "async-trait", 1190 | "futures-channel", 1191 | "futures-core", 1192 | "futures-timer", 1193 | "futures-util", 1194 | "log", 1195 | "metrics", 1196 | "thiserror", 1197 | "tokio", 1198 | "tracing", 1199 | "tracing-subscriber", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "nu-ansi-term" 1204 | version = "0.46.0" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1207 | dependencies = [ 1208 | "overload", 1209 | "winapi", 1210 | ] 1211 | 1212 | [[package]] 1213 | name = "num-bigint" 1214 | version = "0.4.4" 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" 1216 | checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" 1217 | dependencies = [ 1218 | "autocfg", 1219 | "num-integer", 1220 | "num-traits", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "num-bigint-dig" 1225 | version = "0.8.4" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1228 | dependencies = [ 1229 | "byteorder", 1230 | "lazy_static", 1231 | "libm", 1232 | "num-integer", 1233 | "num-iter", 1234 | "num-traits", 1235 | "rand", 1236 | "smallvec", 1237 | "zeroize", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "num-integer" 1242 | version = "0.1.45" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1245 | dependencies = [ 1246 | "autocfg", 1247 | "num-traits", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "num-iter" 1252 | version = "0.1.43" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" 1255 | dependencies = [ 1256 | "autocfg", 1257 | "num-integer", 1258 | "num-traits", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "num-traits" 1263 | version = "0.2.17" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 1266 | dependencies = [ 1267 | "autocfg", 1268 | "libm", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "num_cpus" 1273 | version = "1.16.0" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1276 | dependencies = [ 1277 | "hermit-abi", 1278 | "libc", 1279 | ] 1280 | 1281 | [[package]] 1282 | name = "object" 1283 | version = "0.32.1" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" 1286 | dependencies = [ 1287 | "memchr", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "once_cell" 1292 | version = "1.19.0" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1295 | 1296 | [[package]] 1297 | name = "openssl-probe" 1298 | version = "0.1.5" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1301 | 1302 | [[package]] 1303 | name = "option-ext" 1304 | version = "0.2.0" 1305 | source = "registry+https://github.com/rust-lang/crates.io-index" 1306 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1307 | 1308 | [[package]] 1309 | name = "outref" 1310 | version = "0.5.1" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" 1313 | 1314 | [[package]] 1315 | name = "overload" 1316 | version = "0.1.1" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1319 | 1320 | [[package]] 1321 | name = "parking_lot" 1322 | version = "0.12.1" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1325 | dependencies = [ 1326 | "lock_api", 1327 | "parking_lot_core", 1328 | ] 1329 | 1330 | [[package]] 1331 | name = "parking_lot_core" 1332 | version = "0.9.9" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" 1335 | dependencies = [ 1336 | "cfg-if", 1337 | "libc", 1338 | "redox_syscall", 1339 | "smallvec", 1340 | "windows-targets", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "pem-rfc7468" 1345 | version = "0.7.0" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1348 | dependencies = [ 1349 | "base64ct", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "percent-encoding" 1354 | version = "2.3.1" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1357 | 1358 | [[package]] 1359 | name = "pest" 1360 | version = "2.7.5" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" 1363 | dependencies = [ 1364 | "memchr", 1365 | "thiserror", 1366 | "ucd-trie", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "pest_derive" 1371 | version = "2.7.5" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" 1374 | dependencies = [ 1375 | "pest", 1376 | "pest_generator", 1377 | ] 1378 | 1379 | [[package]] 1380 | name = "pest_generator" 1381 | version = "2.7.5" 1382 | source = "registry+https://github.com/rust-lang/crates.io-index" 1383 | checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" 1384 | dependencies = [ 1385 | "pest", 1386 | "pest_meta", 1387 | "proc-macro2", 1388 | "quote", 1389 | "syn 2.0.41", 1390 | ] 1391 | 1392 | [[package]] 1393 | name = "pest_meta" 1394 | version = "2.7.5" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" 1397 | dependencies = [ 1398 | "once_cell", 1399 | "pest", 1400 | "sha2", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "pin-project-lite" 1405 | version = "0.2.13" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 1408 | 1409 | [[package]] 1410 | name = "pin-utils" 1411 | version = "0.1.0" 1412 | source = "registry+https://github.com/rust-lang/crates.io-index" 1413 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1414 | 1415 | [[package]] 1416 | name = "pkcs1" 1417 | version = "0.7.5" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1420 | dependencies = [ 1421 | "der", 1422 | "pkcs8", 1423 | "spki", 1424 | ] 1425 | 1426 | [[package]] 1427 | name = "pkcs8" 1428 | version = "0.10.2" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1431 | dependencies = [ 1432 | "der", 1433 | "spki", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "pluralizer" 1438 | version = "0.4.0" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "35e4616e94b67b8b61846ea69d4bf041a62147d569d16f437689229e2677d38c" 1441 | dependencies = [ 1442 | "lazy_static", 1443 | "regex", 1444 | ] 1445 | 1446 | [[package]] 1447 | name = "powerfmt" 1448 | version = "0.2.0" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1451 | 1452 | [[package]] 1453 | name = "ppv-lite86" 1454 | version = "0.2.17" 1455 | source = "registry+https://github.com/rust-lang/crates.io-index" 1456 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1457 | 1458 | [[package]] 1459 | name = "proc-macro-crate" 1460 | version = "1.3.1" 1461 | source = "registry+https://github.com/rust-lang/crates.io-index" 1462 | checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" 1463 | dependencies = [ 1464 | "once_cell", 1465 | "toml_edit", 1466 | ] 1467 | 1468 | [[package]] 1469 | name = "proc-macro2" 1470 | version = "1.0.70" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" 1473 | dependencies = [ 1474 | "unicode-ident", 1475 | ] 1476 | 1477 | [[package]] 1478 | name = "quote" 1479 | version = "1.0.33" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 1482 | dependencies = [ 1483 | "proc-macro2", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "rand" 1488 | version = "0.8.5" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1491 | dependencies = [ 1492 | "libc", 1493 | "rand_chacha", 1494 | "rand_core", 1495 | ] 1496 | 1497 | [[package]] 1498 | name = "rand_chacha" 1499 | version = "0.3.1" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1502 | dependencies = [ 1503 | "ppv-lite86", 1504 | "rand_core", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "rand_core" 1509 | version = "0.6.4" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1512 | dependencies = [ 1513 | "getrandom", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "rbatis" 1518 | version = "4.5.6" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "64160804cacaade69b55c8391bb0a6f35963d399af61f140eaac24acaa9abd55" 1521 | dependencies = [ 1522 | "async-trait", 1523 | "dark-std", 1524 | "futures", 1525 | "futures-core", 1526 | "hex", 1527 | "log", 1528 | "rand", 1529 | "rbatis-codegen", 1530 | "rbatis-macro-driver", 1531 | "rbdc", 1532 | "rbdc-pool-mobc", 1533 | "rbs", 1534 | "serde", 1535 | ] 1536 | 1537 | [[package]] 1538 | name = "rbatis-codegen" 1539 | version = "4.5.5" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "3f23ce0818f25c7db73df5f1c6a807baa115a819d90bb28de32f8f7f7d7e70a9" 1542 | dependencies = [ 1543 | "async-trait", 1544 | "base64", 1545 | "html_parser", 1546 | "proc-macro2", 1547 | "quote", 1548 | "rbs", 1549 | "serde", 1550 | "serde_json", 1551 | "syn 2.0.41", 1552 | "url", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "rbatis-macro-driver" 1557 | version = "4.5.1" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "d56848c9f8665905ac20b1d532f411e72a7b17a0e4c2a574fcfc7a469da85fb3" 1560 | dependencies = [ 1561 | "proc-macro2", 1562 | "quote", 1563 | "rbatis-codegen", 1564 | "syn 2.0.41", 1565 | ] 1566 | 1567 | [[package]] 1568 | name = "rbdc" 1569 | version = "4.5.10" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | checksum = "cac57ce6ad26199803df9ad707dbc11b5d9e28be4f58e0d3a0e1e1112d46391c" 1572 | dependencies = [ 1573 | "async-trait", 1574 | "bigdecimal", 1575 | "bytes", 1576 | "fastdate", 1577 | "futures-channel", 1578 | "futures-core", 1579 | "futures-util", 1580 | "itoa", 1581 | "log", 1582 | "lru", 1583 | "memchr", 1584 | "once_cell", 1585 | "rbs", 1586 | "rustls", 1587 | "rustls-pemfile 2.0.0", 1588 | "serde", 1589 | "serde_bytes", 1590 | "serde_json", 1591 | "tokio", 1592 | "tokio-rustls", 1593 | "uuid", 1594 | "webpki-roots", 1595 | ] 1596 | 1597 | [[package]] 1598 | name = "rbdc-mysql" 1599 | version = "4.5.1" 1600 | source = "registry+https://github.com/rust-lang/crates.io-index" 1601 | checksum = "ff44b478bef9f500fe13a86b12e502edc0804be0564dfe80f8e1960c6634bbd6" 1602 | dependencies = [ 1603 | "bitflags 2.4.1", 1604 | "byteorder", 1605 | "bytes", 1606 | "digest", 1607 | "either", 1608 | "fastdate", 1609 | "futures-core", 1610 | "futures-util", 1611 | "generic-array 1.0.0", 1612 | "hex", 1613 | "log", 1614 | "percent-encoding", 1615 | "rand", 1616 | "rbdc", 1617 | "rbs", 1618 | "rsa", 1619 | "serde", 1620 | "sha-1", 1621 | "sha2", 1622 | "smallvec", 1623 | "url", 1624 | ] 1625 | 1626 | [[package]] 1627 | name = "rbdc-pg" 1628 | version = "4.5.2" 1629 | source = "registry+https://github.com/rust-lang/crates.io-index" 1630 | checksum = "67ba239458861ed2519c2822e74c0244a40b41a2f87787cec03dddb7bda78c5a" 1631 | dependencies = [ 1632 | "atoi", 1633 | "base64", 1634 | "bigdecimal", 1635 | "byteorder", 1636 | "bytes", 1637 | "dirs", 1638 | "either", 1639 | "fastdate", 1640 | "futures-channel", 1641 | "futures-core", 1642 | "futures-util", 1643 | "hmac", 1644 | "itoa", 1645 | "log", 1646 | "md-5", 1647 | "memchr", 1648 | "num-bigint", 1649 | "percent-encoding", 1650 | "rand", 1651 | "rbdc", 1652 | "rbs", 1653 | "serde", 1654 | "sha2", 1655 | "smallvec", 1656 | "stringprep", 1657 | "url", 1658 | "uuid", 1659 | "whoami", 1660 | ] 1661 | 1662 | [[package]] 1663 | name = "rbdc-pool-mobc" 1664 | version = "4.5.6" 1665 | source = "registry+https://github.com/rust-lang/crates.io-index" 1666 | checksum = "640d64eea000a9ce0e75d5d857018de5f7eb5ad908e408e89229c585ede12452" 1667 | dependencies = [ 1668 | "async-trait", 1669 | "futures-core", 1670 | "mobc", 1671 | "rbdc", 1672 | "rbs", 1673 | ] 1674 | 1675 | [[package]] 1676 | name = "rbs" 1677 | version = "4.5.2" 1678 | source = "registry+https://github.com/rust-lang/crates.io-index" 1679 | checksum = "54a942201e51672e4e220c668f274e918389d215c1171c483e29041e869d1639" 1680 | dependencies = [ 1681 | "serde", 1682 | ] 1683 | 1684 | [[package]] 1685 | name = "redis" 1686 | version = "0.24.0" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "c580d9cbbe1d1b479e8d67cf9daf6a62c957e6846048408b80b43ac3f6af84cd" 1689 | dependencies = [ 1690 | "async-trait", 1691 | "bytes", 1692 | "combine", 1693 | "futures-util", 1694 | "itoa", 1695 | "percent-encoding", 1696 | "pin-project-lite", 1697 | "ryu", 1698 | "tokio", 1699 | "tokio-util", 1700 | "url", 1701 | ] 1702 | 1703 | [[package]] 1704 | name = "redox_syscall" 1705 | version = "0.4.1" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 1708 | dependencies = [ 1709 | "bitflags 1.3.2", 1710 | ] 1711 | 1712 | [[package]] 1713 | name = "redox_users" 1714 | version = "0.4.4" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" 1717 | dependencies = [ 1718 | "getrandom", 1719 | "libredox", 1720 | "thiserror", 1721 | ] 1722 | 1723 | [[package]] 1724 | name = "regex" 1725 | version = "1.10.2" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" 1728 | dependencies = [ 1729 | "aho-corasick", 1730 | "memchr", 1731 | "regex-automata", 1732 | "regex-syntax", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "regex-automata" 1737 | version = "0.4.3" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" 1740 | dependencies = [ 1741 | "aho-corasick", 1742 | "memchr", 1743 | "regex-syntax", 1744 | ] 1745 | 1746 | [[package]] 1747 | name = "regex-lite" 1748 | version = "0.1.5" 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" 1750 | checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" 1751 | 1752 | [[package]] 1753 | name = "regex-syntax" 1754 | version = "0.8.2" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" 1757 | 1758 | [[package]] 1759 | name = "residua-zigzag" 1760 | version = "0.1.0" 1761 | source = "registry+https://github.com/rust-lang/crates.io-index" 1762 | checksum = "2b37805477eee599a61753230f511ae94d737f69b536e468e294723ad5f1b75f" 1763 | 1764 | [[package]] 1765 | name = "ring" 1766 | version = "0.17.7" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" 1769 | dependencies = [ 1770 | "cc", 1771 | "getrandom", 1772 | "libc", 1773 | "spin 0.9.8", 1774 | "untrusted", 1775 | "windows-sys", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "rsa" 1780 | version = "0.9.6" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" 1783 | dependencies = [ 1784 | "const-oid", 1785 | "digest", 1786 | "num-bigint-dig", 1787 | "num-integer", 1788 | "num-traits", 1789 | "pkcs1", 1790 | "pkcs8", 1791 | "rand_core", 1792 | "signature", 1793 | "spki", 1794 | "subtle", 1795 | "zeroize", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "rustc-demangle" 1800 | version = "0.1.23" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" 1803 | 1804 | [[package]] 1805 | name = "rustc_version" 1806 | version = "0.4.0" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1809 | dependencies = [ 1810 | "semver", 1811 | ] 1812 | 1813 | [[package]] 1814 | name = "rustls" 1815 | version = "0.21.10" 1816 | source = "registry+https://github.com/rust-lang/crates.io-index" 1817 | checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" 1818 | dependencies = [ 1819 | "log", 1820 | "ring", 1821 | "rustls-webpki", 1822 | "sct", 1823 | ] 1824 | 1825 | [[package]] 1826 | name = "rustls-native-certs" 1827 | version = "0.6.3" 1828 | source = "registry+https://github.com/rust-lang/crates.io-index" 1829 | checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 1830 | dependencies = [ 1831 | "openssl-probe", 1832 | "rustls-pemfile 1.0.4", 1833 | "schannel", 1834 | "security-framework", 1835 | ] 1836 | 1837 | [[package]] 1838 | name = "rustls-pemfile" 1839 | version = "1.0.4" 1840 | source = "registry+https://github.com/rust-lang/crates.io-index" 1841 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1842 | dependencies = [ 1843 | "base64", 1844 | ] 1845 | 1846 | [[package]] 1847 | name = "rustls-pemfile" 1848 | version = "2.0.0" 1849 | source = "registry+https://github.com/rust-lang/crates.io-index" 1850 | checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" 1851 | dependencies = [ 1852 | "base64", 1853 | "rustls-pki-types", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "rustls-pki-types" 1858 | version = "1.0.1" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "e7673e0aa20ee4937c6aacfc12bb8341cfbf054cdd21df6bec5fd0629fe9339b" 1861 | 1862 | [[package]] 1863 | name = "rustls-webpki" 1864 | version = "0.101.7" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 1867 | dependencies = [ 1868 | "ring", 1869 | "untrusted", 1870 | ] 1871 | 1872 | [[package]] 1873 | name = "ryu" 1874 | version = "1.0.16" 1875 | source = "registry+https://github.com/rust-lang/crates.io-index" 1876 | checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" 1877 | 1878 | [[package]] 1879 | name = "schannel" 1880 | version = "0.1.22" 1881 | source = "registry+https://github.com/rust-lang/crates.io-index" 1882 | checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" 1883 | dependencies = [ 1884 | "windows-sys", 1885 | ] 1886 | 1887 | [[package]] 1888 | name = "schemars" 1889 | version = "0.8.16" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" 1892 | dependencies = [ 1893 | "dyn-clone", 1894 | "schemars_derive", 1895 | "serde", 1896 | "serde_json", 1897 | "uuid", 1898 | ] 1899 | 1900 | [[package]] 1901 | name = "schemars_derive" 1902 | version = "0.8.16" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" 1905 | dependencies = [ 1906 | "proc-macro2", 1907 | "quote", 1908 | "serde_derive_internals", 1909 | "syn 1.0.109", 1910 | ] 1911 | 1912 | [[package]] 1913 | name = "scopeguard" 1914 | version = "1.2.0" 1915 | source = "registry+https://github.com/rust-lang/crates.io-index" 1916 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1917 | 1918 | [[package]] 1919 | name = "sct" 1920 | version = "0.7.1" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 1923 | dependencies = [ 1924 | "ring", 1925 | "untrusted", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "security-framework" 1930 | version = "2.9.2" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" 1933 | dependencies = [ 1934 | "bitflags 1.3.2", 1935 | "core-foundation", 1936 | "core-foundation-sys", 1937 | "libc", 1938 | "security-framework-sys", 1939 | ] 1940 | 1941 | [[package]] 1942 | name = "security-framework-sys" 1943 | version = "2.9.1" 1944 | source = "registry+https://github.com/rust-lang/crates.io-index" 1945 | checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" 1946 | dependencies = [ 1947 | "core-foundation-sys", 1948 | "libc", 1949 | ] 1950 | 1951 | [[package]] 1952 | name = "semver" 1953 | version = "1.0.20" 1954 | source = "registry+https://github.com/rust-lang/crates.io-index" 1955 | checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" 1956 | 1957 | [[package]] 1958 | name = "serde" 1959 | version = "1.0.193" 1960 | source = "registry+https://github.com/rust-lang/crates.io-index" 1961 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" 1962 | dependencies = [ 1963 | "serde_derive", 1964 | ] 1965 | 1966 | [[package]] 1967 | name = "serde_bytes" 1968 | version = "0.11.12" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" 1971 | dependencies = [ 1972 | "serde", 1973 | ] 1974 | 1975 | [[package]] 1976 | name = "serde_derive" 1977 | version = "1.0.193" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" 1980 | dependencies = [ 1981 | "proc-macro2", 1982 | "quote", 1983 | "syn 2.0.41", 1984 | ] 1985 | 1986 | [[package]] 1987 | name = "serde_derive_internals" 1988 | version = "0.26.0" 1989 | source = "registry+https://github.com/rust-lang/crates.io-index" 1990 | checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" 1991 | dependencies = [ 1992 | "proc-macro2", 1993 | "quote", 1994 | "syn 1.0.109", 1995 | ] 1996 | 1997 | [[package]] 1998 | name = "serde_json" 1999 | version = "1.0.108" 2000 | source = "registry+https://github.com/rust-lang/crates.io-index" 2001 | checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" 2002 | dependencies = [ 2003 | "itoa", 2004 | "ryu", 2005 | "serde", 2006 | ] 2007 | 2008 | [[package]] 2009 | name = "sha-1" 2010 | version = "0.10.1" 2011 | source = "registry+https://github.com/rust-lang/crates.io-index" 2012 | checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" 2013 | dependencies = [ 2014 | "cfg-if", 2015 | "cpufeatures", 2016 | "digest", 2017 | ] 2018 | 2019 | [[package]] 2020 | name = "sha2" 2021 | version = "0.10.8" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 2024 | dependencies = [ 2025 | "cfg-if", 2026 | "cpufeatures", 2027 | "digest", 2028 | ] 2029 | 2030 | [[package]] 2031 | name = "sha256" 2032 | version = "1.4.0" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386" 2035 | dependencies = [ 2036 | "async-trait", 2037 | "bytes", 2038 | "hex", 2039 | "sha2", 2040 | "tokio", 2041 | ] 2042 | 2043 | [[package]] 2044 | name = "sharded-slab" 2045 | version = "0.1.7" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2048 | dependencies = [ 2049 | "lazy_static", 2050 | ] 2051 | 2052 | [[package]] 2053 | name = "signature" 2054 | version = "2.2.0" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 2057 | dependencies = [ 2058 | "digest", 2059 | "rand_core", 2060 | ] 2061 | 2062 | [[package]] 2063 | name = "slab" 2064 | version = "0.4.9" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2067 | dependencies = [ 2068 | "autocfg", 2069 | ] 2070 | 2071 | [[package]] 2072 | name = "smallvec" 2073 | version = "1.11.2" 2074 | source = "registry+https://github.com/rust-lang/crates.io-index" 2075 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" 2076 | 2077 | [[package]] 2078 | name = "socket2" 2079 | version = "0.4.10" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" 2082 | dependencies = [ 2083 | "libc", 2084 | "winapi", 2085 | ] 2086 | 2087 | [[package]] 2088 | name = "socket2" 2089 | version = "0.5.5" 2090 | source = "registry+https://github.com/rust-lang/crates.io-index" 2091 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" 2092 | dependencies = [ 2093 | "libc", 2094 | "windows-sys", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "spin" 2099 | version = "0.5.2" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 2102 | 2103 | [[package]] 2104 | name = "spin" 2105 | version = "0.9.8" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 2108 | dependencies = [ 2109 | "lock_api", 2110 | ] 2111 | 2112 | [[package]] 2113 | name = "spki" 2114 | version = "0.7.3" 2115 | source = "registry+https://github.com/rust-lang/crates.io-index" 2116 | checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 2117 | dependencies = [ 2118 | "base64ct", 2119 | "der", 2120 | ] 2121 | 2122 | [[package]] 2123 | name = "stringprep" 2124 | version = "0.1.4" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" 2127 | dependencies = [ 2128 | "finl_unicode", 2129 | "unicode-bidi", 2130 | "unicode-normalization", 2131 | ] 2132 | 2133 | [[package]] 2134 | name = "strsim" 2135 | version = "0.10.0" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 2138 | 2139 | [[package]] 2140 | name = "subtle" 2141 | version = "2.5.0" 2142 | source = "registry+https://github.com/rust-lang/crates.io-index" 2143 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 2144 | 2145 | [[package]] 2146 | name = "syn" 2147 | version = "1.0.109" 2148 | source = "registry+https://github.com/rust-lang/crates.io-index" 2149 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 2150 | dependencies = [ 2151 | "proc-macro2", 2152 | "quote", 2153 | "unicode-ident", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "syn" 2158 | version = "2.0.41" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" 2161 | dependencies = [ 2162 | "proc-macro2", 2163 | "quote", 2164 | "unicode-ident", 2165 | ] 2166 | 2167 | [[package]] 2168 | name = "thiserror" 2169 | version = "1.0.50" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" 2172 | dependencies = [ 2173 | "thiserror-impl", 2174 | ] 2175 | 2176 | [[package]] 2177 | name = "thiserror-impl" 2178 | version = "1.0.50" 2179 | source = "registry+https://github.com/rust-lang/crates.io-index" 2180 | checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" 2181 | dependencies = [ 2182 | "proc-macro2", 2183 | "quote", 2184 | "syn 2.0.41", 2185 | ] 2186 | 2187 | [[package]] 2188 | name = "thread_local" 2189 | version = "1.1.7" 2190 | source = "registry+https://github.com/rust-lang/crates.io-index" 2191 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 2192 | dependencies = [ 2193 | "cfg-if", 2194 | "once_cell", 2195 | ] 2196 | 2197 | [[package]] 2198 | name = "time" 2199 | version = "0.3.30" 2200 | source = "registry+https://github.com/rust-lang/crates.io-index" 2201 | checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" 2202 | dependencies = [ 2203 | "deranged", 2204 | "itoa", 2205 | "powerfmt", 2206 | "serde", 2207 | "time-core", 2208 | "time-macros", 2209 | ] 2210 | 2211 | [[package]] 2212 | name = "time-core" 2213 | version = "0.1.2" 2214 | source = "registry+https://github.com/rust-lang/crates.io-index" 2215 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 2216 | 2217 | [[package]] 2218 | name = "time-macros" 2219 | version = "0.2.15" 2220 | source = "registry+https://github.com/rust-lang/crates.io-index" 2221 | checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" 2222 | dependencies = [ 2223 | "time-core", 2224 | ] 2225 | 2226 | [[package]] 2227 | name = "tinyvec" 2228 | version = "1.6.0" 2229 | source = "registry+https://github.com/rust-lang/crates.io-index" 2230 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2231 | dependencies = [ 2232 | "tinyvec_macros", 2233 | ] 2234 | 2235 | [[package]] 2236 | name = "tinyvec_macros" 2237 | version = "0.1.1" 2238 | source = "registry+https://github.com/rust-lang/crates.io-index" 2239 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2240 | 2241 | [[package]] 2242 | name = "tokio" 2243 | version = "1.35.0" 2244 | source = "registry+https://github.com/rust-lang/crates.io-index" 2245 | checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" 2246 | dependencies = [ 2247 | "backtrace", 2248 | "bytes", 2249 | "libc", 2250 | "mio", 2251 | "num_cpus", 2252 | "pin-project-lite", 2253 | "socket2 0.5.5", 2254 | "tokio-macros", 2255 | "windows-sys", 2256 | ] 2257 | 2258 | [[package]] 2259 | name = "tokio-macros" 2260 | version = "2.2.0" 2261 | source = "registry+https://github.com/rust-lang/crates.io-index" 2262 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 2263 | dependencies = [ 2264 | "proc-macro2", 2265 | "quote", 2266 | "syn 2.0.41", 2267 | ] 2268 | 2269 | [[package]] 2270 | name = "tokio-rustls" 2271 | version = "0.24.1" 2272 | source = "registry+https://github.com/rust-lang/crates.io-index" 2273 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2274 | dependencies = [ 2275 | "rustls", 2276 | "tokio", 2277 | ] 2278 | 2279 | [[package]] 2280 | name = "tokio-util" 2281 | version = "0.7.10" 2282 | source = "registry+https://github.com/rust-lang/crates.io-index" 2283 | checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" 2284 | dependencies = [ 2285 | "bytes", 2286 | "futures-core", 2287 | "futures-sink", 2288 | "pin-project-lite", 2289 | "tokio", 2290 | "tracing", 2291 | ] 2292 | 2293 | [[package]] 2294 | name = "toml_datetime" 2295 | version = "0.6.5" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" 2298 | 2299 | [[package]] 2300 | name = "toml_edit" 2301 | version = "0.19.15" 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" 2303 | checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 2304 | dependencies = [ 2305 | "indexmap", 2306 | "toml_datetime", 2307 | "winnow", 2308 | ] 2309 | 2310 | [[package]] 2311 | name = "tower-service" 2312 | version = "0.3.2" 2313 | source = "registry+https://github.com/rust-lang/crates.io-index" 2314 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2315 | 2316 | [[package]] 2317 | name = "tracing" 2318 | version = "0.1.40" 2319 | source = "registry+https://github.com/rust-lang/crates.io-index" 2320 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2321 | dependencies = [ 2322 | "pin-project-lite", 2323 | "tracing-attributes", 2324 | "tracing-core", 2325 | ] 2326 | 2327 | [[package]] 2328 | name = "tracing-attributes" 2329 | version = "0.1.27" 2330 | source = "registry+https://github.com/rust-lang/crates.io-index" 2331 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2332 | dependencies = [ 2333 | "proc-macro2", 2334 | "quote", 2335 | "syn 2.0.41", 2336 | ] 2337 | 2338 | [[package]] 2339 | name = "tracing-core" 2340 | version = "0.1.32" 2341 | source = "registry+https://github.com/rust-lang/crates.io-index" 2342 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2343 | dependencies = [ 2344 | "once_cell", 2345 | "valuable", 2346 | ] 2347 | 2348 | [[package]] 2349 | name = "tracing-log" 2350 | version = "0.2.0" 2351 | source = "registry+https://github.com/rust-lang/crates.io-index" 2352 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2353 | dependencies = [ 2354 | "log", 2355 | "once_cell", 2356 | "tracing-core", 2357 | ] 2358 | 2359 | [[package]] 2360 | name = "tracing-subscriber" 2361 | version = "0.3.18" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2364 | dependencies = [ 2365 | "nu-ansi-term", 2366 | "sharded-slab", 2367 | "smallvec", 2368 | "thread_local", 2369 | "tracing-core", 2370 | "tracing-log", 2371 | ] 2372 | 2373 | [[package]] 2374 | name = "try-lock" 2375 | version = "0.2.5" 2376 | source = "registry+https://github.com/rust-lang/crates.io-index" 2377 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2378 | 2379 | [[package]] 2380 | name = "typenum" 2381 | version = "1.17.0" 2382 | source = "registry+https://github.com/rust-lang/crates.io-index" 2383 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2384 | 2385 | [[package]] 2386 | name = "ucd-trie" 2387 | version = "0.1.6" 2388 | source = "registry+https://github.com/rust-lang/crates.io-index" 2389 | checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" 2390 | 2391 | [[package]] 2392 | name = "unicode-bidi" 2393 | version = "0.3.14" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" 2396 | 2397 | [[package]] 2398 | name = "unicode-ident" 2399 | version = "1.0.12" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2402 | 2403 | [[package]] 2404 | name = "unicode-normalization" 2405 | version = "0.1.22" 2406 | source = "registry+https://github.com/rust-lang/crates.io-index" 2407 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 2408 | dependencies = [ 2409 | "tinyvec", 2410 | ] 2411 | 2412 | [[package]] 2413 | name = "untrusted" 2414 | version = "0.9.0" 2415 | source = "registry+https://github.com/rust-lang/crates.io-index" 2416 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2417 | 2418 | [[package]] 2419 | name = "url" 2420 | version = "2.5.0" 2421 | source = "registry+https://github.com/rust-lang/crates.io-index" 2422 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2423 | dependencies = [ 2424 | "form_urlencoded", 2425 | "idna", 2426 | "percent-encoding", 2427 | ] 2428 | 2429 | [[package]] 2430 | name = "uuid" 2431 | version = "1.6.1" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" 2434 | dependencies = [ 2435 | "getrandom", 2436 | "serde", 2437 | ] 2438 | 2439 | [[package]] 2440 | name = "valuable" 2441 | version = "0.1.0" 2442 | source = "registry+https://github.com/rust-lang/crates.io-index" 2443 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2444 | 2445 | [[package]] 2446 | name = "version_check" 2447 | version = "0.9.4" 2448 | source = "registry+https://github.com/rust-lang/crates.io-index" 2449 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2450 | 2451 | [[package]] 2452 | name = "vsimd" 2453 | version = "0.8.0" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" 2456 | 2457 | [[package]] 2458 | name = "want" 2459 | version = "0.3.1" 2460 | source = "registry+https://github.com/rust-lang/crates.io-index" 2461 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2462 | dependencies = [ 2463 | "try-lock", 2464 | ] 2465 | 2466 | [[package]] 2467 | name = "wasi" 2468 | version = "0.11.0+wasi-snapshot-preview1" 2469 | source = "registry+https://github.com/rust-lang/crates.io-index" 2470 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2471 | 2472 | [[package]] 2473 | name = "wasm-bindgen" 2474 | version = "0.2.89" 2475 | source = "registry+https://github.com/rust-lang/crates.io-index" 2476 | checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" 2477 | dependencies = [ 2478 | "cfg-if", 2479 | "wasm-bindgen-macro", 2480 | ] 2481 | 2482 | [[package]] 2483 | name = "wasm-bindgen-backend" 2484 | version = "0.2.89" 2485 | source = "registry+https://github.com/rust-lang/crates.io-index" 2486 | checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" 2487 | dependencies = [ 2488 | "bumpalo", 2489 | "log", 2490 | "once_cell", 2491 | "proc-macro2", 2492 | "quote", 2493 | "syn 2.0.41", 2494 | "wasm-bindgen-shared", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "wasm-bindgen-macro" 2499 | version = "0.2.89" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" 2502 | dependencies = [ 2503 | "quote", 2504 | "wasm-bindgen-macro-support", 2505 | ] 2506 | 2507 | [[package]] 2508 | name = "wasm-bindgen-macro-support" 2509 | version = "0.2.89" 2510 | source = "registry+https://github.com/rust-lang/crates.io-index" 2511 | checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" 2512 | dependencies = [ 2513 | "proc-macro2", 2514 | "quote", 2515 | "syn 2.0.41", 2516 | "wasm-bindgen-backend", 2517 | "wasm-bindgen-shared", 2518 | ] 2519 | 2520 | [[package]] 2521 | name = "wasm-bindgen-shared" 2522 | version = "0.2.89" 2523 | source = "registry+https://github.com/rust-lang/crates.io-index" 2524 | checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" 2525 | 2526 | [[package]] 2527 | name = "web-sys" 2528 | version = "0.3.66" 2529 | source = "registry+https://github.com/rust-lang/crates.io-index" 2530 | checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" 2531 | dependencies = [ 2532 | "js-sys", 2533 | "wasm-bindgen", 2534 | ] 2535 | 2536 | [[package]] 2537 | name = "webpki-roots" 2538 | version = "0.26.0" 2539 | source = "registry+https://github.com/rust-lang/crates.io-index" 2540 | checksum = "0de2cfda980f21be5a7ed2eadb3e6fe074d56022bea2cdeb1a62eb220fc04188" 2541 | dependencies = [ 2542 | "rustls-pki-types", 2543 | ] 2544 | 2545 | [[package]] 2546 | name = "whoami" 2547 | version = "1.4.1" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" 2550 | dependencies = [ 2551 | "wasm-bindgen", 2552 | "web-sys", 2553 | ] 2554 | 2555 | [[package]] 2556 | name = "winapi" 2557 | version = "0.3.9" 2558 | source = "registry+https://github.com/rust-lang/crates.io-index" 2559 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2560 | dependencies = [ 2561 | "winapi-i686-pc-windows-gnu", 2562 | "winapi-x86_64-pc-windows-gnu", 2563 | ] 2564 | 2565 | [[package]] 2566 | name = "winapi-i686-pc-windows-gnu" 2567 | version = "0.4.0" 2568 | source = "registry+https://github.com/rust-lang/crates.io-index" 2569 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2570 | 2571 | [[package]] 2572 | name = "winapi-x86_64-pc-windows-gnu" 2573 | version = "0.4.0" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2576 | 2577 | [[package]] 2578 | name = "windows-sys" 2579 | version = "0.48.0" 2580 | source = "registry+https://github.com/rust-lang/crates.io-index" 2581 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2582 | dependencies = [ 2583 | "windows-targets", 2584 | ] 2585 | 2586 | [[package]] 2587 | name = "windows-targets" 2588 | version = "0.48.5" 2589 | source = "registry+https://github.com/rust-lang/crates.io-index" 2590 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2591 | dependencies = [ 2592 | "windows_aarch64_gnullvm", 2593 | "windows_aarch64_msvc", 2594 | "windows_i686_gnu", 2595 | "windows_i686_msvc", 2596 | "windows_x86_64_gnu", 2597 | "windows_x86_64_gnullvm", 2598 | "windows_x86_64_msvc", 2599 | ] 2600 | 2601 | [[package]] 2602 | name = "windows_aarch64_gnullvm" 2603 | version = "0.48.5" 2604 | source = "registry+https://github.com/rust-lang/crates.io-index" 2605 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2606 | 2607 | [[package]] 2608 | name = "windows_aarch64_msvc" 2609 | version = "0.48.5" 2610 | source = "registry+https://github.com/rust-lang/crates.io-index" 2611 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2612 | 2613 | [[package]] 2614 | name = "windows_i686_gnu" 2615 | version = "0.48.5" 2616 | source = "registry+https://github.com/rust-lang/crates.io-index" 2617 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2618 | 2619 | [[package]] 2620 | name = "windows_i686_msvc" 2621 | version = "0.48.5" 2622 | source = "registry+https://github.com/rust-lang/crates.io-index" 2623 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2624 | 2625 | [[package]] 2626 | name = "windows_x86_64_gnu" 2627 | version = "0.48.5" 2628 | source = "registry+https://github.com/rust-lang/crates.io-index" 2629 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2630 | 2631 | [[package]] 2632 | name = "windows_x86_64_gnullvm" 2633 | version = "0.48.5" 2634 | source = "registry+https://github.com/rust-lang/crates.io-index" 2635 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2636 | 2637 | [[package]] 2638 | name = "windows_x86_64_msvc" 2639 | version = "0.48.5" 2640 | source = "registry+https://github.com/rust-lang/crates.io-index" 2641 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2642 | 2643 | [[package]] 2644 | name = "winnow" 2645 | version = "0.5.28" 2646 | source = "registry+https://github.com/rust-lang/crates.io-index" 2647 | checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2" 2648 | dependencies = [ 2649 | "memchr", 2650 | ] 2651 | 2652 | [[package]] 2653 | name = "zerocopy" 2654 | version = "0.7.31" 2655 | source = "registry+https://github.com/rust-lang/crates.io-index" 2656 | checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" 2657 | dependencies = [ 2658 | "zerocopy-derive", 2659 | ] 2660 | 2661 | [[package]] 2662 | name = "zerocopy-derive" 2663 | version = "0.7.31" 2664 | source = "registry+https://github.com/rust-lang/crates.io-index" 2665 | checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" 2666 | dependencies = [ 2667 | "proc-macro2", 2668 | "quote", 2669 | "syn 2.0.41", 2670 | ] 2671 | 2672 | [[package]] 2673 | name = "zeroize" 2674 | version = "1.7.0" 2675 | source = "registry+https://github.com/rust-lang/crates.io-index" 2676 | checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" 2677 | --------------------------------------------------------------------------------