1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use crate::error::Error;
use crate::import::import;
use crate::task::Task;
use std::io::Write;
use std::iter::once;
use std::process::{Child, Command, Stdio};
use serde_json;
pub fn query(query: &str) -> Result<Vec<Task>, Error> {
let mut cmd = add_query_to_cmd(query, Command::new("task"));
cmd.stdout(Stdio::piped());
run_query_cmd(cmd)
}
pub fn add_query_to_cmd(query: &str, mut cmd: Command) -> Command {
for x in query.split_whitespace().chain(once("export")) {
cmd.arg(x);
}
cmd
}
pub fn run_query_cmd(mut cmd: Command) -> Result<Vec<Task>, Error> {
let mut export = cmd.spawn()?;
export.wait()?;
import(export.stdout.ok_or(Error::TaskCmdError)?)
}
pub fn save_to_cmd(tasks: Vec<&'_ Task>, mut cmd: Command) -> Result<Child, Error> {
let input_buffer = serde_json::to_string(&tasks)?;
let mut import = cmd.spawn()?;
import
.stdin
.as_mut()
.ok_or(Error::TaskCmdError)?
.write_all(input_buffer.as_bytes())?;
Ok(import)
}
pub fn save<'a, T>(tasks: T) -> Result<(), Error>
where
T: IntoIterator<Item = &'a Task>,
{
save_async(tasks)?.wait()?;
Ok(())
}
pub fn save_async<'a, T>(tasks: T) -> Result<Child, Error>
where
T: IntoIterator<Item = &'a Task>,
{
let mut cmd = Command::new("task");
cmd.arg("import").stdin(Stdio::piped());
save_to_cmd(tasks.into_iter().collect(), cmd)
}