use silentdragonlitelib ::lightclient ::{ self , LightClientConfig } ;
use silentdragonlite_cli ::{ configure_clapapp ,
report_permission_error ,
startup ,
start_interactive ,
attempt_recover_seed } ;
use log ::error ;
pub fn main ( ) {
// Get command line arguments
use clap ::{ App , Arg } ;
let fresh_app = App ::new ( "SilentDragonLite CLI" ) ;
let configured_app = configure_clapapp ! ( fresh_app ) ;
let matches = configured_app . get_matches ( ) ;
if matches . is_present ( "recover" ) {
// Create a Light Client Config in an attempt to recover the file.
attempt_recover_seed ( ) ;
return ;
}
let command = matches . value_of ( "COMMAND" ) ;
let params = matches . values_of ( "PARAMS" ) . map ( | v | v . collect ( ) ) . or ( Some ( vec ! [ ] ) ) . unwrap ( ) ;
let maybe_server = matches . value_of ( "server" ) . map ( | s | s . to_string ( ) ) ;
let seed = matches . value_of ( "seed" ) . map ( | s | s . to_string ( ) ) ;
let maybe_birthday = matches . value_of ( "birthday" ) ;
if seed . is_some ( ) & & maybe_birthday . is_none ( ) {
eprintln ! ( "ERROR!" ) ;
eprintln ! ( "Please specify the wallet birthday (eg. '--birthday 600000') to restore from seed." ) ;
eprintln ! ( "This should be the block height where the wallet was created. If you don't remember the block height, you can pass '--birthday 0' to scan from the start of the blockchain." ) ;
return ;
}
let birthday = match maybe_birthday . unwrap_or ( "0" ) . parse ::< u64 > ( ) {
Ok ( b ) = > b ,
Err ( e ) = > {
eprintln ! ( "Couldn't parse birthday. This should be a block number. Error={}" , e ) ;
return ;
}
} ;
let server = LightClientConfig ::get_server_or_default ( maybe_server ) ;
// Test to make sure the server has all of scheme, host and port
if server . scheme_str ( ) . is_none ( ) | | server . host ( ) . is_none ( ) | | server . port ( ) . is_none ( ) {
eprintln ! ( "Please provide the --server parameter as [scheme]://[host]:[port].\nYou provided: {}" , server ) ;
return ;
}
let dangerous = matches . is_present ( "dangerous" ) ;
let nosync = matches . is_present ( "nosync" ) ;
let ( command_tx , resp_rx ) = match startup ( server , dangerous , seed , birthday , ! nosync , command . is_none ( ) ) {
Ok ( c ) = > c ,
Err ( e ) = > {
eprintln ! ( "Error during startup: {}" , e ) ;
error ! ( "Error during startup: {}" , e ) ;
if cfg ! ( target_os = "unix" ) {
match e . raw_os_error ( ) {
Some ( 13 ) = > report_permission_error ( ) ,
_ = > { } ,
}
} ;
return ;
}
} ;
if command . is_none ( ) {
start_interactive ( command_tx , resp_rx ) ;
} else {
command_tx . send (
( command . unwrap ( ) . to_string ( ) ,
params . iter ( ) . map ( | s | s . to_string ( ) ) . collect ::< Vec < String > > ( ) ) )
. unwrap ( ) ;
match resp_rx . recv ( ) {
Ok ( s ) = > println ! ( "{}" , s ) ,
Err ( e ) = > {
let e = format ! ( "Error executing command {}: {}" , command . unwrap ( ) , e ) ;
eprintln ! ( "{}" , e ) ;
error ! ( "{}" , e ) ;
}
}
// Save before exit
command_tx . send ( ( "save" . to_string ( ) , vec ! [ ] ) ) . unwrap ( ) ;
resp_rx . recv ( ) . unwrap ( ) ;
}
}