feat: get users and comments
This commit is contained in:
commit
6ab53c5b22
6 changed files with 1196 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
1107
Cargo.lock
generated
Normal file
1107
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
12
Cargo.toml
Normal file
12
Cargo.toml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
[package]
|
||||||
|
name = "hn"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
reqwest = { version = "0.11.18", features = ["json", "gzip"] }
|
||||||
|
serde = { version = "1.0.183", features = ["derive"] }
|
||||||
|
serde_json = "1.0.104"
|
||||||
|
tokio = { version = "1.30.0", features = ["rt", "rt-multi-thread", "macros"] }
|
38
src/comments.rs
Normal file
38
src/comments.rs
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
use reqwest::Client;
|
||||||
|
use serde::Serialize;
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
use crate::user::User;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub enum ChildComment {
|
||||||
|
Comment(Box<Comment>),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct Comment {
|
||||||
|
by: String,
|
||||||
|
id: usize,
|
||||||
|
kids: Option<Vec<usize>>,
|
||||||
|
#[serde(rename(deserialize = "type"))]
|
||||||
|
item_type: String,
|
||||||
|
parent: Option<usize>,
|
||||||
|
time: usize,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn get_user_comments(c: &Client, u:&User) -> Vec<Comment> {
|
||||||
|
let mut comments = Vec::default();
|
||||||
|
for item in u.submitted.iter() {
|
||||||
|
let comment: Comment = c.get(&format!("https://hacker-news.firebaseio.com/v0/item/{item}.json")).send().await.unwrap().json().await.unwrap();
|
||||||
|
if comment.item_type == "comment" {
|
||||||
|
comments.push(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
comments
|
||||||
|
}
|
19
src/main.rs
Normal file
19
src/main.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
use reqwest::Client;
|
||||||
|
|
||||||
|
|
||||||
|
mod user;
|
||||||
|
mod comments;
|
||||||
|
use user::*;
|
||||||
|
use comments::*;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
let c = Client::default();
|
||||||
|
let user = get_user(&c, "realaravinth").await;
|
||||||
|
let comments = get_user_comments(&c, &user).await;
|
||||||
|
println!("{:#?}", comments);
|
||||||
|
}
|
19
src/user.rs
Normal file
19
src/user.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
use reqwest::Client;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct User {
|
||||||
|
pub created: u128,
|
||||||
|
pub id: String,
|
||||||
|
pub about: Option<String>,
|
||||||
|
pub karma: usize,
|
||||||
|
pub submitted: Vec<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn get_user(c: &Client, username: &str) -> User {
|
||||||
|
c.get(&format!("https://hacker-news.firebaseio.com/v0/user/{username}.json")).send().await.unwrap().json().await.unwrap()
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue