Traits
Ref - https://doc.rust-lang.org/book/ch10-02-traits.html
Traits are similar to interfaces in Java/JS. They let you define the shape
/ interface
of what you’re building
trait Shape { fn area(&self) -> f32;}
Structs cam implement these traits
struct Rect { width: f32, height: f32}
impl Shape for Rect { fn area(&self) -> f32 { return self.width * self.height }}
You can define a function that takes in any struct that implements this trait
fn get_area(shape: impl Shape) -> f32 { return shape.area() }
Or
fn get_area_2<T: Shape>(shape: T) -> f32 { return shape.area() }
Or
fn get_area_3<T>(shape: T) -> f32 where T: Shape{ return shape.area()}