From 28637ef731c82954d87b3873028243c71b2cb848 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sat, 2 Dec 2023 17:35:47 +0100 Subject: [PATCH 1/3] Add Default, Hash, etc. where needed --- src/instance.rs | 42 ++++++++++++++++++- src/lib.rs | 3 +- .../config/types/general_configuration.rs | 2 +- .../subconfigs/limits/ratelimits/auth.rs | 2 +- .../types/subconfigs/limits/ratelimits/mod.rs | 2 +- .../subconfigs/limits/ratelimits/route.rs | 2 +- .../config/types/subconfigs/limits/rates.rs | 2 +- src/types/entities/ratelimits.rs | 2 +- tests/auth.rs | 2 - 9 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/instance.rs b/src/instance.rs index 4ce4338..8e160b8 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -15,22 +15,60 @@ use crate::types::types::subconfigs::limits::rates::RateLimits; use crate::types::{GeneralConfiguration, Limit, LimitType, User, UserSettings}; use crate::UrlBundle; -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone, Default, Serialize, Deserialize)] /// The [`Instance`]; what you will be using to perform all sorts of actions on the Spacebar server. /// If `limits_information` is `None`, then the instance will not be rate limited. pub struct Instance { pub urls: UrlBundle, pub instance_info: GeneralConfiguration, pub limits_information: Option, + #[serde(skip)] pub client: Client, } -#[derive(Debug, Clone, Serialize, Deserialize, Default)] +impl PartialEq for Instance { + fn eq(&self, other: &Self) -> bool { + self.urls == other.urls + && self.instance_info == other.instance_info + && self.limits_information == other.limits_information + } +} + +impl Eq for Instance {} + +impl std::hash::Hash for Instance { + fn hash(&self, state: &mut H) { + self.urls.hash(state); + self.instance_info.hash(state); + if let Some(inf) = &self.limits_information { + inf.hash(state); + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, Default, Eq)] pub struct LimitsInformation { pub ratelimits: HashMap, pub configuration: RateLimits, } +impl std::hash::Hash for LimitsInformation { + fn hash(&self, state: &mut H) { + for (k, v) in self.ratelimits.iter() { + k.hash(state); + v.hash(state); + } + self.configuration.hash(state); + } +} + +impl PartialEq for LimitsInformation { + fn eq(&self, other: &Self) -> bool { + self.ratelimits.iter().eq(other.ratelimits.iter()) + && self.configuration == other.configuration + } +} + impl Instance { /// Creates a new [`Instance`] from the [relevant instance urls](UrlBundle), where `limited` is whether or not to automatically use rate limits. pub async fn new(urls: UrlBundle, limited: bool) -> ChorusResult { diff --git a/src/lib.rs b/src/lib.rs index e187e44..278a002 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -104,6 +104,7 @@ This crate uses Semantic Versioning 2.0.0 as its versioning scheme. You can read #[cfg(all(feature = "rt", feature = "rt_multi_thread"))] compile_error!("feature \"rt\" and feature \"rt_multi_thread\" cannot be enabled at the same time"); +use serde::{Serialize, Deserialize}; use url::{ParseError, Url}; #[cfg(feature = "client")] @@ -119,7 +120,7 @@ pub mod types; #[cfg(feature = "client")] pub mod voice; -#[derive(Clone, Default, Debug, PartialEq, Eq, Hash)] +#[derive(Clone, Default, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] /// A URLBundle bundles together the API-, Gateway- and CDN-URLs of a Spacebar instance. /// /// # Notes diff --git a/src/types/config/types/general_configuration.rs b/src/types/config/types/general_configuration.rs index 13b3aa8..450fd52 100644 --- a/src/types/config/types/general_configuration.rs +++ b/src/types/config/types/general_configuration.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; use crate::types::utils::Snowflake; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] #[serde(rename_all = "camelCase")] pub struct GeneralConfiguration { pub instance_name: String, diff --git a/src/types/config/types/subconfigs/limits/ratelimits/auth.rs b/src/types/config/types/subconfigs/limits/ratelimits/auth.rs index f5abb0f..9815a5d 100644 --- a/src/types/config/types/subconfigs/limits/ratelimits/auth.rs +++ b/src/types/config/types/subconfigs/limits/ratelimits/auth.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; use crate::types::config::types::subconfigs::limits::ratelimits::RateLimitOptions; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct AuthRateLimit { pub login: RateLimitOptions, pub register: RateLimitOptions, diff --git a/src/types/config/types/subconfigs/limits/ratelimits/mod.rs b/src/types/config/types/subconfigs/limits/ratelimits/mod.rs index 66a2b78..934b922 100644 --- a/src/types/config/types/subconfigs/limits/ratelimits/mod.rs +++ b/src/types/config/types/subconfigs/limits/ratelimits/mod.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; pub mod auth; pub mod route; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] #[serde(rename_all = "camelCase")] pub struct RateLimitOptions { pub bot: Option, diff --git a/src/types/config/types/subconfigs/limits/ratelimits/route.rs b/src/types/config/types/subconfigs/limits/ratelimits/route.rs index 5529af3..1aa0be2 100644 --- a/src/types/config/types/subconfigs/limits/ratelimits/route.rs +++ b/src/types/config/types/subconfigs/limits/ratelimits/route.rs @@ -4,7 +4,7 @@ use crate::types::config::types::subconfigs::limits::ratelimits::{ auth::AuthRateLimit, RateLimitOptions, }; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct RouteRateLimit { pub guild: RateLimitOptions, pub webhook: RateLimitOptions, diff --git a/src/types/config/types/subconfigs/limits/rates.rs b/src/types/config/types/subconfigs/limits/rates.rs index 8fdd183..642dcc8 100644 --- a/src/types/config/types/subconfigs/limits/rates.rs +++ b/src/types/config/types/subconfigs/limits/rates.rs @@ -7,7 +7,7 @@ use crate::types::{ LimitType, }; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash)] pub struct RateLimits { pub enabled: bool, pub ip: RateLimitOptions, diff --git a/src/types/entities/ratelimits.rs b/src/types/entities/ratelimits.rs index a95a2c6..f766a12 100644 --- a/src/types/entities/ratelimits.rs +++ b/src/types/entities/ratelimits.rs @@ -25,7 +25,7 @@ pub enum LimitType { /// A struct that represents the current ratelimits, either instance-wide or user-wide. /// See for more information. -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] pub struct Limit { pub bucket: LimitType, pub limit: u64, diff --git a/tests/auth.rs b/tests/auth.rs index c105841..130bfb6 100644 --- a/tests/auth.rs +++ b/tests/auth.rs @@ -1,5 +1,3 @@ -use std::borrow::BorrowMut; - use chorus::types::{LoginSchema, RegisterSchema}; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::*; From 2a40f804c1edd2c1702ab296ce6b9ff49b8cfe2a Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sat, 2 Dec 2023 17:36:36 +0100 Subject: [PATCH 2/3] fix import order --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 278a002..c3c5957 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -104,7 +104,7 @@ This crate uses Semantic Versioning 2.0.0 as its versioning scheme. You can read #[cfg(all(feature = "rt", feature = "rt_multi_thread"))] compile_error!("feature \"rt\" and feature \"rt_multi_thread\" cannot be enabled at the same time"); -use serde::{Serialize, Deserialize}; +use serde::{Deserialize, Serialize}; use url::{ParseError, Url}; #[cfg(feature = "client")] From 734cbf8d302393c2cd4bdee0a5dcafa641e29083 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sat, 2 Dec 2023 17:44:24 +0100 Subject: [PATCH 3/3] Mark code blocks as no-run --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c3c5957..71e0553 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,7 @@ instead of worrying about the underlying implementation details. To connect to a Spacebar compatible server, you need to create an [`Instance`](https://docs.rs/chorus/latest/chorus/instance/struct.Instance.html) like this: -``` +```rs use chorus::instance::Instance; use chorus::UrlBundle; @@ -35,7 +35,7 @@ This Instance can now be used to log in, register and from there on, interact wi Logging in correctly provides you with an instance of [`ChorusUser`](https://docs.rs/chorus/latest/chorus/instance/struct.ChorusUser.html), with which you can interact with the server and manipulate the account. Assuming you already have an account on the server, you can log in like this: -``` +```rs use chorus::types::LoginSchema; // Assume, you already have an account created on this instance. Registering an account works // the same way, but you'd use the Register-specific Structs and methods instead.