For something like a username where there are certain requirements on what a valid username looks like, I would normally implement FromStr and (maybe) a Username::parse() function. Then,as part of the Username doc-comments I might add an example showing how something like "Michael-F-Bryan".parse() returns Ok while "$@!#!".parse() returns an Err.
Most of the time I'll try to make new() really trivial and infallible. For constructors that may fail, I find there's almost always a more descriptive name you can use (Identifier::parse(), Config::from_yaml(), etc.).
I generally prefer named fallible constructors or FromStr over TryFrom because "parse a username from a string" tells you a lot more about what it will do and the expected failure modes than "try to convert a string to a username".