1+ use crate :: error:: WasmMiniscriptError ;
12use crate :: try_into_js_value:: TryIntoJsValue ;
23use miniscript:: bitcoin:: secp256k1:: Secp256k1 ;
34use miniscript:: bitcoin:: ScriptBuf ;
45use miniscript:: descriptor:: KeyMap ;
56use miniscript:: { DefiniteDescriptorKey , Descriptor , DescriptorPublicKey } ;
67use std:: str:: FromStr ;
7- use wasm_bindgen:: prelude:: wasm_bindgen;
8- use wasm_bindgen:: { JsError , JsValue } ;
8+ use wasm_bindgen:: prelude:: * ;
99
1010pub ( crate ) enum WrapDescriptorEnum {
1111 Derivable ( Descriptor < DescriptorPublicKey > , KeyMap ) ,
@@ -18,7 +18,7 @@ pub struct WrapDescriptor(pub(crate) WrapDescriptorEnum);
1818
1919#[ wasm_bindgen]
2020impl WrapDescriptor {
21- pub fn node ( & self ) -> Result < JsValue , JsError > {
21+ pub fn node ( & self ) -> Result < JsValue , WasmMiniscriptError > {
2222 Ok ( match & self . 0 {
2323 WrapDescriptorEnum :: Derivable ( desc, _) => desc. try_to_js_value ( ) ?,
2424 WrapDescriptorEnum :: Definite ( desc) => desc. try_to_js_value ( ) ?,
@@ -45,18 +45,20 @@ impl WrapDescriptor {
4545 }
4646
4747 #[ wasm_bindgen( js_name = atDerivationIndex) ]
48- pub fn at_derivation_index ( & self , index : u32 ) -> Result < WrapDescriptor , JsError > {
48+ pub fn at_derivation_index ( & self , index : u32 ) -> Result < WrapDescriptor , WasmMiniscriptError > {
4949 match & self . 0 {
5050 WrapDescriptorEnum :: Derivable ( desc, _keys) => {
5151 let d = desc. at_derivation_index ( index) ?;
5252 Ok ( WrapDescriptor ( WrapDescriptorEnum :: Definite ( d) ) )
5353 }
54- _ => Err ( JsError :: new ( "Cannot derive from a definite descriptor" ) ) ,
54+ _ => Err ( WasmMiniscriptError :: new (
55+ "Cannot derive from a definite descriptor" ,
56+ ) ) ,
5557 }
5658 }
5759
5860 #[ wasm_bindgen( js_name = descType) ]
59- pub fn desc_type ( & self ) -> Result < JsValue , JsError > {
61+ pub fn desc_type ( & self ) -> Result < JsValue , WasmMiniscriptError > {
6062 ( match & self . 0 {
6163 WrapDescriptorEnum :: Derivable ( desc, _) => desc. desc_type ( ) ,
6264 WrapDescriptorEnum :: Definite ( desc) => desc. desc_type ( ) ,
@@ -66,34 +68,36 @@ impl WrapDescriptor {
6668 }
6769
6870 #[ wasm_bindgen( js_name = scriptPubkey) ]
69- pub fn script_pubkey ( & self ) -> Result < Vec < u8 > , JsError > {
71+ pub fn script_pubkey ( & self ) -> Result < Vec < u8 > , WasmMiniscriptError > {
7072 match & self . 0 {
7173 WrapDescriptorEnum :: Definite ( desc) => Ok ( desc. script_pubkey ( ) . to_bytes ( ) ) ,
72- _ => Err ( JsError :: new ( "Cannot derive from a non-definite descriptor" ) ) ,
74+ _ => Err ( WasmMiniscriptError :: new ( "Cannot derive from a non-definite descriptor" ) ) ,
7375 }
7476 }
7577
76- fn explicit_script ( & self ) -> Result < ScriptBuf , JsError > {
78+ fn explicit_script ( & self ) -> Result < ScriptBuf , WasmMiniscriptError > {
7779 match & self . 0 {
7880 WrapDescriptorEnum :: Definite ( desc) => Ok ( desc. explicit_script ( ) ?) ,
79- WrapDescriptorEnum :: Derivable ( _, _) => {
80- Err ( JsError :: new ( "Cannot encode a derivable descriptor" ) )
81- }
82- WrapDescriptorEnum :: String ( _) => Err ( JsError :: new ( "Cannot encode a string descriptor" ) ) ,
81+ WrapDescriptorEnum :: Derivable ( _, _) => Err ( WasmMiniscriptError :: new (
82+ "Cannot encode a derivable descriptor" ,
83+ ) ) ,
84+ WrapDescriptorEnum :: String ( _) => Err ( WasmMiniscriptError :: new (
85+ "Cannot encode a string descriptor" ,
86+ ) ) ,
8387 }
8488 }
8589
86- pub fn encode ( & self ) -> Result < Vec < u8 > , JsError > {
90+ pub fn encode ( & self ) -> Result < Vec < u8 > , WasmMiniscriptError > {
8791 Ok ( self . explicit_script ( ) ?. to_bytes ( ) )
8892 }
8993
9094 #[ wasm_bindgen( js_name = toAsmString) ]
91- pub fn to_asm_string ( & self ) -> Result < String , JsError > {
95+ pub fn to_asm_string ( & self ) -> Result < String , WasmMiniscriptError > {
9296 Ok ( self . explicit_script ( ) ?. to_asm_string ( ) )
9397 }
9498
9599 #[ wasm_bindgen( js_name = maxWeightToSatisfy) ]
96- pub fn max_weight_to_satisfy ( & self ) -> Result < u32 , JsError > {
100+ pub fn max_weight_to_satisfy ( & self ) -> Result < u32 , WasmMiniscriptError > {
97101 let weight = ( match & self . 0 {
98102 WrapDescriptorEnum :: Derivable ( desc, _) => desc. max_weight_to_satisfy ( ) ,
99103 WrapDescriptorEnum :: Definite ( desc) => desc. max_weight_to_satisfy ( ) ,
@@ -102,26 +106,33 @@ impl WrapDescriptor {
102106 weight
103107 . to_wu ( )
104108 . try_into ( )
105- . map_err ( |_| JsError :: new ( "Weight exceeds u32" ) )
109+ . map_err ( |_| WasmMiniscriptError :: new ( "Weight exceeds u32" ) )
110+ }
111+
112+ fn from_string_derivable ( descriptor : & str ) -> Result < WrapDescriptor , WasmMiniscriptError > {
113+ let secp = Secp256k1 :: new ( ) ;
114+ let ( desc, keys) = Descriptor :: parse_descriptor ( & secp, descriptor) ?;
115+ Ok ( WrapDescriptor ( WrapDescriptorEnum :: Derivable ( desc, keys) ) )
116+ }
117+
118+ fn from_string_definite ( descriptor : & str ) -> Result < WrapDescriptor , WasmMiniscriptError > {
119+ let desc = Descriptor :: < DefiniteDescriptorKey > :: from_str ( descriptor) ?;
120+ Ok ( WrapDescriptor ( WrapDescriptorEnum :: Definite ( desc) ) )
106121 }
107122
108123 #[ wasm_bindgen( js_name = fromString, skip_typescript) ]
109- pub fn from_string ( descriptor : & str , pk_type : & str ) -> Result < WrapDescriptor , JsError > {
124+ pub fn from_string (
125+ descriptor : & str ,
126+ pk_type : & str ,
127+ ) -> Result < WrapDescriptor , WasmMiniscriptError > {
110128 match pk_type {
111- "derivable" => {
112- let secp = Secp256k1 :: new ( ) ;
113- let ( desc, keys) = Descriptor :: parse_descriptor ( & secp, descriptor) ?;
114- Ok ( WrapDescriptor ( WrapDescriptorEnum :: Derivable ( desc, keys) ) )
115- }
116- "definite" => {
117- let desc = Descriptor :: < DefiniteDescriptorKey > :: from_str ( descriptor) ?;
118- Ok ( WrapDescriptor ( WrapDescriptorEnum :: Definite ( desc) ) )
119- }
129+ "derivable" => WrapDescriptor :: from_string_derivable ( descriptor) ,
130+ "definite" => WrapDescriptor :: from_string_definite ( descriptor) ,
120131 "string" => {
121132 let desc = Descriptor :: < String > :: from_str ( descriptor) ?;
122133 Ok ( WrapDescriptor ( WrapDescriptorEnum :: String ( desc) ) )
123134 }
124- _ => Err ( JsError :: new ( "Invalid descriptor type" ) ) ,
135+ _ => Err ( WasmMiniscriptError :: new ( "Invalid descriptor type" ) ) ,
125136 }
126137 }
127- }
138+ }
0 commit comments