]> git.bitcoin.ninja Git - ldk-c-bindings/commit
Add a `*Ref` struct for traits and `Deref` to it rather than `Self`
authorMatt Corallo <git@bluematt.me>
Mon, 26 Aug 2024 18:52:07 +0000 (18:52 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 26 Aug 2024 23:31:36 +0000 (23:31 +0000)
commit26d603f8001cbe519244b34d0480d86d820c47f9
tree05ed5d2c681ae0b0a0aee185de9d4ba2d40b39df
parentf7f26a192fbd3d0dffa809206cb9e9132f66fe18
Add a `*Ref` struct for traits and `Deref` to it rather than `Self`

Because LDK often takes `Deref<Target=Trait>` as type parameters,
we'd implemented `Deref { type Target=Self; .. }` for the traits
defined in the bindings crate. This worked well, but because Rust
auto-`Deref`s, it can lead to spurious compilation failures due to
infinite recursion trying to deref.

In the past we've worked around this by coming up with alternative
compilation strategies when faced with `Deref` recursion, but we
don't strictly need to.

Instead, here, we introduce duplicates of all our `Trait` structs
which become the `Deref` `Target`. This way, we can `Deref` into
the `Trait` and maintain LDK compatibility, without having any
infinite `Deref` recursion issues.

One complication is traits which contain associated types to define
`Deref`s to another associated type, e.g.

trait A {
    type B;
    type C: Deref<Target = Self::B>;
}

In this case, `B` needs to be the `TraitRef` and `C` needs to be
the `Trait`. We add code specifically to detect this case.
c-bindings-gen/src/main.rs