It would be really cool if Fang could generate a TUI form for your app with https://github.com/charmbracelet/huh (by the same org). Is something like that on the roadmap?
I’ve been maintaining rust-starter[!] for quite sometime now. It is kind of the equivalent of fang but for Rust. It uses Clap which is the equivalent of Cobra; though I don’t think Clap has the same kind of fancy output?
Throughout these years, I have found that cross-compiling is the most challenging part of creating a CLI. When you are building a web back-end, you control the execution environment (usually linux). For CLIs, your users could be on Linux, macOS or Windows. You need to get three x2 binaries (so a total of 6) to have a fair coverage.
I’ve tried cross, but for Windows and macOS you need licenses. There is no straightforward way to give your users Docker images and have them running in a few commands. You can compile on GitHub action machines, but that’s a very slow feedback loop. I wonder if things are better in Go land.
Golang itself bundles a toolchain and can cross compile to a many target OSes and architectures. I use Goreleaser [1] to create GitHub releases, Homebrew packages, Docker images, and Linux packages. Goreleaser Pro can also create MSI packages.
ETA since I just saw Christian chime in: the Goreleaser author works at Charm.sh =)
GoReleaser is indeed an awesome tool and we use it for every applicable project.
And actually Carlos, who builds GoReleaser, is the true author of Fang and took it from concept to execution.
threemux · 2h ago
Wow TIL cross compilation is a bit of a pain in Rust. I assumed it was as easy as Go. I can confirm as long as you're using pure Go (no cgo), it's as easy as setting $GOOS and $GOARCH appropriately.
paulddraper · 1h ago
The difficulty is due to Rust dynamically linking and Go statically linking. The former requires the system libs.
That said, I am unfamiliar with any licensing for Windows builds.
MacOS has some niche (usually discarded) technicalities like you can only use the SDK on Apple hardware.
threemux · 1h ago
I think that's a reference to the use of Docker in the "cross" tool that makes cross compilation easier but I'm not certain
christianrocha · 2h ago
I feel your pain. That said, cross compiling from Go is pretty trivial, as long as everything is pure Go, which it most often is. That’s one if the reasons we invested in jt.
(Hello from Charm! I’m one of the authors of this library.)
mootoday · 2h ago
This is great, lots I learned by looking at your code and the dependencies you use!
I started a similar thing, although not as feature-rich as yours. My goal was to follow CLI best practices and add all the boilerplate one needs to build a Rust CLI.
Gum looks awesome. Gonna keep it in-mind next time I need to write a shell CLI.
jmsdnns · 2h ago
This is awesome! Love the work the charm bracelet team is doing.
christianrocha · 1h ago
Thank you for the very kind words. Hello from Charm!
RSHEPP · 2h ago
Just re-wrote an internal CLI to urfave from custom, but having issues with v3 autocomplete scripts. Might just take the time to switch over to cobra and use this.
jonpalmisc · 2h ago
Stubborn complaint (and maybe a hot take): I dislike CLIs that try to be overly pretty. I don't receive any tangible benefit as the user from the "fancy" (their words) help output. I'd much rather simple plain text output that looks like all the other tools I already use.
arp242 · 1h ago
Alignment (and maybe bold text for some things) is all you need in >95% of cases, IMHO.
One of the downsides of a lot of these tools is that's exactly what they don't do well: many things don't align or wrap nicely.
For example, here's a comparison of this fang library vs one where I just raw-dogged the usage text: https://imgur.com/a/QWh9TLD – the nice alignment does a lot more than colours. Especially for larger programs with a bunch of flags it can be such a pain. For example from an otherwise quite nice tool: https://imgur.com/a/RELL9Gk – you just completely lose any "overview".
I did spend some time on some better tooling to improve all of this, because manually writing these isn't super-fun either, but not so straight-forward to do well (or at least: not in a way that I like).
assbuttbuttass · 1h ago
agreed, plain text is more scriptable too. Let me pipe it into awk!
caarlos0 · 1h ago
If you do it right, you can output plain text when stdout is not a tty - which is something fang does, fwiw :)
arp242 · 1h ago
It still tries to put the terminal in raw mode or something. "cmd | less" doesn't work and requires "stty sane". I didn't investigate, but FYI.
Similar work: https://github.com/chriskiehl/Gooey and https://github.com/Sorcerio/Argparse-Interface
I've wanted to do TUI form generation for my own CLI framework since 2023 ( https://github.com/bbkane/warg/issues/71 ), but I still haven't gotten around to it
Throughout these years, I have found that cross-compiling is the most challenging part of creating a CLI. When you are building a web back-end, you control the execution environment (usually linux). For CLIs, your users could be on Linux, macOS or Windows. You need to get three x2 binaries (so a total of 6) to have a fair coverage.
I’ve tried cross, but for Windows and macOS you need licenses. There is no straightforward way to give your users Docker images and have them running in a few commands. You can compile on GitHub action machines, but that’s a very slow feedback loop. I wonder if things are better in Go land.
!: https://github.com/rust-starter/rust-starter
ETA since I just saw Christian chime in: the Goreleaser author works at Charm.sh =)
[1] https://goreleaser.com
And actually Carlos, who builds GoReleaser, is the true author of Fang and took it from concept to execution.
That said, I am unfamiliar with any licensing for Windows builds.
MacOS has some niche (usually discarded) technicalities like you can only use the SDK on Apple hardware.
(Hello from Charm! I’m one of the authors of this library.)
I started a similar thing, although not as feature-rich as yours. My goal was to follow CLI best practices and add all the boilerplate one needs to build a Rust CLI.
https://github.com/mootoday/cli-template
They have a TUI framework, too, among a lot of other related things. Some of their projects are Go libraries, some are a CLI tool, such as gum.
[1] https://github.com/charmbracelet/gum
One of the downsides of a lot of these tools is that's exactly what they don't do well: many things don't align or wrap nicely.
For example, here's a comparison of this fang library vs one where I just raw-dogged the usage text: https://imgur.com/a/QWh9TLD – the nice alignment does a lot more than colours. Especially for larger programs with a bunch of flags it can be such a pain. For example from an otherwise quite nice tool: https://imgur.com/a/RELL9Gk – you just completely lose any "overview".
I did spend some time on some better tooling to improve all of this, because manually writing these isn't super-fun either, but not so straight-forward to do well (or at least: not in a way that I like).