Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove TranslatePk trait and clean up Translator trait #733

Merged
merged 8 commits into from
Sep 1, 2024

Conversation

apoelstra
Copy link
Member

This may be too much of a breaking change and an instance of rust-bitcoin/rust-bitcoin#3166, but the existing traits are really annoying to use. But this change is not essential to any of my other work so feel free to concept NACK it.

There are two changes here:

  • This drops the TranslatePk trait which had no business existing. It attempts to be generic over "things whose keys can be translated", but is missing impls (on keys themselves, for example) and anyway it is basically impossible to usefully be generic over this trait since it has an associated Output type which is unconstrained except by a comment saying "this must be Self<Q>. Really, the only purpose of this trait is to force users to write use miniscript::TranslatePk every time they want access to the translate_pk method.
  • It moves two of the generics in Translator from generics to associated types. This makes it far more ergonomic to implement and require the trait, since you no longer need to write 3 separate generics everywhere when two are implied. (Actually, all three are implied, including the source Pk type, but in practice users want to constrain this to match an existing key type that they've got. So I left it as a generic rather than an associated type.)

Copy link
Member Author

@apoelstra apoelstra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully ran local tests on 269f44d.

sanket1729
sanket1729 previously approved these changes Aug 30, 2024
Copy link
Member

@sanket1729 sanket1729 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK 269f44d.

Definitely makes the translate API easier to use.

@sanket1729
Copy link
Member

@apoelstra, the integration tests also need to be updated.

Copy link
Member Author

@apoelstra apoelstra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully ran local tests on 380a0d3.

@apoelstra
Copy link
Member Author

Current CI failure is because of bad doctest links. My local CI should be catching this. Will investigate..

@apoelstra
Copy link
Member Author

Got it. I was forcing no-std on any feature list that didn't have std in it, including the default-only list. But I only run the doc-link check (and clippy and fmt and a couple other things) when the feature-list is exclusiely default (otherwise I'd be running these checks for every feature combination, which is pointless because none of these checks use the feature list).

Will confirm that my local checks fail here, and then fix the PR.

We actually just empty it and deprecate it in an attempt to minimize
breakage. People *implementing* the trait will break anyway because the
next commit will have me changing the Translator trait. But the typical
case is that somebody imports the trait, then calls .translate_pk on
some object, and we want that usecase to continue working with only
warnings.
This is an annoying breaking change for users of the Translator trait
but I think it greatly improves the ergonomics of using the trait.
Rather than having it be parameterized over 3 types, it is now
parameterized over just one (the "source pk type").

This matches how this trait is used in practice -- you typically have a
miniscript/policy/whatever with a keytype Pk, and you want to use a
translator from Pk to "whatever the translator maps to" with "whatever
error the translator yields". So the only type parameter you really need
to type is Pk; the others are irrelevant, and making the user name and
type them is annoying.

Since this eliminates the need to explicitly write out the error types
except when actually implementing the trait, this also changes a ton of
error types from () to Infallible, which is more efficient and correct.
Copy link
Member Author

@apoelstra apoelstra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully ran local tests on 36b0659.

Copy link
Member

@sanket1729 sanket1729 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK 36b0659

@apoelstra apoelstra merged commit 1a3605d into rust-bitcoin:master Sep 1, 2024
30 checks passed
@apoelstra apoelstra deleted the 2024-08--translate-pk branch September 1, 2024 13:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants