To chime in on this: configuration is one of the textbook cases of a “cross-cutting concern”; it’s a little thing, but it is needed everywhere. “Everywhere” is always hard, no matter how tiny it is.
Other examples of cross-cutting concerns are logging and database access, for which it is commonly accepted to use high-powered libraries, and people will actively warn you away from rolling your own.
As for the reticence to pull in crates: this is very common for people coming from other languages, and very understandable. My advice is to stop worrying about it in Rust.
In most other languages, pulling in a library is hard and comes with a lot of overhead. Which version to use, how to upgrade it, how to link it to the build system, how to distribute it, etc…
And then some new release comes out and I have to rewrite half my code because some core API changed…
Lots of hassle! So people habitually avoid dependencies for “little” things.
Leftpad (leftpad! for crying out loud!). There are real advantages to tiny lego-block modules and it Just Works™ because the package manager is so good.
Rust has Cargo, and a community committed to Semantic Versioning (i.e. “not-breaking APIs”, even with tooling).
Cargo solves almost all of the hassles of distribution and building, and the community focus on not-breaking means upgrades are virtually always a breeze.
Depencency management in Rust is probably the least painful/most pleasant in the world right now.
(Barring the open question on how to deal with system dependencies, which is unsolved in any language, and more the domain of linux distributions, mobile app-stores, etc.)
(Edit: added lots of links of where I get these wild ideas from )