-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
Motivation
After #3350 a couple of things that were easily achievable with a match statement are convoluted/potentially less performant.
Simple examples:
Accessing the kind of key by value when supporting more than one kind requires clone
Getting the value of the key while supporting more than one key type
match key {
Secp256k1(pk) => {
do_smth_with_secp256k1_value(pk)
}
Ed25519(pk) => {
do_smth_with_ed25519_value(pk)
}
}Now this requires a clone since into_secp256k1 consumes the value
if let Some(pk) = key.clone().into_secp256k1() {
do_smth_with_secp256k1_value(pk)
} else if let Some(pk) = key.into_ed25519() {
do_smth_with_ed25519_value(pk)
}Accessing the kind of key by reference
match &key {
Secp256k1(pk /* A reference */) => {
do_smth_with_secp256k1_ref(pk)
}
Ed25519(pk /* A reference */ ) => {
do_smth_with_ed25519_ref(pk)
}
}Now this requires a clone since into_secp256k1 consumes the value
if let Some(pk) = key.clone().into_secp256k1() {
do_smth_with_secp256k1_ref(&pk)
} else if let Some(pk) = key.into_ed25519() {
do_smth_with_ed25519_ref(&pk)
}Supporting a new key kind
Before: Enable the feature and compiler would tell of a missing match branch.
Now: Enable feature and dig in the code where the into_keykind() are, to add a new one
Proposed sol
Assuming the code base is going ahead with this deprecation,
for 1: Implement TryFrom/TryInto for the necessary types. Alternative, add the matching try_into_secp256k1 and others. In these, the error type should give back the original key to be used.
for 2: Implement AsRef for the necessary types. Alternative, add the matching as_secp245k1() and others
for 3. Can't see a good solution right now
Are you planning to do it yourself in a pull request?
Maybe.