“How is the existence of a data type an implementation detail?”
The enum is used as indexes into a vector of strings that was created by splitting a string. Effectively I want to turn the string values in the vector into a higher level abstraction that is typed (not a struct of strings).
The entire point of the crate is that users of the crate should not have to worry about the original string of values. So exposing the enum (or a wrapper) is defeating the purpose of the crate. Also, that enum could change over time as new fields are added to the original strings. Users should only have to worry about the higher level struct not the array of string values or the indexes of those string values.
Therefore by making the enum or a wrapper of the enum public, it’s exposing implementation details. That wrapper or the enum itself becomes part of the public API. And experience has shown that users will use anything that’s public.
Also, now that I’ve done the implementation of a newtype, I also don’t like the newtype pattern because it’s an unnecessary level of indirection. Instead of using the enum I have to use the wrapper and, again, there’s almost no value in the wrapper. So I’ve rejected the newtype pattern for this case.