1pub mod changeset;
12pub mod error;
13pub mod extension;
14pub mod io;
15pub mod persist;
16
17pub use changeset::{LabelChangeset, MergeStrategy};
18pub use error::Error;
19pub use extension::*;
20pub use io::{export, import};
21pub use persist::LabelPersister;
22
23use bip329::Label;
24use bitcoin::address::NetworkUnchecked;
25use bitcoin::bip32::Xpub;
26use bitcoin::{Address, OutPoint, PublicKey, Txid};
27use std::io::{BufRead, Write};
28
29pub struct OutputTarget(pub OutPoint);
31
32pub struct InputTarget(pub OutPoint);
34
35pub enum LabelTarget {
37 Txid(Txid),
38 Address(Address<NetworkUnchecked>),
39 PublicKey(String),
40 Input(OutPoint),
41 Output(OutPoint),
42 Xpub(String),
43}
44
45impl From<Txid> for LabelTarget {
46 fn from(txid: Txid) -> Self {
47 LabelTarget::Txid(txid)
48 }
49}
50
51impl From<Address<NetworkUnchecked>> for LabelTarget {
52 fn from(addr: Address<NetworkUnchecked>) -> Self {
53 LabelTarget::Address(addr)
54 }
55}
56
57impl From<PublicKey> for LabelTarget {
58 fn from(pk: PublicKey) -> Self {
59 LabelTarget::PublicKey(pk.to_string())
60 }
61}
62
63impl From<InputTarget> for LabelTarget {
64 fn from(input: InputTarget) -> Self {
65 LabelTarget::Input(input.0)
66 }
67}
68
69impl From<OutputTarget> for LabelTarget {
70 fn from(output: OutputTarget) -> Self {
71 LabelTarget::Output(output.0)
72 }
73}
74
75impl From<Xpub> for LabelTarget {
76 fn from(xp: Xpub) -> Self {
77 LabelTarget::Xpub(xp.to_string())
78 }
79}
80
81pub trait Bip329 {
83 fn add_label(
85 &mut self,
86 target: impl Into<LabelTarget>,
87 label_text: impl Into<String>,
88 ) -> Result<Label, Error>;
89
90 fn import_labels<R: BufRead>(
92 &mut self,
93 reader: R,
94 strategy: MergeStrategy,
95 ) -> Result<(), Error>;
96
97 fn export_labels<W: Write>(&self, writer: W) -> Result<(), Error>;
99}