#001: Reflection on command line tools written in Rust, Go and Python
Last week, one of my tools mult got featured on Terminal Trove (my ninth project on there; how did that happen?). This brought a few new visitors to its GitHub page, and one of them opened an issue for a feature request.
It had been a while since I’d shipped any updates to this tool, but seeing the request sparked enough interest to not only fulfill it, but also add a few improvements to it. It was also a good excuse to write some easy-going Go after several weeks of writing Rust and Python.
Writing code in all three languages back-to-back got me thinking about their respective strengths in building command line tooling. Writing a graph database tool in Python began as an easy task, but, as the codebase grew, Python’s exception-based error handling and lack of lower-level control left me uneasy at times about refactoring.
Go, on the other hand, made modifying mult much more straightforward. Time and again, I’ve found that Go strikes a great balance, with its Python-like simplicity and a type system that catches most mistakes before they get merged.
Yet for all of Go’s balance and Python’s ease, working with both lately has reinforced something for me: Rust still feels like the gold standard. The Rust tools I built this month (dfft and ting) feel more solid to me. I had more confidence in making changes to these codebases, and iterating on them was a joy. The combination of a great type system, move semantics, and rock-solid tooling keeps Rust as a top contender for building command line apps for me.
Since this whole train of thought started with mult, I should probably list the features I added to it.
Here’s the changelog:
Added
- Add “follow mode” (automatically select the latest command run)
- Allow restarting runs
- Keymaps for scrolling run list from the output pane
- Keymaps to move in list from the output pane
- Help pane
- Long form versions for CLI flags