From 15d2c1993c8d929cf0bf1ddd4debd3f5aa40b908 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Wed, 6 Jul 2022 07:50:22 +0000 Subject: [PATCH] Update --- src/fanbox/post.rs | 199 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 4 deletions(-) diff --git a/src/fanbox/post.rs b/src/fanbox/post.rs index 233b2e7..b39b9ed 100644 --- a/src/fanbox/post.rs +++ b/src/fanbox/post.rs @@ -3,6 +3,7 @@ use crate::parser::json::parse_u64; use json::JsonValue; use proc_macros::fanbox_api_test; use std::fmt::Debug; +use std::fmt::Display; use std::sync::Arc; /// Fanbox post's article @@ -164,6 +165,16 @@ pub struct FanboxPostImage { } impl FanboxPostImage { + #[inline] + pub fn comment_count(&self) -> Option { + self.data["commentCount"].as_u64() + } + + #[inline] + pub fn creator_id(&self) -> Option<&str> { + self.data["creatorId"].as_str() + } + #[inline] pub fn excerpt(&self) -> Option<&str> { self.data["excerpt"].as_str() @@ -174,16 +185,31 @@ impl FanboxPostImage { self.data["feeRequired"].as_u64() } + #[inline] + pub fn has_adult_content(&self) -> Option { + self.data["hasAdultContent"].as_bool() + } + #[inline] pub fn id(&self) -> Option { parse_u64(&self.data["id"]) } + #[inline] + pub fn image_for_share(&self) -> Option<&str> { + self.data["imageForShare"].as_str() + } + #[inline] pub fn is_liked(&self) -> Option { self.data["isLiked"].as_bool() } + #[inline] + pub fn is_restricted(&self) -> Option { + self.data["isRestricted"].as_bool() + } + #[inline] pub fn like_count(&self) -> Option { self.data["likeCount"].as_u64() @@ -198,6 +224,26 @@ impl FanboxPostImage { } } + #[inline] + pub fn next_post(&self) -> Option { + let obj = &self.data["nextPost"]; + if obj.is_object() { + Some(FanboxPostRef::new(obj, Arc::clone(&self.client))) + } else { + None + } + } + + #[inline] + pub fn prev_post(&self) -> Option { + let obj = &self.data["prevPost"]; + if obj.is_object() { + Some(FanboxPostRef::new(obj, Arc::clone(&self.client))) + } else { + None + } + } + #[inline] pub fn published_datetime(&self) -> Option<&str> { self.data["publishedDatetime"].as_str() @@ -212,19 +258,43 @@ impl FanboxPostImage { pub fn updated_datetime(&self) -> Option<&str> { self.data["updatedDatetime"].as_str() } + + #[inline] + pub fn user_icon_url(&self) -> Option<&str> { + self.data["user"]["iconUrl"].as_str() + } + + #[inline] + pub fn user_id(&self) -> Option { + parse_u64(&self.data["user"]["userId"]) + } + + #[inline] + pub fn user_name(&self) -> Option<&str> { + self.data["user"]["name"].as_str() + } } impl Debug for FanboxPostImage { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("FanboxPostImage") .field("id", &self.id()) + .field("comment_count", &self.comment_count()) + .field("creator_id", &self.creator_id()) .field("excerpt", &self.excerpt()) .field("fee_required", &self.fee_required()) + .field("has_adult_content", &self.has_adult_content()) + .field("image_for_share", &self.image_for_share()) .field("is_liked", &self.is_liked()) + .field("is_restricted", &self.is_restricted()) .field("like_count", &self.like_count()) + .field("next_post", &self.next_post()) .field("published_datetime", &self.published_datetime()) .field("title", &self.title()) .field("updated_datetime", &self.updated_datetime()) + .field("user_icon_url", &self.user_icon_url()) + .field("user_id", &self.user_id()) + .field("user_name", &self.user_name()) .finish_non_exhaustive() } } @@ -284,6 +354,59 @@ impl Debug for FanboxPostRef { } } +pub struct FanboxPostUnknown { + /// Raw data + pub data: JsonValue, + /// The api client + client: Arc, +} + +impl FanboxPostUnknown { + #[inline] + /// Create a new instance + pub fn new(data: &JsonValue, client: Arc) -> Self { + Self { + data: data.clone(), + client, + } + } +} + +#[allow(dead_code)] +impl FanboxPostUnknown { + #[inline] + pub fn next_post(&self) -> Option { + let obj = &self.data["nextPost"]; + if obj.is_object() { + Some(FanboxPostRef::new(obj, Arc::clone(&self.client))) + } else { + None + } + } + + #[inline] + pub fn prev_post(&self) -> Option { + let obj = &self.data["prevPost"]; + if obj.is_object() { + Some(FanboxPostRef::new(obj, Arc::clone(&self.client))) + } else { + None + } + } +} + +impl Debug for FanboxPostUnknown { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Debug::fmt(&self.data, f) + } +} + +impl Display for FanboxPostUnknown { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.data, f) + } +} + #[derive(Debug)] /// The fanbox's post pub enum FanboxPost { @@ -292,7 +415,7 @@ pub enum FanboxPost { /// Image Image(FanboxPostImage), /// Unknown - Unknown(JsonValue), + Unknown(FanboxPostUnknown), } impl FanboxPost { @@ -303,15 +426,25 @@ impl FanboxPost { Some(s) => match s { "article" => Self::Article(FanboxPostArticle::new(data, client)), "image" => Self::Image(FanboxPostImage::new(data, client)), - _ => Self::Unknown(data.clone()), + _ => Self::Unknown(FanboxPostUnknown::new(data, client)), }, - _ => Self::Unknown(data.clone()), + _ => Self::Unknown(FanboxPostUnknown::new(data, client)), } } } #[allow(dead_code)] impl FanboxPost { + #[inline] + pub fn comment_count(&self) -> Option { + self.get_json()["commentCount"].as_u64() + } + + #[inline] + pub fn creator_id(&self) -> Option<&str> { + self.get_json()["creatorId"].as_str() + } + #[inline] pub fn excerpt(&self) -> Option<&str> { self.get_json()["excerpt"].as_str() @@ -327,25 +460,58 @@ impl FanboxPost { match self { Self::Article(a) => &a.data, Self::Image(a) => &a.data, - Self::Unknown(a) => a, + Self::Unknown(a) => &a.data, } } + #[inline] + pub fn has_adult_content(&self) -> Option { + self.get_json()["hasAdultContent"].as_bool() + } + #[inline] pub fn id(&self) -> Option { parse_u64(&self.get_json()["id"]) } + #[inline] + pub fn image_for_share(&self) -> Option<&str> { + self.get_json()["imageForShare"].as_str() + } + #[inline] pub fn is_liked(&self) -> Option { self.get_json()["isLiked"].as_bool() } + #[inline] + pub fn is_restricted(&self) -> Option { + self.get_json()["isRestricted"].as_bool() + } + #[inline] pub fn like_count(&self) -> Option { self.get_json()["likeCount"].as_u64() } + #[inline] + pub fn next_post(&self) -> Option { + match self { + Self::Article(a) => a.next_post(), + Self::Image(i) => i.next_post(), + Self::Unknown(u) => u.next_post(), + } + } + + #[inline] + pub fn prev_post(&self) -> Option { + match self { + Self::Article(a) => a.prev_post(), + Self::Image(i) => i.prev_post(), + Self::Unknown(u) => u.prev_post(), + } + } + #[inline] pub fn published_datetime(&self) -> Option<&str> { self.get_json()["publishedDatetime"].as_str() @@ -360,6 +526,21 @@ impl FanboxPost { pub fn updated_datetime(&self) -> Option<&str> { self.get_json()["updatedDatetime"].as_str() } + + #[inline] + pub fn user_icon_url(&self) -> Option<&str> { + self.get_json()["user"]["iconUrl"].as_str() + } + + #[inline] + pub fn user_id(&self) -> Option { + parse_u64(&self.get_json()["user"]["userId"]) + } + + #[inline] + pub fn user_name(&self) -> Option<&str> { + self.get_json()["user"]["name"].as_str() + } } fanbox_api_test!(test_get_post_info, { @@ -369,6 +550,13 @@ fanbox_api_test!(test_get_post_info, { match data { FanboxPost::Article(data) => { println!("{:?}", data); + assert_eq!(data.user_id(), Some(705370)); + assert_eq!( + data.title(), + Some("第253話 【壁紙プレゼント】ひんやりレモンころねちゃん🍋") + ); + assert_eq!(data.user_name(), Some("しらたま")); + assert_eq!(data.creator_id(), Some("shiratamaco")); match data.next_post() { Some(r) => { println!("{:?}", r); @@ -376,6 +564,9 @@ fanbox_api_test!(test_get_post_info, { Some(n) => { println!("{:?}", n); assert_eq!(n.id(), r.id()); + assert_eq!(n.user_id(), Some(705370)); + assert_eq!(n.user_name(), Some("しらたま")); + assert_eq!(n.creator_id(), Some("shiratamaco")); } None => { panic!("Failed to get next post.")