What all the types have in common is that the last field is always a Vec<i32>. I want to write a macro that will define a method push back onto the Vec:
Unless there is a particular reason you cannot change your data structure, you might be better off with something like struct Data<const N: usize>([String; N], Vec<i32>).
Ah in this case the Strings were just there to illustrate that the Vec wasn't always at the same forward index. There are other types in practice so I can't substitute an array.
Since you have mentioned "arguments", I suspect this would translate to an additional pair of parenthesis on your call sites, which isn't nothing but isn't that big of a deal either.