use data::{Comment, Listing, Thing};
use errors::ParseError;
use failure::Error;
use json::{self, Value};
use App;
#[derive(Debug)]
pub struct Post {
pub id: String,
pub title: String,
pub author: String,
pub subreddit: String,
pub ups: i64,
pub downs: i64,
pub score: i64,
pub num_comments: i64,
pub url: String,
pub stickied: bool,
pub gilded: i64,
pub comments: Listing<Comment>,
}
impl Thing for Post {
fn from_value(val: &Value, app: &App) -> Result<Post, Error> {
let post = &val["data"]["children"][0]["data"];
macro_rules! out {
($val:ident) => {
return Err(Error::from(ParseError {
thing_type: "Post".to_string(),
json: json::to_string_pretty($val).unwrap(),
}));
};
}
let id = match post["id"].as_str() {
Some(t) => t.to_string(),
None => out!(val),
};
let title = match post["title"].as_str() {
Some(t) => t.to_string(),
None => out!(val),
};
let author = match post["author"].as_str() {
Some(t) => t.to_string(),
None => out!(val),
};
let subreddit = match post["subreddit"].as_str() {
Some(t) => t.to_string(),
None => out!(val),
};
let ups = match post["ups"].as_i64() {
Some(t) => t,
None => out!(val),
};
let downs = match post["downs"].as_i64() {
Some(t) => t,
None => out!(val),
};
let score = match post["score"].as_i64() {
Some(t) => t,
None => out!(val),
};
let num_comments = match post["num_comments"].as_i64() {
Some(t) => t,
None => out!(val),
};
let url = match post["url"].as_str() {
Some(t) => t.to_string(),
None => out!(val),
};
let stickied = match post["stickied"].as_bool() {
Some(t) => t,
None => out!(val),
};
let gilded = match post["gilded"].as_i64() {
Some(t) => t,
None => out!(val),
};
let comments = app.get_comment_tree(&id)?;
Ok(Post {
id,
title,
author,
subreddit,
ups,
downs,
score,
num_comments,
url,
stickied,
gilded,
comments,
})
}
}