Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Use macro to define ID types #65

Merged
merged 1 commit into from
Jan 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 3 additions & 36 deletions entities/src/account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ use serde::{
de::{self, Deserializer, Unexpected},
Deserialize, Serialize,
};
use std::{fmt::Display, path::PathBuf};
use std::path::PathBuf;
use time::{serde::iso8601, OffsetDateTime};

use crate::AccountId;

/// A struct representing an Account.
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Account {
Expand Down Expand Up @@ -54,41 +56,6 @@ pub struct Account {
pub bot: Option<bool>,
}

/// Wrapper type for a account ID string
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct AccountId(String);

impl AsRef<str> for AccountId {
fn as_ref(&self) -> &str {
&self.0
}
}

impl AccountId {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
}

impl Display for AccountId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}

static_assertions::assert_not_impl_any!(
AccountId: PartialEq<crate::attachment::AttachmentId>,
PartialEq<crate::filter::FilterId>,
PartialEq<crate::list::ListId>,
PartialEq<crate::mention::MentionId>,
PartialEq<crate::notification::NotificationId>,
PartialEq<crate::relationship::RelationshipId>,
PartialEq<crate::push::SubscriptionId>,
PartialEq<crate::report::ReportId>,
PartialEq<crate::status::StatusId>,
);

/// A single name: value pair from a user's profile
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct MetadataField {
Expand Down
37 changes: 1 addition & 36 deletions entities/src/attachment.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
//! Module containing everything related to media attachements.

use std::fmt::Display;

use crate::AttachmentId;
use serde::{Deserialize, Serialize};

/// A struct representing a media attachment.
Expand Down Expand Up @@ -39,40 +38,6 @@ impl Attachment {
self.url.is_some()
}
}
/// Wrapper type for a attachment ID string
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct AttachmentId(String);

impl AsRef<str> for AttachmentId {
fn as_ref(&self) -> &str {
&self.0
}
}

impl AttachmentId {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
}

impl Display for AttachmentId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}

static_assertions::assert_not_impl_any!(
AttachmentId: PartialEq<crate::account::AccountId>,
PartialEq<crate::filter::FilterId>,
PartialEq<crate::list::ListId>,
PartialEq<crate::mention::MentionId>,
PartialEq<crate::notification::NotificationId>,
PartialEq<crate::relationship::RelationshipId>,
PartialEq<crate::report::ReportId>,
PartialEq<crate::push::SubscriptionId>,
PartialEq<crate::status::StatusId>,
);

/// Information about the attachment itself.
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
Expand Down
39 changes: 2 additions & 37 deletions entities/src/filter.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use std::fmt::Display;

use serde::{de::Visitor, Deserialize, Deserializer, Serialize};
use time::{serde::iso8601, OffsetDateTime};

use crate::FilterId;

/// Represents a user-defined filter for determining which statuses should not
/// be shown to the user.
///
Expand Down Expand Up @@ -53,41 +53,6 @@ pub struct Filter {
pub statuses: Vec<Status>,
}

/// Wrapper type for a filter ID string
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct FilterId(String);

impl AsRef<str> for FilterId {
fn as_ref(&self) -> &str {
&self.0
}
}

impl FilterId {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
}

impl Display for FilterId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}

static_assertions::assert_not_impl_any!(
FilterId: PartialEq<crate::account::AccountId>,
PartialEq<crate::attachment::AttachmentId>,
PartialEq<crate::list::ListId>,
PartialEq<crate::mention::MentionId>,
PartialEq<crate::notification::NotificationId>,
PartialEq<crate::relationship::RelationshipId>,
PartialEq<crate::push::SubscriptionId>,
PartialEq<crate::report::ReportId>,
PartialEq<crate::status::StatusId>,
);

/// Represents the various types of Filter contexts
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
Expand Down
50 changes: 50 additions & 0 deletions entities/src/ids.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
use serde::{Deserialize, Serialize};
use std::fmt::Display;

