use crate::{
auth::Auth,
client::route::Route,
client::Client,
error::Error,
model::{
link::Link,
misc::{
CommentSort, Fullname, Params, QuarantinePermissions, SubredditSubmissionType,
SubredditType,
},
},
};
use reqwest::Url;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Subreddit {
pub description: String,
pub description_html: String,
pub public_description: String,
pub display_name: String,
pub display_name_prefixed: String,
pub subscribers: u64,
pub title: String,
pub user_is_moderator: bool,
pub id: String,
pub name: Fullname,
pub subreddit_type: SubredditType,
pub quarantine: bool,
pub quarantine_permissions: Option<QuarantinePermissions>,
pub comment_score_hide_mins: u64,
pub spoilers_enabled: bool,
pub submission_type: SubredditSubmissionType,
pub user_is_subscriber: bool,
pub over18: bool,
pub public_traffic: bool,
pub original_content_tag_enabled: bool,
pub restrict_commenting: bool,
pub suggested_comment_sort: Option<CommentSort>,
pub allow_discovery: bool,
}
impl Subreddit {
pub async fn hot<T: Auth + Send + Sync>(&self, client: &Client<T>) -> Result<Vec<Link>, Error> {
client
.get_posts(Route::SubredditHot(self.display_name.clone()))
.await
}
#[allow(clippy::new_ret_no_self)]
pub async fn new<T: Auth + Send + Sync>(&self, client: &Client<T>) -> Result<Vec<Link>, Error> {
client
.get_posts(Route::SubredditNew(self.display_name.clone()))
.await
}
pub async fn rising<T: Auth + Send + Sync>(
&self,
client: &Client<T>,
) -> Result<Vec<Link>, Error> {
client
.get_posts(Route::SubredditRising(self.display_name.clone()))
.await
}
pub fn submit_text<'a, T: Auth + Send + Sync>(
&self,
client: &'a Client<T>,
title: &str,
text: &str,
) -> SubmitBuilder<'a, T> {
SubmitBuilder::new_text(client, self.display_name.as_ref(), title, text)
}
pub fn submit_link<'a, T: Auth + Send + Sync, U: Into<Url>>(
&self,
client: &'a Client<T>,
title: &str,
url: U,
) -> SubmitBuilder<'a, T> {
let u: Url = url.into();
SubmitBuilder::new_link(client, self.display_name.as_ref(), title, u.as_ref())
}
}
#[doc(hidden)]
#[derive(Debug, Clone)]
pub struct SubmitBuilder<'a, T: Auth + Send + Sync> {
pub params: Params,
pub client: &'a Client<T>,
}
impl<'a, T: Auth + Send + Sync> SubmitBuilder<'a, T> {
pub fn new_text(client: &'a Client<T>, subreddit: &str, title: &str, text: &str) -> Self {
SubmitBuilder {
params: Params::new()
.add("kind", "self")
.add("title", title)
.add("text", text)
.add("api_type", "json")
.add("sr", subreddit),
client,
}
}
pub fn new_link(client: &'a Client<T>, subreddit: &str, title: &str, url: &str) -> Self {
SubmitBuilder {
params: Params::new()
.add("kind", "link")
.add("title", title)
.add("url", url)
.add("api_type", "json")
.add("sr", subreddit),
client,
}
}
pub fn spoiler(mut self) -> Self {
self.params = self.params.add("spoiler", "true");
self
}
pub fn send_replies(mut self) -> Self {
self.params = self.params.add("sendreplies", "true");
self
}
pub fn nsfw(mut self) -> Self {
self.params = self.params.add("nsfw", "true");
self
}
pub async fn send(&self) -> Result<(), Error> {
println!("{:?}", &self.params);
self.client.post(Route::Submit, &self.params).await?;
Ok(())
}
}