This confused me, my line of thinking was something like this: wait, Option is not a trait, is CfgState a trait?, then why is this not &dyn CfgState?, oh, wait... In other words, this syntax looks ambiguous, especially if mixed with other arguments: impl<A, B> Trait<X: A, Y: B, Z: C>.
Here the order is different from the other place where as is used to name something, as in use fmt::Result as FmtResult.
Another alternative that I think fits better with current generics (this could be combined with any of the previous syntaxes inside the <>)
impl<type I = Option<&CfgState>> From<I> for ... { ... }
namely, the type alias is introduced for the impl block, same as where generic type parameters are introduced, rather than in the application of the From trait constructor.
I actually really like thus method and the reasoning for why it should be on the impl block makes even more sense. Plus the syntax is basically the same as type definitions already, just comma separated.
The main thing keeping in mind in this design space is that generalizing this feature to allow arbitrary types on the left hand side is the sort of trivially undecidable typechecking problem we try to avoid. That is, you cannot start trying to solve SomeType<T>::Assoc = AnotherType<U>::Assoc without running into trouble.
But just creating a trivially substitutable name for a concrete type is not so impossible. Mainly it’s the problem that every feature runs into: determining the priority for the project, bikeshedding the syntax, and deciding the impact on the user experience.