From 6f5a2a5e9024fca4687efeb8b03c2650ec111a7d Mon Sep 17 00:00:00 2001 From: "D. Scott Boggs" Date: Wed, 1 Feb 2023 15:06:37 -0500 Subject: [PATCH] Add is_variant methods to all enums --- Cargo.toml | 1 + entities/Cargo.toml | 1 + entities/src/attachment.rs | 3 ++- entities/src/error.rs | 4 +++- entities/src/event.rs | 3 ++- entities/src/filter.rs | 5 +++-- entities/src/notification.rs | 3 ++- entities/src/visibility.rs | 17 ++++++++++++++++- src/errors.rs | 3 ++- src/scopes.rs | 14 ++++++-------- 10 files changed, 38 insertions(+), 16 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7c92541..a238076 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,6 +48,7 @@ static_assertions = "1.1.0" percent-encoding = "2.2.0" thiserror = "1.0.38" derive_deref = "1.1.1" +is_variant = "1.0.0" [dependencies.parse_link_header] version = "0.3.3" diff --git a/entities/Cargo.toml b/entities/Cargo.toml index ef1838e..30d2153 100644 --- a/entities/Cargo.toml +++ b/entities/Cargo.toml @@ -13,6 +13,7 @@ edition.workspace = true futures = "0.3.25" thiserror = "1" static_assertions = "1" +is_variant = "1.0.0" [dependencies.log] version = "0.4" diff --git a/entities/src/attachment.rs b/entities/src/attachment.rs index 489d0fa..65e0cf1 100644 --- a/entities/src/attachment.rs +++ b/entities/src/attachment.rs @@ -1,6 +1,7 @@ //! Module containing everything related to media attachements. use crate::AttachmentId; +use is_variant::IsVariant; use serde::{Deserialize, Serialize}; /// A struct representing a media attachment. @@ -62,7 +63,7 @@ pub struct ImageDetails { } /// The type of media attachment. -#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq, IsVariant)] pub enum MediaType { /// An image. #[serde(rename = "image")] diff --git a/entities/src/error.rs b/entities/src/error.rs index d4e52ce..bf07202 100644 --- a/entities/src/error.rs +++ b/entities/src/error.rs @@ -1,5 +1,7 @@ +use is_variant::IsVariant; + /// Error type -#[derive(Debug, thiserror::Error)] +#[derive(Debug, thiserror::Error, IsVariant)] pub enum Error { #[error("unrecognized visibility '{invalid}'")] VisibilityParsingError { invalid: String }, diff --git a/entities/src/event.rs b/entities/src/event.rs index 007aedd..2898e4c 100644 --- a/entities/src/event.rs +++ b/entities/src/event.rs @@ -1,7 +1,8 @@ use crate::{notification::Notification, status::Status}; +use is_variant::IsVariant; use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, IsVariant)] /// Events that come from the /streaming/user API call pub enum Event { /// Update event diff --git a/entities/src/filter.rs b/entities/src/filter.rs index b0fea28..6b0e110 100644 --- a/entities/src/filter.rs +++ b/entities/src/filter.rs @@ -1,3 +1,4 @@ +use is_variant::IsVariant; use serde::{de::Visitor, Deserialize, Deserializer, Serialize}; use time::{serde::iso8601, OffsetDateTime}; @@ -54,7 +55,7 @@ pub struct Filter { } /// Represents the various types of Filter contexts -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, IsVariant)] #[serde(rename_all = "lowercase")] pub enum FilterContext { /// Represents the "home" context @@ -73,7 +74,7 @@ pub enum FilterContext { /// /// Please note that the spec requests that any unknown value be interpreted /// as "warn". -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, IsVariant)] #[serde(rename_all = "lowercase")] pub enum Action { /// Indicates filtered toots should show up, but with a warning diff --git a/entities/src/notification.rs b/entities/src/notification.rs index adaa7f9..06bdc5b 100644 --- a/entities/src/notification.rs +++ b/entities/src/notification.rs @@ -3,6 +3,7 @@ use crate::NotificationId; use super::{account::Account, status::Status}; +use is_variant::IsVariant; use serde::{Deserialize, Serialize}; use time::{serde::iso8601, OffsetDateTime}; @@ -25,7 +26,7 @@ pub struct Notification { } /// The type of notification. -#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, IsVariant)] #[serde(rename_all = "lowercase")] pub enum NotificationType { /// Someone mentioned the application client in another status. diff --git a/entities/src/visibility.rs b/entities/src/visibility.rs index 590c550..c0f3760 100644 --- a/entities/src/visibility.rs +++ b/entities/src/visibility.rs @@ -1,8 +1,9 @@ +use is_variant::IsVariant; use serde::Deserialize; use serde::Serialize; /// The visibility of a status. -#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq, IsVariant)] #[serde(rename_all = "lowercase")] pub enum Visibility { /// A Direct message to a user @@ -36,3 +37,17 @@ impl std::str::FromStr for Visibility { } } } + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use super::*; + + #[test] + fn test_from_str() { + assert!(Visibility::from_str("invalid") + .expect_err("parsed invalid?") + .is_visibility_parsing_error()); + } +} diff --git a/src/errors.rs b/src/errors.rs index ac4d08d..b7bb0f8 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -3,6 +3,7 @@ use std::{error, fmt, io::Error as IoError, num::TryFromIntError}; #[cfg(feature = "env")] use envy::Error as EnvyError; +use is_variant::IsVariant; use reqwest::{header::ToStrError as HeaderStrError, Error as HttpError, StatusCode}; use serde::Deserialize; use serde_json::Error as SerdeError; @@ -17,7 +18,7 @@ use url::ParseError as UrlError; pub type Result = ::std::result::Result; /// enum of possible errors encountered using the mastodon API. -#[derive(Debug, thiserror::Error)] +#[derive(Debug, thiserror::Error, IsVariant)] pub enum Error { /// Error from the Mastodon API. This typically means something went /// wrong with your authentication or data. diff --git a/src/scopes.rs b/src/scopes.rs index 4efd8f5..afd1d78 100644 --- a/src/scopes.rs +++ b/src/scopes.rs @@ -6,6 +6,7 @@ use std::{ str::FromStr, }; +use is_variant::IsVariant; use serde::ser::{Serialize, Serializer}; use crate::errors::Error; @@ -257,19 +258,16 @@ impl fmt::Display for Scopes { /// Permission scope of the application. /// [Details on what each permission provides][1] /// [1]: https://github.com/tootsuite/documentation/blob/master/Using-the-API/OAuth-details.md) -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)] -enum Scope { +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, IsVariant)] +#[serde(rename_all = "lowercase")] +pub enum Scope { /// Read only permissions. - #[serde(rename = "read")] Read(Option), /// Write only permissions. - #[serde(rename = "write")] Write(Option), /// Only permission to add and remove followers. - #[serde(rename = "follow")] Follow, /// Push permissions - #[serde(rename = "push")] Push, } @@ -355,7 +353,7 @@ impl Default for Scope { } /// Represents the granular "read:___" oauth scopes -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, IsVariant)] pub enum Read { /// Accounts #[serde(rename = "accounts")] @@ -450,7 +448,7 @@ impl fmt::Display for Read { } /// Represents the granular "write:___" oauth scopes -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, IsVariant)] pub enum Write { /// Accounts #[serde(rename = "accounts")]