mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-06-26 10:54:26 +02:00
Use TaskChampion 0.7.0, now via cxx instead of hand-rolled FFI (#3588)
TC 0.7.0 introduces a new `TaskData` type that maps to Taskwarrior's `Task` type more cleanly. It also introduces the idea of gathering lists of operations and "committing" them to a replica. A consequence of this change is that TaskChampion no longer automatically maintains dependency information, so Taskwarrior must do so, with its `TDB2::dependency_sync` method. This method does a very similar thing to what TaskChampion had been doing, so this is a shift of responsibility but not a major performance difference. Cxx is .. not great. It is missing a lot of useful things that make a general-purpose bridge impractical: - no support for trait objects - no support for `Option<T>` (https://github.com/dtolnay/cxx/issues/87) - no support for `Vec<Box<..>>` As a result, some creativity is required in writing the bridge, for example returning a `Vec<OptionTaskData>` from `all_task_data` to allow individual `TaskData` values to be "taken" from the vector. That said, Cxx is the current state-of-the-art, and does a good job of ensuring memory safety, at the cost of some slightly awkward APIs. Subsequent work can remove the "TDB2" layer and allow commands and other parts of Taskwarrior to interface directly with the `Replica`.
This commit is contained in:
parent
0f96fd31bf
commit
4ff63a7960
59 changed files with 1531 additions and 7631 deletions
|
@ -7,15 +7,12 @@ Taskwarrior has historically been a C++ project, but as of taskwarrior-3.0.0, th
|
|||
TaskChampion implements storage and access to "replicas" containing a user's tasks.
|
||||
It defines an abstract model for this data, and also provides a simple Rust API for manipulating replicas.
|
||||
It also defines a method of synchronizing replicas and provides an implementation of that method in the form of a sync server.
|
||||
TaskChampion provides a C interface via the `taskchampion-lib` crate, at `src/tc/lib`.
|
||||
|
||||
Other applications, besides Taskwarrior, can use TaskChampion to manage tasks.
|
||||
Taskwarrior is just one application using the TaskChampion interface.
|
||||
|
||||
## Taskwarrior's use of TaskChampion
|
||||
|
||||
Taskwarrior's interface to TaskChampion has a few layers:
|
||||
|
||||
* A Rust library, `takschampion-lib`, that presents `extern "C"` functions for use from C++, essentially defining a C interface to TaskChampion.
|
||||
* C++ wrappers for the types from `taskchampion-lib`, defined in [`src/tc`](../../src/tc), ensuring memory safety (with `unique_ptr`) and adding methods corresponding to the Rust API's methods.
|
||||
The wrapper types are in the C++ namespace, `tc`.
|
||||
Taskwarrior's interface to TaskChampion is in `src/taskchampion-cpp`.
|
||||
This links to `taskchampion` as a Rust dependency, and uses [cxx](https://cxx.rs) to build a C++ API for it.
|
||||
That API is defined, and documented, in `src/taskchampion-cpp/src/lib.rs`, and available in the `tc` namespace in C++ code.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue