33/// but for now we need to keep this compatibility layer.
44use wasm_bindgen:: JsValue ;
55
6- use crate :: address:: { bech32, cashaddr, AddressError , Base58CheckCodec } ;
6+ use crate :: address:: { bech32, cashaddr, Base58CheckCodec } ;
77use crate :: bitcoin:: { Script , ScriptBuf } ;
88
9+ pub use crate :: address:: AddressError ;
10+
911type Result < T > = std:: result:: Result < T , AddressError > ;
1012
1113pub struct CashAddr {
@@ -24,111 +26,9 @@ pub struct Network {
2426impl Network {
2527 /// Parse a Network object from a JavaScript value
2628 pub fn from_js_value ( js_network : & JsValue ) -> Result < Self > {
27- // Helper to get a required number field
28- let get_number = |key : & str | -> Result < u32 > {
29- let value =
30- js_sys:: Reflect :: get ( js_network, & JsValue :: from_str ( key) ) . map_err ( |_| {
31- AddressError :: InvalidAddress ( format ! (
32- "Failed to read {} from network object" ,
33- key
34- ) )
35- } ) ?;
36-
37- value
38- . as_f64 ( )
39- . ok_or_else ( || AddressError :: InvalidAddress ( format ! ( "{} must be a number" , key) ) )
40- . map ( |n| n as u32 )
41- } ;
42-
43- // Helper to get an optional string field
44- let get_optional_string = |key : & str | -> Result < Option < String > > {
45- let value =
46- js_sys:: Reflect :: get ( js_network, & JsValue :: from_str ( key) ) . map_err ( |_| {
47- AddressError :: InvalidAddress ( format ! (
48- "Failed to read {} from network object" ,
49- key
50- ) )
51- } ) ?;
52-
53- if value. is_undefined ( ) || value. is_null ( ) {
54- Ok ( None )
55- } else {
56- value
57- . as_string ( )
58- . ok_or_else ( || {
59- AddressError :: InvalidAddress ( format ! ( "{} must be a string" , key) )
60- } )
61- . map ( Some )
62- }
63- } ;
64-
65- let pub_key_hash = get_number ( "pubKeyHash" ) ?;
66- let script_hash = get_number ( "scriptHash" ) ?;
67- let bech32 = get_optional_string ( "bech32" ) ?;
68-
69- // Parse optional cashAddr object
70- let cash_addr = {
71- let cash_addr_obj = js_sys:: Reflect :: get ( js_network, & JsValue :: from_str ( "cashAddr" ) )
72- . map_err ( |_| {
73- AddressError :: InvalidAddress (
74- "Failed to read cashAddr from network object" . to_string ( ) ,
75- )
76- } ) ?;
77-
78- if cash_addr_obj. is_undefined ( ) || cash_addr_obj. is_null ( ) {
79- None
80- } else {
81- let prefix = js_sys:: Reflect :: get ( & cash_addr_obj, & JsValue :: from_str ( "prefix" ) )
82- . map_err ( |_| {
83- AddressError :: InvalidAddress ( "Failed to read cashAddr.prefix" . to_string ( ) )
84- } ) ?
85- . as_string ( )
86- . ok_or_else ( || {
87- AddressError :: InvalidAddress ( "cashAddr.prefix must be a string" . to_string ( ) )
88- } ) ?;
89-
90- let pub_key_hash =
91- js_sys:: Reflect :: get ( & cash_addr_obj, & JsValue :: from_str ( "pubKeyHash" ) )
92- . map_err ( |_| {
93- AddressError :: InvalidAddress (
94- "Failed to read cashAddr.pubKeyHash" . to_string ( ) ,
95- )
96- } ) ?
97- . as_f64 ( )
98- . ok_or_else ( || {
99- AddressError :: InvalidAddress (
100- "cashAddr.pubKeyHash must be a number" . to_string ( ) ,
101- )
102- } ) ? as u32 ;
103-
104- let script_hash =
105- js_sys:: Reflect :: get ( & cash_addr_obj, & JsValue :: from_str ( "scriptHash" ) )
106- . map_err ( |_| {
107- AddressError :: InvalidAddress (
108- "Failed to read cashAddr.scriptHash" . to_string ( ) ,
109- )
110- } ) ?
111- . as_f64 ( )
112- . ok_or_else ( || {
113- AddressError :: InvalidAddress (
114- "cashAddr.scriptHash must be a number" . to_string ( ) ,
115- )
116- } ) ? as u32 ;
117-
118- Some ( CashAddr {
119- prefix,
120- pub_key_hash,
121- script_hash,
122- } )
123- }
124- } ;
125-
126- Ok ( Network {
127- pub_key_hash,
128- script_hash,
129- cash_addr,
130- bech32,
131- } )
29+ use crate :: try_from_js_value:: TryFromJsValue ;
30+ Network :: try_from_js_value ( js_network)
31+ . map_err ( |e| AddressError :: InvalidAddress ( e. to_string ( ) ) )
13232 }
13333}
13434
0 commit comments