Adding OOP, whether upfront or afterthought is bad idea in Rust, usually. 99% of time you don't need OOP at all.
What people normally understand as “OOP” (implementation inheritance) is just simply never works — and is explicitly not supported by Rust.
Now, “just forget about OOP” is good idea approximately 99% of time, not 100% of time. Sometimes you have to have OOP (e.g. if you use Rust to implement some kind of Java class then you would have to deal with OOP, obviously) — but I don't see where may you need OOP in you task.
Where in these documents one may find out about something that needs OOP? Remember: the problematic case that OOP have is combination of arbitrary expandable list of supported object types and, simultaneously, arbitrary expandable list of supported operations. That's what never works and couldn't ever work and is not supported in Rust (except via ugly tricks).
In all these documents the only thing that I can see are straightforward ADTs, sum types and product types — which are handled perfectly without any dyn Trair and other such mechanisms. If I'm wrong then can you, please, show me where they are not sufficient.
So you like to feel a lot of pain… your choice, obviously.
You would invent some OOP facsimile. And would then ask why something that is easy and fast in OOP languages is so painful and slow in Rust. Ultimately it's your choice, but AFAICS so far you are clearly looking for a way to apply spork in a language that only have spoon and fork. And, worse, in the vain hope to obtain that spork you are trying to eat soup with fork.
Not a good idea, at the first glance, but need to know more to understand why it's so important for you to have explandable list of types where specification clearly have finite list of them.
You absolutely can do that in Rust. The same way you may do that in C: fully manual implementation where something that is two lines of code in OOP languages becomes 20 lines of code with couple of tables and bazillion macros.
The big question is: why do you want that? It's wrong idea 99% of time!
Yes, but we know thing that Rust very forcibly rejects and makes extremely hard to use: open-ended, expandable, list of operations and, simultaneously, open-ended, expandable, list of types.
It never works, not in any OOP language (as explained in most OOP tutorials when they discuss “composition vs inheritance” choice, even if very few admit it's inborn and completely unfixable flaw in the whole concept) and in Rust, if you need it, you would have to do quite a crazy contortions to support that combo.