Say we have struct X, struct Y, and struct Z, where X implements Into<Y> and Y implements Into<Z>. Then, X should implement Into<Z> automatically, with the filler code being similar to:
impl Into<Z> for X {
fn into(self) -> Z {
self.into::<Y>().into::<Z>()
}
}
There is a handy crate called transitive which allows you to derive transitive implementations of From, where you explicitly specify which conversions to go via. While not automatic, it at least means you don't need to write the filler code yourself.