mirror of
https://git.asonix.dog/asonix/activitystreams.git
synced 2024-11-24 21:01:00 +00:00
Split kinds into own library
This commit is contained in:
parent
47efc1c646
commit
cba33c4642
9 changed files with 188 additions and 162 deletions
|
@ -1,7 +1,7 @@
|
|||
[package]
|
||||
name = "activitystreams"
|
||||
description = "A set of core types and traits for activitystreams data"
|
||||
version = "0.7.0-alpha.12"
|
||||
version = "0.7.0-alpha.13"
|
||||
license = "GPL-3.0"
|
||||
authors = ["asonix <asonix@asonix.dog>"]
|
||||
repository = "https://git.asonix.dog/Aardwolf/activitystreams"
|
||||
|
@ -14,10 +14,12 @@ edition = "2021"
|
|||
|
||||
[workspace]
|
||||
members = [
|
||||
"activitystreams-ext"
|
||||
"activitystreams-ext",
|
||||
"activitystreams-kinds"
|
||||
]
|
||||
|
||||
[dependencies]
|
||||
activitystreams-kinds = { version = "0.1.0", path = "./activitystreams-kinds/" }
|
||||
chrono = "0.4"
|
||||
mime = "0.3"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
|
|
9
activitystreams-kinds/Cargo.toml
Normal file
9
activitystreams-kinds/Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "activitystreams-kinds"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "1", features = ["derive"] }
|
170
activitystreams-kinds/src/lib.rs
Normal file
170
activitystreams-kinds/src/lib.rs
Normal file
|
@ -0,0 +1,170 @@
|
|||
//! # activitystreams-kinds
|
||||
//!
|
||||
//! Enums representing typed versions of activitypub 'type' fields.
|
||||
|
||||
/// Generate an enum implementing serde's Serialize and Deserialize with a single variant
|
||||
///
|
||||
/// This is useful for describing constants
|
||||
///
|
||||
/// ```rust
|
||||
/// # fn main() -> Result<(), anyhow::Error> {
|
||||
/// use activitystreams::kind;
|
||||
///
|
||||
/// kind!(CustomType, Custom);
|
||||
///
|
||||
/// #[derive(serde::Deserialize)]
|
||||
/// struct MyStruct {
|
||||
/// #[serde(rename = "type")]
|
||||
/// kind: CustomType,
|
||||
/// }
|
||||
///
|
||||
/// let s: MyStruct = serde_json::from_str(r#"{"type":"Custom"}"#)?;
|
||||
///
|
||||
/// assert_eq!(s.kind, CustomType::Custom);
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[macro_export]
|
||||
macro_rules! kind {
|
||||
($x:ident, $y:ident) => {
|
||||
#[derive(
|
||||
Clone,
|
||||
Debug,
|
||||
Eq,
|
||||
Hash,
|
||||
Ord,
|
||||
PartialEq,
|
||||
PartialOrd,
|
||||
serde::Deserialize,
|
||||
serde::Serialize,
|
||||
)]
|
||||
/// A type stand-in for the constant $y, deriving serde traits
|
||||
pub enum $x {
|
||||
$y,
|
||||
}
|
||||
|
||||
impl std::fmt::Display for $x {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, stringify!($y))
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for $x {
|
||||
fn default() -> Self {
|
||||
$x::$y
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub mod activity {
|
||||
//! Kinds of activities defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `CreateType` -> `"Create"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(AcceptType, Accept);
|
||||
kind!(AddType, Add);
|
||||
kind!(AnnounceType, Announce);
|
||||
kind!(ArriveType, Arrive);
|
||||
kind!(BlockType, Block);
|
||||
kind!(CreateType, Create);
|
||||
kind!(DeleteType, Delete);
|
||||
kind!(DislikeType, Dislike);
|
||||
kind!(FlagType, Flag);
|
||||
kind!(FollowType, Follow);
|
||||
kind!(IgnoreType, Ignore);
|
||||
kind!(InviteType, Invite);
|
||||
kind!(JoinType, Join);
|
||||
kind!(LeaveType, Leave);
|
||||
kind!(LikeType, Like);
|
||||
kind!(ListenType, Listen);
|
||||
kind!(MoveType, Move);
|
||||
kind!(OfferType, Offer);
|
||||
kind!(QuestionType, Question);
|
||||
kind!(ReadType, Read);
|
||||
kind!(RejectType, Reject);
|
||||
kind!(RemoveType, Remove);
|
||||
kind!(TentativeAcceptType, TentativeAccept);
|
||||
kind!(TentativeRejectType, TentativeReject);
|
||||
kind!(TravelType, Travel);
|
||||
kind!(UndoType, Undo);
|
||||
kind!(UpdateType, Update);
|
||||
kind!(ViewType, View);
|
||||
}
|
||||
|
||||
pub mod actor {
|
||||
//! Kinds of actors defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `PersonType` -> `"Person"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(ApplicationType, Application);
|
||||
kind!(GroupType, Group);
|
||||
kind!(OrganizationType, Organization);
|
||||
kind!(PersonType, Person);
|
||||
kind!(ServiceType, Service);
|
||||
}
|
||||
|
||||
pub mod collection {
|
||||
//! Kinds of collections defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `CollectionType` -> `"Collection"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(CollectionType, Collection);
|
||||
kind!(OrderedCollectionType, OrderedCollection);
|
||||
kind!(CollectionPageType, CollectionPage);
|
||||
kind!(OrderedCollectionPageType, OrderedCollectionPage);
|
||||
}
|
||||
|
||||
pub mod link {
|
||||
//! Kinds of links defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `MentionType` -> `"Mention"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(MentionType, Mention);
|
||||
}
|
||||
|
||||
pub mod object {
|
||||
//! Kinds of objects defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `PlaceType` -> `"Place"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(ArticleType, Article);
|
||||
kind!(AudioType, Audio);
|
||||
kind!(DocumentType, Document);
|
||||
kind!(EventType, Event);
|
||||
kind!(ImageType, Image);
|
||||
kind!(NoteType, Note);
|
||||
kind!(PageType, Page);
|
||||
kind!(PlaceType, Place);
|
||||
kind!(ProfileType, Profile);
|
||||
kind!(RelationshipType, Relationship);
|
||||
kind!(TombstoneType, Tombstone);
|
||||
kind!(VideoType, Video);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::kind;
|
||||
|
||||
#[test]
|
||||
fn to_string_works() {
|
||||
kind!(MyType, My);
|
||||
|
||||
assert_eq!(MyType::My.to_string(), "My")
|
||||
}
|
||||
}
|
|
@ -33,43 +33,7 @@ use crate::{
|
|||
use std::convert::TryFrom;
|
||||
use url::Url;
|
||||
|
||||
pub mod kind {
|
||||
//! Kinds of activities defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `CreateType` -> `"Create"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(AcceptType, Accept);
|
||||
kind!(AddType, Add);
|
||||
kind!(AnnounceType, Announce);
|
||||
kind!(ArriveType, Arrive);
|
||||
kind!(BlockType, Block);
|
||||
kind!(CreateType, Create);
|
||||
kind!(DeleteType, Delete);
|
||||
kind!(DislikeType, Dislike);
|
||||
kind!(FlagType, Flag);
|
||||
kind!(FollowType, Follow);
|
||||
kind!(IgnoreType, Ignore);
|
||||
kind!(InviteType, Invite);
|
||||
kind!(JoinType, Join);
|
||||
kind!(LeaveType, Leave);
|
||||
kind!(LikeType, Like);
|
||||
kind!(ListenType, Listen);
|
||||
kind!(MoveType, Move);
|
||||
kind!(OfferType, Offer);
|
||||
kind!(QuestionType, Question);
|
||||
kind!(ReadType, Read);
|
||||
kind!(RejectType, Reject);
|
||||
kind!(RemoveType, Remove);
|
||||
kind!(TentativeAcceptType, TentativeAccept);
|
||||
kind!(TentativeRejectType, TentativeReject);
|
||||
kind!(TravelType, Travel);
|
||||
kind!(UndoType, Undo);
|
||||
kind!(UpdateType, Update);
|
||||
kind!(ViewType, View);
|
||||
}
|
||||
pub use activitystreams_kinds::activity as kind;
|
||||
|
||||
use self::kind::*;
|
||||
|
||||
|
|
15
src/actor.rs
15
src/actor.rs
|
@ -31,20 +31,7 @@ use crate::{
|
|||
};
|
||||
use url::Url;
|
||||
|
||||
pub mod kind {
|
||||
//! Kinds of actors defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `PersonType` -> `"Person"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(ApplicationType, Application);
|
||||
kind!(GroupType, Group);
|
||||
kind!(OrganizationType, Organization);
|
||||
kind!(PersonType, Person);
|
||||
kind!(ServiceType, Service);
|
||||
}
|
||||
pub use activitystreams_kinds::actor as kind;
|
||||
|
||||
use self::kind::*;
|
||||
|
||||
|
|
|
@ -31,19 +31,7 @@ use crate::{
|
|||
};
|
||||
use std::convert::TryFrom;
|
||||
|
||||
pub mod kind {
|
||||
//! Kinds of collections defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `CollectionType` -> `"Collection"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(CollectionType, Collection);
|
||||
kind!(OrderedCollectionType, OrderedCollection);
|
||||
kind!(CollectionPageType, CollectionPage);
|
||||
kind!(OrderedCollectionPageType, OrderedCollectionPage);
|
||||
}
|
||||
pub use activitystreams_kinds::collection as kind;
|
||||
|
||||
use self::kind::*;
|
||||
|
||||
|
|
11
src/link.rs
11
src/link.rs
|
@ -29,16 +29,7 @@ use crate::{
|
|||
use std::convert::TryFrom;
|
||||
use url::Url;
|
||||
|
||||
pub mod kind {
|
||||
//! Kinds of links defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `MentionType` -> `"Mention"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(MentionType, Mention);
|
||||
}
|
||||
pub use activitystreams_kinds::link as kind;
|
||||
|
||||
use self::kind::MentionType;
|
||||
|
||||
|
|
|
@ -1,58 +1,3 @@
|
|||
/// Generate an enum implementing serde's Serialize and Deserialize with a single variant
|
||||
///
|
||||
/// This is useful for describing constants
|
||||
///
|
||||
/// ```rust
|
||||
/// # fn main() -> Result<(), anyhow::Error> {
|
||||
/// use activitystreams::kind;
|
||||
///
|
||||
/// kind!(CustomType, Custom);
|
||||
///
|
||||
/// #[derive(serde::Deserialize)]
|
||||
/// struct MyStruct {
|
||||
/// #[serde(rename = "type")]
|
||||
/// kind: CustomType,
|
||||
/// }
|
||||
///
|
||||
/// let s: MyStruct = serde_json::from_str(r#"{"type":"Custom"}"#)?;
|
||||
///
|
||||
/// assert_eq!(s.kind, CustomType::Custom);
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[macro_export]
|
||||
macro_rules! kind {
|
||||
($x:ident, $y:ident) => {
|
||||
#[derive(
|
||||
Clone,
|
||||
Debug,
|
||||
Eq,
|
||||
Hash,
|
||||
Ord,
|
||||
PartialEq,
|
||||
PartialOrd,
|
||||
serde::Deserialize,
|
||||
serde::Serialize,
|
||||
)]
|
||||
/// A type stand-in for the constant $y, deriving serde traits
|
||||
pub enum $x {
|
||||
$y,
|
||||
}
|
||||
|
||||
impl std::fmt::Display for $x {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, stringify!($y))
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for $x {
|
||||
fn default() -> Self {
|
||||
$x::$y
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// A macro to shorten the `string.parse::<Url>()?` calls inevitably made in downstream code
|
||||
///
|
||||
/// ```rust
|
||||
|
@ -73,13 +18,3 @@ macro_rules! uri {
|
|||
$x.parse::<Url>()?
|
||||
}};
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn to_string_works() {
|
||||
kind!(MyType, My);
|
||||
|
||||
assert_eq!(MyType::My.to_string(), "My")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,27 +29,7 @@ use chrono::{DateTime, Duration, FixedOffset};
|
|||
use std::convert::TryFrom;
|
||||
use url::Url;
|
||||
|
||||
pub mod kind {
|
||||
//! Kinds of objects defined by the spec
|
||||
//!
|
||||
//! These types exist only to be statically-typed versions of the associated string. e.g.
|
||||
//! `PlaceType` -> `"Place"`
|
||||
|
||||
use crate::kind;
|
||||
|
||||
kind!(ArticleType, Article);
|
||||
kind!(AudioType, Audio);
|
||||
kind!(DocumentType, Document);
|
||||
kind!(EventType, Event);
|
||||
kind!(ImageType, Image);
|
||||
kind!(NoteType, Note);
|
||||
kind!(PageType, Page);
|
||||
kind!(PlaceType, Place);
|
||||
kind!(ProfileType, Profile);
|
||||
kind!(RelationshipType, Relationship);
|
||||
kind!(TombstoneType, Tombstone);
|
||||
kind!(VideoType, Video);
|
||||
}
|
||||
pub use activitystreams_kinds::object as kind;
|
||||
|
||||
use self::kind::*;
|
||||
|
||||
|
|
Loading…
Reference in a new issue