@@ -17,12 +17,15 @@ use bdk_wallet::{
1717 } ,
1818 template:: DescriptorTemplate ,
1919} ;
20- use cli_table:: { Cell , CellStruct , Style , Table } ;
21- use serde_json:: { Value , json} ;
2220
2321use crate :: error:: BDKCliError as Error ;
22+ use crate :: handlers:: types:: { DescriptorResult , KeychainPair } ;
2423
25- pub fn generate_descriptors ( desc_type : & str , key : & str , network : Network ) -> Result < Value , Error > {
24+ pub fn generate_descriptors (
25+ desc_type : & str ,
26+ key : & str ,
27+ network : Network ,
28+ ) -> Result < DescriptorResult , Error > {
2629 let is_private = key. starts_with ( "xprv" ) || key. starts_with ( "tprv" ) ;
2730
2831 if is_private {
@@ -49,7 +52,7 @@ fn generate_private_descriptors(
4952 desc_type : & str ,
5053 key : & str ,
5154 network : Network ,
52- ) -> Result < Value , Error > {
55+ ) -> Result < DescriptorResult , Error > {
5356 use bdk_wallet:: template:: { Bip44 , Bip49 , Bip84 , Bip86 } ;
5457
5558 let secp = Secp256k1 :: new ( ) ;
@@ -85,25 +88,28 @@ fn generate_private_descriptors(
8588 let internal_priv = internal_desc. to_string_with_secret ( & internal_keymap) ;
8689 let internal_pub = internal_desc. to_string ( ) ;
8790
88- Ok ( json ! ( {
89- "public_descriptors" : {
90- "external" : external_pub,
91- "internal" : internal_pub
92- } ,
93- "private_descriptors" : {
94- "external" : external_priv,
95- "internal" : internal_priv
96- } ,
97- "fingerprint" : fingerprint. to_string( )
98- } ) )
91+ Ok ( DescriptorResult {
92+ descriptor : None ,
93+ multipath_descriptor : None ,
94+ public_descriptors : Some ( KeychainPair {
95+ external : external_pub,
96+ internal : internal_pub,
97+ } ) ,
98+ private_descriptors : Some ( KeychainPair {
99+ external : external_priv,
100+ internal : internal_priv,
101+ } ) ,
102+ mnemonic : None ,
103+ fingerprint : Some ( fingerprint. to_string ( ) ) ,
104+ } )
99105}
100106
101107/// Generate descriptors from public key (xpub/tpub)
102108pub fn generate_public_descriptors (
103109 desc_type : & str ,
104110 key : & str ,
105111 derivation_path : & DerivationPath ,
106- ) -> Result < Value , Error > {
112+ ) -> Result < DescriptorResult , Error > {
107113 let xpub: Xpub = key. parse ( ) ?;
108114 let fingerprint = xpub. fingerprint ( ) ;
109115
@@ -122,14 +128,17 @@ pub fn generate_public_descriptors(
122128
123129 let external_pub = build_descriptor ( "0" ) ?;
124130 let internal_pub = build_descriptor ( "1" ) ?;
125-
126- Ok ( json ! ( {
127- "public_descriptors" : {
128- "external" : external_pub,
129- "internal" : internal_pub
130- } ,
131- "fingerprint" : fingerprint. to_string( )
132- } ) )
131+ Ok ( DescriptorResult {
132+ descriptor : None ,
133+ multipath_descriptor : None ,
134+ public_descriptors : Some ( KeychainPair {
135+ external : external_pub,
136+ internal : internal_pub,
137+ } ) ,
138+ private_descriptors : None ,
139+ mnemonic : None ,
140+ fingerprint : Some ( fingerprint. to_string ( ) ) ,
141+ } )
133142}
134143
135144/// Build a descriptor from a public key
@@ -158,15 +167,15 @@ pub fn build_public_descriptor(
158167pub fn generate_descriptor_with_mnemonic (
159168 network : Network ,
160169 desc_type : & str ,
161- ) -> Result < serde_json :: Value , Error > {
170+ ) -> Result < DescriptorResult , Error > {
162171 let mnemonic: GeneratedKey < Mnemonic , Segwitv0 > =
163172 Mnemonic :: generate ( ( WordCount :: Words12 , Language :: English ) ) . map_err ( Error :: BIP39Error ) ?;
164173
165174 let seed = mnemonic. to_seed ( "" ) ;
166175 let xprv = Xpriv :: new_master ( network, & seed) ?;
167176
168177 let mut result = generate_descriptors ( desc_type, & xprv. to_string ( ) , network) ?;
169- result[ " mnemonic" ] = json ! ( mnemonic. to_string( ) ) ;
178+ result. mnemonic = Some ( mnemonic. to_string ( ) ) ;
170179 Ok ( result)
171180}
172181
@@ -175,91 +184,12 @@ pub fn generate_descriptor_from_mnemonic(
175184 mnemonic_str : & str ,
176185 network : Network ,
177186 desc_type : & str ,
178- ) -> Result < serde_json :: Value , Error > {
187+ ) -> Result < DescriptorResult , Error > {
179188 let mnemonic = Mnemonic :: parse_in ( Language :: English , mnemonic_str) ?;
180189 let seed = mnemonic. to_seed ( "" ) ;
181190 let xprv = Xpriv :: new_master ( network, & seed) ?;
182191
183192 let mut result = generate_descriptors ( desc_type, & xprv. to_string ( ) , network) ?;
184- result[ " mnemonic" ] = json ! ( mnemonic_str) ;
193+ result. mnemonic = Some ( mnemonic_str. to_string ( ) ) ;
185194 Ok ( result)
186195}
187-
188- pub fn format_descriptor_output ( result : & Value , pretty : bool ) -> Result < String , Error > {
189- if !pretty {
190- return Ok ( serde_json:: to_string_pretty ( result) ?) ;
191- }
192-
193- let mut rows: Vec < Vec < CellStruct > > = vec ! [ ] ;
194-
195- if let Some ( desc_type) = result. get ( "type" ) {
196- rows. push ( vec ! [
197- "Type" . cell( ) . bold( true ) ,
198- desc_type. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
199- ] ) ;
200- }
201-
202- if let Some ( finger_print) = result. get ( "fingerprint" ) {
203- rows. push ( vec ! [
204- "Fingerprint" . cell( ) . bold( true ) ,
205- finger_print. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
206- ] ) ;
207- }
208-
209- if let Some ( network) = result. get ( "network" ) {
210- rows. push ( vec ! [
211- "Network" . cell( ) . bold( true ) ,
212- network. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
213- ] ) ;
214- }
215- if let Some ( multipath_desc) = result. get ( "multipath_descriptor" ) {
216- rows. push ( vec ! [
217- "Multipart Descriptor" . cell( ) . bold( true ) ,
218- multipath_desc. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
219- ] ) ;
220- }
221- if let Some ( pub_descs) = result. get ( "public_descriptors" ) . and_then ( |v| v. as_object ( ) ) {
222- if let Some ( ext) = pub_descs. get ( "external" ) {
223- rows. push ( vec ! [
224- "External Public" . cell( ) . bold( true ) ,
225- ext. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
226- ] ) ;
227- }
228- if let Some ( int) = pub_descs. get ( "internal" ) {
229- rows. push ( vec ! [
230- "Internal Public" . cell( ) . bold( true ) ,
231- int. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
232- ] ) ;
233- }
234- }
235- if let Some ( priv_descs) = result
236- . get ( "private_descriptors" )
237- . and_then ( |v| v. as_object ( ) )
238- {
239- if let Some ( ext) = priv_descs. get ( "external" ) {
240- rows. push ( vec ! [
241- "External Private" . cell( ) . bold( true ) ,
242- ext. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
243- ] ) ;
244- }
245- if let Some ( int) = priv_descs. get ( "internal" ) {
246- rows. push ( vec ! [
247- "Internal Private" . cell( ) . bold( true ) ,
248- int. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
249- ] ) ;
250- }
251- }
252- if let Some ( mnemonic) = result. get ( "mnemonic" ) {
253- rows. push ( vec ! [
254- "Mnemonic" . cell( ) . bold( true ) ,
255- mnemonic. as_str( ) . unwrap_or( "N/A" ) . cell( ) ,
256- ] ) ;
257- }
258-
259- let table = rows
260- . table ( )
261- . display ( )
262- . map_err ( |e| Error :: Generic ( e. to_string ( ) ) ) ?;
263-
264- Ok ( format ! ( "{table}" ) )
265- }
0 commit comments