commit - d85ed18bc6ad9e2739516ed24ab4c199372afe7c
commit + 6ecb5bd86d62f727dd1a3dbe473e2a47a76ac368
blob - c8ac3cd8601f38e70158d4179be3b92664d9ca54
blob + a6192d027c537dc5e9101155d88e06da46dcca96
--- Cargo.lock
+++ Cargo.lock
"dotenv",
"reqwest",
"rss",
+ "toml",
]
[[package]]
]
[[package]]
+name = "toml"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
+dependencies = [
+ "serde",
+]
+
+[[package]]
name = "tower-service"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
blob - 2f8d72c87940a2bef0ba4e74760e846b48b2cfef
blob + 2a39fbf4e2d5888183b069a767d473a8f820ef2f
--- Cargo.toml
+++ Cargo.toml
reqwest = { version = "0.11", features = ["blocking"] }
clap = "3"
chrono = "0.4"
+toml = "0.5.8"
blob - 53178f50ba7c7590f521840d543ed9b8a972d356
blob + f8cb16808bbc45b077cad3d517b5999db06d6a7f
--- src/db.rs
+++ src/db.rs
}
// inserts a new post or updates an old one with the same guid
-pub fn insert_post(conn: &SqliteConnection, item: &Item) -> anyhow::Result<usize> {
+pub fn insert_item(conn: &SqliteConnection, item: &Item) -> anyhow::Result<usize> {
let time = item
.pub_date()
.map(|date| DateTime::parse_from_rfc2822(date).unwrap().timestamp());
blob - 910e92a48e67397392a69654b75432283ff12699
blob + b58971e2a060714f23f888914f01c231a22e39d7
--- src/main.rs
+++ src/main.rs
pub mod rss;
pub mod schema;
+use self::diesel::prelude::*;
+use schema::posts::dsl::*;
use std::fs::File;
use std::io::BufRead;
use std::io::BufReader;
+use std::io::Read;
+use toml::Value;
fn main() -> anyhow::Result<()> {
- use self::diesel::prelude::*;
- use schema::posts::dsl::*;
-
let app = clap::build_app();
let matches = app.get_matches();
for u in urls {
let new = rss::fetch_new(u)?;
for i in new.items() {
- let _ = db::insert_post(&conn, i)?;
+ let _ = db::insert_item(&conn, i)?;
}
}
.order(pub_date.desc())
.load::<models::Post>(&conn)?;
- dbg!(results);
+ send_posts(results)?;
Ok(())
}
-fn send_posts(posts: &Vec<models::Post>) {
- // TODO: store smtp values (username, password, smtp server) and create smtp client to send
- // with
- for post in posts {}
+fn send_posts(items: Vec<models::Post>) -> anyhow::Result<()> {
+ let config_file = "/tmp/rss-email.toml";
+ let mut string = String::new();
+ File::open(config_file)
+ .unwrap()
+ .read_to_string(&mut string)
+ .unwrap();
+
+ let value = (&string).parse::<Value>().unwrap();
+ let smtp = value.get("smtp").unwrap();
+ let smtp_user = smtp.get("smtp_user").unwrap().as_str().unwrap();
+ let smtp_pw = smtp.get("smtp_password").unwrap().as_str().unwrap();
+ let smtp_port = smtp.get("smtp_port").unwrap().as_integer().unwrap();
+ let smtp_server = smtp.get("smtp_server").unwrap().as_str().unwrap();
+ let to = value.get("to").unwrap().as_str().unwrap();
+ let from = value.get("from").unwrap().as_str().unwrap();
+
+ dbg!(smtp_user, smtp_pw, smtp_port, smtp_server, to, from);
+
+ for mut post in items {
+ // TODO: send via smtp, write sent field to database
+ post.sent = true;
+ }
+
+ Ok(())
}