|
| 1 | +use crate::keyring::BTreeMap; |
| 2 | + |
| 3 | +use bitcoin::Network; |
| 4 | +use chain::Merge; |
| 5 | +use miniscript::{Descriptor, DescriptorPublicKey}; |
| 6 | +use serde::{Deserialize, Serialize}; |
| 7 | + |
| 8 | +/// Represents changes to the `KeyRing`. |
| 9 | +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] |
| 10 | +pub struct ChangeSet<K: Ord> { |
| 11 | + /// Network. |
| 12 | + pub network: Option<Network>, |
| 13 | + /// Added descriptors. |
| 14 | + pub descriptors: BTreeMap<K, Descriptor<DescriptorPublicKey>>, |
| 15 | + /// Default keychain |
| 16 | + pub default_keychain: Option<K>, |
| 17 | +} |
| 18 | + |
| 19 | +impl<K: Ord> Default for ChangeSet<K> { |
| 20 | + fn default() -> Self { |
| 21 | + Self { |
| 22 | + network: None, |
| 23 | + descriptors: Default::default(), |
| 24 | + default_keychain: None, |
| 25 | + } |
| 26 | + } |
| 27 | +} |
| 28 | + |
| 29 | +impl<K: Ord> Merge for ChangeSet<K> { |
| 30 | + fn merge(&mut self, other: Self) { |
| 31 | + // merge network |
| 32 | + if other.network.is_some() && self.network.is_none() { |
| 33 | + self.network = other.network; |
| 34 | + } |
| 35 | + // merge descriptors |
| 36 | + self.descriptors.extend(other.descriptors); |
| 37 | + |
| 38 | + // Note: if a new default keychain has been set, it will take precedence over the old one. |
| 39 | + if other.default_keychain.is_some() { |
| 40 | + self.default_keychain = other.default_keychain; |
| 41 | + } |
| 42 | + } |
| 43 | + |
| 44 | + fn is_empty(&self) -> bool { |
| 45 | + self.network.is_none() && self.descriptors.is_empty() |
| 46 | + } |
| 47 | +} |
0 commit comments