# tdtxt
[](https://github.com/Shemnei/tdtxt/actions?query=branch%3Amain)
[](https://crates.io/crates/tdtxt)
[](https://docs.rs/tdtxt)
[](https://github.com/Shemnei/tdtxt/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
[](https://unlicense.org/)
A rust library for de(serializing) files and text in the [todo.txt format](https://github.com/todotxt/todo.txt).
## STATE
**This crate is still in development, the api may not stable and could change in the future.**
This crate should not be used in production code.
## Usage
Add it to the dependencies of your `Cargo.toml`:
```toml
[dependencies]
tdtxt = "0.2"
```
Then use it:
```rust
use std::str::FromStr as _;
use tdtxt::{Task, Date, State, Priority, DateCompound};
let line = "x (A) 2016-05-20 2016-04-30 measure space for +chapelShelving @chapel due:2016-05-30";
let task = Task::from_str(line).unwrap();
assert_eq!(task.state(), &State::Done);
assert_eq!(task.priority(), Some(&Priority::A));
assert_eq!(task.date_compound(), Some(&DateCompound::Completed { created: Date::ymd(2016, 4, 30), completed: Date::ymd(2016, 5, 20) }));
assert_eq!(task.description().description(), "measure space for +chapelShelving @chapel due:2016-05-30");
assert_eq!(task.description().projects().collect::<Vec<_>>(), vec!["chapelShelving"]);
assert_eq!(task.description().contexts().collect::<Vec<_>>(), vec!["chapel"]);
assert_eq!(task.description().custom().collect::<Vec<_>>(), vec![("due", "2016-05-30")]);
```
```rust
use std::str::FromStr as _;
use tdtxt::{Task, Date, State, Priority, DateCompound};
let line = "x (A) 2016-05-20 2016-04-30 measure space for +chapelShelving @chapel due:2016-05-30";
let task = Task::build()
.state(State::Done)
.priority(Priority::A)
.date_compound(DateCompound::completed(Date::ymd(2016, 4, 30), Date::ymd(2016, 5, 20)))
.build("measure space for +chapelShelving @chapel due:2016-05-30");
assert_eq!(format!("{}", task), line);
assert_eq!(task.state(), &State::Done);
assert_eq!(task.priority(), Some(&Priority::A));
assert_eq!(task.date_compound(), Some(&DateCompound::Completed { created: Date::ymd(2016, 4, 30), completed: Date::ymd(2016, 5, 20) }));
assert_eq!(task.description().description(), "measure space for +chapelShelving @chapel due:2016-05-30");
assert_eq!(task.description().projects().collect::<Vec<_>>(), vec!["chapelShelving"]);
assert_eq!(task.description().contexts().collect::<Vec<_>>(), vec!["chapel"]);
assert_eq!(task.description().custom().collect::<Vec<_>>(), vec![("due", "2016-05-30")]);
```
## Examples
For more detailed examples, see the [`examples/`](https://github.com/Shemnei/tdtxt/tree/main/examples) directory.
Run one:
```bash
# Example `filter_open`
cargo run --example filter_open -- examples/todos.txt
```
## Features
### Serde (`serde`)
Serialize and deserialize the Task struct with serde.
#### Examples
```rust
use tdtxt::{Task, Date, State, Priority, DateCompound};
let task_should = Task::build()
.state(State::Done)
.priority(Priority::A)
.date_compound(DateCompound::completed(
Date::ymd(2016, 4, 30),
Date::ymd(2016, 5, 20),
))
.build("measure space for +chapelShelving @chapel due:2016-05-30");
let json = serde_json::to_string_pretty(&task_should).unwrap();
println!("{}", &json);
```
Example json output:
```json
{
"state": "Done",
"priority": "A",
"created": "2016-04-30",
"completed": "2016-05-20",
"description": "measure space for +chapelShelving @chapel due:2016-05-30"
}
```
**NOTE**
The order in which `created` and `completed` appear matters.