I have a struct which is meant to store, with minimal memory overhead, some data.
This struct may be either generated at build time and compiled in, or generated at runtime and loaded into the program.
The struct has a field that stores a list of tokens. I used generics to allow my tokens to be either String in the owned scenario or &'static str in the const scenario, but I can't find a way to unify the struct to work with lists of tokens in both.
Not without overhead, these two types have very different memory layouts. At a performance hit, you could use Cow<'static, [PatternElement<Cow<'static str>>]> to represent the data, but this has a bit of overhead on access.
You can call .into_boxed_slice() on a String, and then Box::leak() it, so it'll give you a &'static str, and then you can keep merrily using &'static str everywhere.
Of course that leaks, so it's best to limit this to one-time-only global things. It's theoretically possible to free this memory if you can somehow know which &'static str was from leaked string, by calling Box::from_raw on it.
Even in non-hacky owned case, if the strings don't need to grow, then Box<str> is a bit smaller to store (2usize) than String (3usize).