For library code - yes, you’d usually want to direct users to the correct way of using the library, so you’d be more likely to come across fallible build
functions or a bunch of type parameters to constrain when it can be called.
For applications - honestly, it’s your code, so do what makes sense to you. Using a build function can help you ensure your settings were fully configured before using them, but it’s up to you if that’s the direction that makes the most sense to you. One benefit is you only need to perform the check once, but the downside is having another “built” type that you need to keep in sync with the original type. You can also look at libraries like derive_builder
if you want to have your builder generated for you to avoid needing to manually update two separate types.
I also avoid query syntax generally because I find it hard to map to method syntax with more complex queries. It’s a cool concept though, despite it being painful to use.