Skip to content
Open
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
2 changes: 1 addition & 1 deletion twilight-http/src/routing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4578,6 +4578,6 @@ mod tests {
#[test]
fn get_skus() {
let route = Route::GetSKUs { application_id: 1 };
assert_eq!(route.to_string(), format!("applications/1/skus"));
assert_eq!(route.to_string(), "applications/1/skus".to_string());
}
}
11 changes: 10 additions & 1 deletion twilight-model/src/application/interaction/resolved.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,9 @@ mod tests {
duration_secs: None,
height: Some(2674),
id: Id::new(400),
// Thumbhash of the twilight project logo.
placeholder: Some("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg".to_owned()),
placeholder_version: Some(1),
proxy_url: "https://proxy.example.com/rainbow_dash.png".to_owned(),
size: 13370,
title: None,
Expand Down Expand Up @@ -333,7 +336,7 @@ mod tests {
Token::Str("400"),
Token::Struct {
name: "Attachment",
len: 9,
len: 11,
},
Token::Str("content_type"),
Token::Some,
Expand All @@ -348,6 +351,12 @@ mod tests {
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("400"),
Token::Str("placeholder"),
Token::Some,
Token::Str("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg"),
Token::Str("placeholder_version"),
Token::Some,
Token::U64(1),
Token::Str("proxy_url"),
Token::Str("https://proxy.example.com/rainbow_dash.png"),
Token::Str("size"),
Expand Down
17 changes: 16 additions & 1 deletion twilight-model/src/channel/attachment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ pub struct Attachment {
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<u64>,
pub id: Id<AttachmentMarker>,
/// A [thumbhash](https://evanw.github.io/thumbhash) placeholder of the video.
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
/// Version of the placeholder.
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder_version: Option<u64>,
pub proxy_url: String,
pub size: u64,
/// The title of the file.
Expand Down Expand Up @@ -83,6 +89,9 @@ mod tests {
duration_secs: Some(3.2),
height: Some(184),
id: Id::new(700_000_000_000_000_000),
// Thumbhash of the twilight project logo.
placeholder: Some("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg".to_owned()),
placeholder_version: Some(1),
proxy_url: "https://cdn.example.com/1.png".to_owned(),
size: 13_593,
title: Some("a title".to_owned()),
Expand All @@ -96,7 +105,7 @@ mod tests {
&[
Token::Struct {
name: "Attachment",
len: 13,
len: 15,
},
Token::Str("content_type"),
Token::Some,
Expand All @@ -118,6 +127,12 @@ mod tests {
Token::Str("id"),
Token::NewtypeStruct { name: "Id" },
Token::Str("700000000000000000"),
Token::Str("placeholder"),
Token::Some,
Token::Str("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg"),
Token::Str("placeholder_version"),
Token::Some,
Token::U64(1),
Token::Str("proxy_url"),
Token::Str("https://cdn.example.com/1.png"),
Token::Str("size"),
Expand Down
36 changes: 35 additions & 1 deletion twilight-model/src/channel/message/embed/image.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use serde::{Deserialize, Serialize};

use super::EmbedMediaFlags;

#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub struct EmbedImage {
#[serde(skip_serializing_if = "Option::is_none")]
Expand All @@ -9,11 +11,26 @@ pub struct EmbedImage {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<u64>,
/// Image's [media type].
///
/// [media type]: https://en.wikipedia.org/wiki/Media_type
#[serde(skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
/// A [thumbhash](https://evanw.github.io/thumbhash) placeholder of the image.
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
/// Version of the placeholder.
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder_version: Option<u64>,
/// Media flags for this video.
#[serde(skip_serializing_if = "Option::is_none")]
pub flags: Option<EmbedMediaFlags>,
}

#[cfg(test)]
mod tests {
use super::EmbedImage;
use super::EmbedMediaFlags;
use serde_test::Token;

#[test]
Expand All @@ -23,14 +40,19 @@ mod tests {
proxy_url: Some("https://cdn.example.com/1-hash.png".to_owned()),
url: "https://example.com/1.png".to_owned(),
width: Some(2560),
content_type: Some("image/png".to_owned()),
// Thumbhash of the twilight project logo.
placeholder: Some("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg".to_owned()),
placeholder_version: Some(1),
flags: Some(EmbedMediaFlags::IS_ANIMATED),
};

serde_test::assert_tokens(
&value,
&[
Token::Struct {
name: "EmbedImage",
len: 4,
len: 8,
},
Token::Str("height"),
Token::Some,
Expand All @@ -43,6 +65,18 @@ mod tests {
Token::Str("width"),
Token::Some,
Token::U64(2560),
Token::Str("content_type"),
Token::Some,
Token::Str("image/png"),
Token::Str("placeholder"),
Token::Some,
Token::Str("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg"),
Token::Str("placeholder_version"),
Token::Some,
Token::U64(1),
Token::Str("flags"),
Token::Some,
Token::U64(32),
Token::StructEnd,
],
);
Expand Down
84 changes: 84 additions & 0 deletions twilight-model/src/channel/message/embed/media_flags.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
use bitflags::bitflags;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just copied and modified the AttachmentFlags code here, since it's basically the same thing.

use serde::{
de::{Deserialize, Deserializer},
ser::{Serialize, Serializer},
};

bitflags! {
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct EmbedMediaFlags: u64 {
/// This image is animated
const IS_ANIMATED = 1 << 5;
}
}

impl<'de> Deserialize<'de> for EmbedMediaFlags {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Ok(Self::from_bits_truncate(u64::deserialize(deserializer)?))
}
}

impl Serialize for EmbedMediaFlags {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_u64(self.bits())
}
}

#[cfg(test)]
mod tests {
use super::EmbedMediaFlags;
use serde::{Deserialize, Serialize};
use serde_test::Token;
use static_assertions::{assert_impl_all, const_assert_eq};
use std::{
fmt::{Binary, Debug, LowerHex, Octal, UpperHex},
hash::Hash,
ops::{
BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign,
},
};

assert_impl_all!(
EmbedMediaFlags: Binary,
BitAnd,
BitAndAssign,
BitOr,
BitOrAssign,
BitXor,
BitXorAssign,
Clone,
Copy,
Debug,
Deserialize<'static>,
Eq,
Extend<EmbedMediaFlags>,
FromIterator<EmbedMediaFlags>,
Hash,
LowerHex,
Not,
Octal,
PartialEq,
Send,
Serialize,
Sub,
SubAssign,
Sync,
UpperHex
);

const_assert_eq!(EmbedMediaFlags::IS_ANIMATED.bits(), 32);

#[test]
fn serde() {
serde_test::assert_tokens(
&EmbedMediaFlags::IS_ANIMATED,
&[Token::U64(EmbedMediaFlags::IS_ANIMATED.bits())],
);

// Deserialization truncates unknown bits.
serde_test::assert_de_tokens(&EmbedMediaFlags::empty(), &[Token::U64(1 << 63)]);
}
}
46 changes: 41 additions & 5 deletions twilight-model/src/channel/message/embed/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ mod author;
mod field;
mod footer;
mod image;
mod media_flags;
mod provider;
mod thumbnail;
mod video;

pub use self::{
author::EmbedAuthor, field::EmbedField, footer::EmbedFooter, image::EmbedImage,
provider::EmbedProvider, thumbnail::EmbedThumbnail, video::EmbedVideo,
media_flags::EmbedMediaFlags, provider::EmbedProvider, thumbnail::EmbedThumbnail,
video::EmbedVideo,
};

use crate::util::Timestamp;
Expand Down Expand Up @@ -50,8 +52,8 @@ pub struct Embed {
#[cfg(test)]
mod tests {
use super::{
Embed, EmbedAuthor, EmbedField, EmbedFooter, EmbedImage, EmbedProvider, EmbedThumbnail,
EmbedVideo,
Embed, EmbedAuthor, EmbedField, EmbedFooter, EmbedImage, EmbedMediaFlags, EmbedProvider,
EmbedThumbnail, EmbedVideo,
};
use crate::util::datetime::{Timestamp, TimestampParseError};
use serde_test::Token;
Expand Down Expand Up @@ -137,6 +139,11 @@ mod tests {
proxy_url: Some("https://cdn.example.com/1-hash.png".to_owned()),
url: "https://example.com/1.png".to_owned(),
width: Some(2560),
content_type: Some("image/png".to_owned()),
// Thumbhash of the twilight project logo.
placeholder: Some("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg".to_owned()),
placeholder_version: Some(1),
flags: Some(EmbedMediaFlags::IS_ANIMATED),
}),
kind: "rich".to_owned(),
provider: Some(EmbedProvider {
Expand All @@ -157,6 +164,11 @@ mod tests {
proxy_url: Some("https://proxy.cdn.example.com/1-hash.mp4".to_owned()),
url: Some("https://cdn.example.com/1-hash.mp4".to_owned()),
width: Some(2560),
content_type: Some("video/mp4".to_owned()),
// Thumbhash of the twilight project logo.
placeholder: Some("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg".to_owned()),
placeholder_version: Some(1),
flags: Some(EmbedMediaFlags::IS_ANIMATED),
}),
};

Expand Down Expand Up @@ -224,7 +236,7 @@ mod tests {
Token::Some,
Token::Struct {
name: "EmbedImage",
len: 4,
len: 8,
},
Token::Str("height"),
Token::Some,
Expand All @@ -237,6 +249,18 @@ mod tests {
Token::Str("width"),
Token::Some,
Token::U64(2560),
Token::Str("content_type"),
Token::Some,
Token::Str("image/png"),
Token::Str("placeholder"),
Token::Some,
Token::Str("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg"),
Token::Str("placeholder_version"),
Token::Some,
Token::U64(1),
Token::Str("flags"),
Token::Some,
Token::U64(32),
Token::StructEnd,
Token::Str("type"),
Token::Str("rich"),
Expand Down Expand Up @@ -284,7 +308,7 @@ mod tests {
Token::Some,
Token::Struct {
name: "EmbedVideo",
len: 4,
len: 8,
},
Token::Str("height"),
Token::Some,
Expand All @@ -298,6 +322,18 @@ mod tests {
Token::Str("width"),
Token::Some,
Token::U64(2560),
Token::Str("content_type"),
Token::Some,
Token::Str("video/mp4"),
Token::Str("placeholder"),
Token::Some,
Token::Str("zSeKDQIoCLiHeIKeiLyfrsBqCIaYaHJ2Vg"),
Token::Str("placeholder_version"),
Token::Some,
Token::U64(1),
Token::Str("flags"),
Token::Some,
Token::U64(32),
Token::StructEnd,
Token::StructEnd,
],
Expand Down
Loading
Loading