Today was another Red Hat Day of Learning. Half a year ago I started learning Rust, but have not really done much with it since then. I did try to port simple-term, but that was quickly thwarted by the unmaintained and broken vte Rust binding for GTK3 – that issue is still way over my head, I didn’t make much progress after two hours of monkey patching.
I have used gtimelog to track my work for my entire professional life (since 2004). I recently recommended it to my wife, but Because Reasons™ it does not run on her SLES work machine. She has used some simple CLI time tracking app, but isn’t satisfied with that. Thus here was the idea and motivation – let’s write a gtimelog-like CLI time tracker in Rust!
It should have the same data format, and in fact the same file –
~/.gtimelog/timelog.txt, so that I can freely switch between gtimelog and
that CLI tracker. Other than that, it does not really need to do much: Enter a
new entry after finishing some task (or break), group them, and tally up the
per-activity, current-day, and current-week work and slack times.
So today, after long hours of RTFM, stackoverflowing, and brooding over compiler errors, rtimelog was born! When I start it, it looks like this:
Work done today: 10 h 45 min: day of learning: time logger in Rust 3 h 44 min: ** 0 h 18 min: team meeting 0 h 43 min: day of learning: create test and release workflows for rtimelog ------- Total work done: 11 h 46 min Total slacking: 3 h 44 min command (:h for help) or entry:
If you know gtimelog, this should be very familiar to you – that is deliberate 😉.
It does the basic stuff from above, the numbers exactly match the ones that I get in gtimelog, and I applied an appropriate amount of effort on the unit tests (for the limited time, anyway) to make sure that it does not screw up too much.
I also added workflows for unit tests and auto-building Linux, Windows, and MacOS binaries for releases.
Next steps that I want to do:
- Show time since last entry (“uncommitted current task”)
- Add an
:edit command to launch
- Add a noninteractive CLI, like
rtimelog add "team meeting"or
- Clean up the code with rustfmt and clippy
- Ideally, tab completion for common/repeated tasks Not sure how involved that is, for that I might need a full ncurses UI to be tasteful?
This was an intense, but successful day, and I already feel a lot less intimidated by Rust now. Nevertheless, if you are a Rust developer, I would really appreciate some hints how to improve the code – I’m sure this can be reduced by half, and made much more elegant.