macro_rules! define_ids {
($name:ident, $($rest:ident,)+) => {
define_ids!($name,);
static_assertions::assert_not_impl_any!(
$name: $(PartialEq<$rest>,)+
);
define_ids!($($rest,)+);
};
($name:ident,) => {
/// Wrapper type for a account ID string
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct $name(String);

impl AsRef<str> for $name {
fn as_ref(&self) -> &str {
&self.0
}
}

impl $name {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
}

impl Display for $name {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
};
() => {}
}

define_ids!(
AccountId,
AttachmentId,
FilterId,
ListId,
MentionId,
NotificationId,
SubscriptionId,
RelationshipId,
ReportId,
StatusId,
);
25 changes: 15 additions & 10 deletions entities/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ pub mod context;
pub mod event;
/// Data structures for ser/de of filter-related resources
pub mod filter;
/// Type-safe ID values
pub mod ids;
pub use ids::*;
/// Data structures for ser/de of instance-related resources
pub mod instance;
/// Data structures for ser/de of list-related resources
Expand Down Expand Up @@ -46,21 +49,23 @@ pub struct Empty {}
/// modules:
pub mod prelude {
pub use super::{
account::{Account, AccountId, Source},
attachment::{Attachment, AttachmentId, MediaType},
account::{Account, Source},
attachment::{Attachment, MediaType},
card::Card,
context::Context,
event::Event,
filter::{Filter, FilterContext, FilterId},
filter::{Filter, FilterContext},
ids::*,
instance::*,
list::{List, ListId},
mention::{Mention, MentionId},
notification::{Notification, NotificationId},
push::{Subscription, SubscriptionId},
relationship::{Relationship, RelationshipId},
report::{Report, ReportId},
list::List,
mention::Mention,
notification::Notification,
push::Subscription,
relationship::Relationship,
report::Report,
search_result::SearchResult,
status::{Application, Emoji, Status, StatusId},
status::{Application, Emoji, Status},
visibility::Visibility,
Empty,
};
}
31 changes: 2 additions & 29 deletions entities/src/list.rs
Original file line number Diff line number Diff line change
@@ -1,37 +1,10 @@
use serde::{Deserialize, Serialize};

use crate::ListId;

/// Used for ser/de of list resources
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
pub struct List {
id: ListId,
title: String,
}

/// Wrapper type for a list ID string
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct ListId(String);

impl AsRef<str> for ListId {
fn as_ref(&self) -> &str {
&self.0
}
}

impl ListId {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
}

static_assertions::assert_not_impl_any!(
ListId: PartialEq<crate::account::AccountId>,
PartialEq<crate::attachment::AttachmentId>,
PartialEq<crate::filter::FilterId>,
PartialEq<crate::push::SubscriptionId>,
PartialEq<crate::mention::MentionId>,
PartialEq<crate::notification::NotificationId>,
PartialEq<crate::relationship::RelationshipId>,
PartialEq<crate::report::ReportId>,
PartialEq<crate::status::StatusId>,
);
37 changes: 0 additions & 37 deletions entities/src/mention.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use std::fmt::Display;

use serde::{Deserialize, Serialize};

/// Represents a `mention` used in a status
Expand All @@ -14,38 +12,3 @@ pub struct Mention {
/// Account ID
pub id: String,
}

/// Wrapper type for a mention ID string
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct MentionId(String);

impl AsRef<str> for MentionId {
fn as_ref(&self) -> &str {
&self.0
}
}

impl MentionId {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
}

impl Display for MentionId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}

static_assertions::assert_not_impl_any!(
Mention: PartialEq<crate::account::AccountId>,
PartialEq<crate::attachment::AttachmentId>,
PartialEq<crate::filter::FilterId>,
PartialEq<crate::list::ListId>,
PartialEq<crate::notification::NotificationId>,
PartialEq<crate::relationship::RelationshipId>,
PartialEq<crate::push::SubscriptionId>,
PartialEq<crate::report::ReportId>,
PartialEq<crate::status::StatusId>,
);
37 changes: 1 addition & 36 deletions entities/src/notification.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//! Module containing all info about notifications.

use std::fmt::Display;
use crate::NotificationId;

use super::{account::Account, status::Status};
use serde::{Deserialize, Serialize};
Expand All @@ -24,41 +24,6 @@ pub struct Notification {
pub status: Option<Status>,
}

/// Wrapper type for a notification ID string
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct NotificationId(String);

impl AsRef<str> for NotificationId {
fn as_ref(&self) -> &str {
&self.0
}
}

impl NotificationId {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
}

impl Display for NotificationId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}

static_assertions::assert_not_impl_any!(
NotificationId: PartialEq<crate::account::AccountId>,
PartialEq<crate::attachment::AttachmentId>,
PartialEq<crate::filter::FilterId>,
PartialEq<crate::mention::MentionId>,
PartialEq<crate::list::ListId>,
PartialEq<crate::push::SubscriptionId>,
PartialEq<crate::relationship::RelationshipId>,
PartialEq<crate::report::ReportId>,
PartialEq<crate::status::StatusId>,
);

/// The type of notification.
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
Expand Down
Loading