1
0
Fork 0

WIP: errorhandling in habitask

This commit is contained in:
Malte Brandy 2018-07-29 23:47:44 +02:00
parent 768c5bfabd
commit 29d81e40c3
3 changed files with 54 additions and 48 deletions

View file

@ -5,6 +5,7 @@ authors = ["Malte Brandy <malte.brandy@maralorn.de>"]
[dependencies]
task-hookrs = { git = "https://git.darmstadt.ccc.de/maralorn/task-hookrs.git"}
error-chain = "0.11.0"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

View file

@ -6,7 +6,8 @@ extern crate serde_json;
extern crate reqwest;
#[macro_use]
extern crate hyper;
#[macro_use]
extern crate error_chain;
extern crate config;
use reqwest::{IntoUrl, Client, RequestBuilder};
@ -18,6 +19,12 @@ use std::thread::sleep;
use std::time::Duration;
use config::{Config, Environment};
error_chain! {
foreign_links {
Io(::std::io::Error);
}
}
#[derive(Debug, Deserialize)]
struct Settings {
user: String,
@ -34,14 +41,13 @@ fn blink() {
}
fn query(filter: String) -> Vec<Task> {
fn query(filter: String) -> Result<Vec<Task>> {
let stdout = &Command::new("task")
.arg("export")
.arg(filter)
.output()
.unwrap()
.output()?
.stdout;
from_str(from_utf8(stdout).unwrap()).unwrap()
Ok(from_str(from_utf8(stdout)?)?)
}
#[derive(Deserialize)]
@ -64,10 +70,10 @@ struct Response {
impl Habitask {
fn new() -> Habitask {
fn new() -> Result<Habitask> {
let mut s = Config::new();
s.merge(Environment::with_prefix("habitask")).unwrap();
let s = s.try_into().unwrap();
s.merge(Environment::with_prefix("habitask"))?;
let s = s.try_into()?;
Habitask {
client: Client::new(),
settings: s,
@ -87,46 +93,43 @@ impl Habitask {
self.login(self.client.post(url))
}
fn make_todo(&self, name: &str, prio: &str, tasks: Vec<Task>) {
fn make_todo(&self, name: &str, prio: &str, tasks: Vec<Task>) -> Result<()> {
if tasks.len() == 0 {
return;
}
let Todo { id, .. } = self.create_todo(name, prio);
let Todo { id, .. } = self.create_todo(name, prio)?;
let mut checklist: Vec<Item> = Vec::new();
for task in tasks {
checklist = self.add_item(&id, &task.description()).checklist;
checklist = self.add_item(&id, &task.description())?.checklist;
blink();
}
for item in checklist {
self.check_item(&id, &item.id);
self.check_item(&id, &item.id)?;
blink();
}
Ok(())
}
fn create_todo(&self, name: &str, prio: &str) -> Todo {
fn create_todo(&self, name: &str, prio: &str) -> Result<Todo> {
let map = vec![("text", name), ("type", "todo"), ("priority", prio)];
self.post("https://habitica.com/api/v3/tasks/user")
.json(&map)
.send()
.unwrap()
.json::<Response>()
.unwrap()
.send()?
.json::<Response>()?
.data
}
fn add_item(&self, id: &str, item: &str) -> Todo {
fn add_item(&self, id: &str, item: &str) -> Result<Todo> {
let map = vec![("text", item)];
let url = format!("https://habitica.com/api/v3/tasks/{}/checklist", id);
self.post(&url)
Ok(self.post(&url)
.json(&map)
.send()
.unwrap()
.json::<Response>()
.unwrap()
.data
.send()?
.json::<Response>()?
.data)
}
fn check_item(&self, id: &str, item: &str) {
fn check_item(&self, id: &str, item: &str) -> Result<()>{
let url = format!(
"https://habitica.com/api/v3/tasks/{}/checklist/{}/score",
id,
@ -134,56 +137,57 @@ impl Habitask {
);
self.post(&url)
.json(&Vec::<(&str, &str)>::new())
.send()
.unwrap();
.send()?;
Ok(())
}
fn score_task(&self, id: &str) {
fn score_task(&self, id: &str) -> Result<()>{
let url = format!("https://habitica.com/api/v3/tasks/{}/score/up", id);
self.post(&url)
.json(&Vec::<(&str, &str)>::new())
.send()
.unwrap();
.send();
Ok(())
}
}
fn main() {
fn main() -> Result<()> {
let new = "-DELETED entry.after:now-24h";
let done = "+COMPLETED end.after:now-24h";
let after = "entry.after:now-";
let before = "entry.before:now-";
let mask = "-auto";
let instant_done = query(format!("{} -TAGGED {}48h {}", done, after, mask));
let created = query(format!("{} {}", new, mask));
let routines = query(format!("{} +auto", done));
let tasks = query(format!("{} {}1week {}", done, after, mask));
let a_little_old = query(format!("{} {}1month {}1week {}", done, after, before, mask));
let instant_done = query(format!("{} -TAGGED {}48h {}", done, after, mask))?;
let created = query(format!("{} {}", new, mask))?;
let routines = query(format!("{} +auto", done))?;
let tasks = query(format!("{} {}1week {}", done, after, mask))?;
let a_little_old = query(format!("{} {}1month {}1week {}", done, after, before, mask))?;
let old = query(format!(
"{} {}3month {}1month {}",
done,
after,
before,
mask
));
let very_old = query(format!("{} {}1year {}3month {}", done, after, before, mask));
let crazy_old = query(format!("{} {}1year {}", done, before, mask));
let habitask = Habitask::new();
))?;
let very_old = query(format!("{} {}1year {}3month {}", done, after, before, mask))?;
let crazy_old = query(format!("{} {}1year {}", done, before, mask))?;
let habitask = Habitask::new()?;
for _ in created {
habitask.score_task("note");
habitask.score_task("note")?;
blink();
}
for _ in instant_done {
habitask.score_task("do-it");
habitask.score_task("do-it")?;
blink();
}
habitask.make_todo("Routinen erledigt!", "0.1", routines);
habitask.make_todo("Herausforderungen bezwungen!", "1", tasks);
habitask.make_todo("Routinen erledigt!", "0.1", routines)?;
habitask.make_todo("Herausforderungen bezwungen!", "1", tasks)?;
habitask.make_todo(
"Ein paar Tage alte Herausforderungen bezwungen!",
"1.5",
a_little_old,
);
habitask.make_todo("Einige Wochen alte Herausforderungen bezwungen!", "2", old);
habitask.make_todo("Monate alte Herausforderungen bezwungen!", "2", very_old);
habitask.make_todo("Uralte Herausforderungen bezwungen!", "2", crazy_old);
)?;
habitask.make_todo("Einige Wochen alte Herausforderungen bezwungen!", "2", old)?;
habitask.make_todo("Monate alte Herausforderungen bezwungen!", "2", very_old)?;
habitask.make_todo("Uralte Herausforderungen bezwungen!", "2", crazy_old)?;
Ok(())
}

View file

@ -11,6 +11,7 @@ m-0 = {
taskwarrior.enable = true;
habitask.enable = true;
bugwarrior.enable = true;
rustdev.enable = true;
weechat = {
enable = true;
user = config.m-0.private.hackint.user;