* Use try!/map_err instead of match
* Use jsonrpc_core for serializing/deserializing rpc messages * Factor out unwraps * Remove mem::replace * Add nicer formating of ConfirmationRequests
This commit is contained in:
@@ -15,7 +15,7 @@ use std::fs::File;
|
||||
|
||||
use futures::Future;
|
||||
|
||||
fn sign_interactive(signer: &mut SignerRpc, pwd: &String, request: ConfirmationRequest)
|
||||
fn sign_interactive(signer: &mut SignerRpc, password: &str, request: ConfirmationRequest)
|
||||
{
|
||||
print!("\n{}\nSign this transaction? (y)es/(N)o/(r)eject: ", request);
|
||||
let _ = stdout().flush();
|
||||
@@ -23,7 +23,7 @@ fn sign_interactive(signer: &mut SignerRpc, pwd: &String, request: ConfirmationR
|
||||
Some(Ok(line)) => {
|
||||
match line.to_lowercase().chars().nth(0) {
|
||||
Some('y') => {
|
||||
match sign_transaction(signer, request.id, pwd) {
|
||||
match sign_transaction(signer, request.id, password) {
|
||||
Ok(s) | Err(s) => println!("{}", s),
|
||||
}
|
||||
}
|
||||
@@ -39,128 +39,129 @@ fn sign_interactive(signer: &mut SignerRpc, pwd: &String, request: ConfirmationR
|
||||
}
|
||||
}
|
||||
|
||||
fn sign_transactions(signer: &mut SignerRpc, pwd: String) -> Result<String, String> {
|
||||
signer.requests_to_confirm().map(|reqs| {
|
||||
fn sign_transactions(signer: &mut SignerRpc, password: String) -> Result<String, String> {
|
||||
try!(signer.requests_to_confirm().map(|reqs| {
|
||||
match reqs {
|
||||
Ok(ref reqs) if reqs.is_empty() => {
|
||||
Ok("No transactions in signing queue".to_owned())
|
||||
}
|
||||
Ok(reqs) => {
|
||||
if reqs.len() == 0 {
|
||||
Ok("No transactions in signing queue".to_string())
|
||||
} else {
|
||||
for r in reqs {
|
||||
sign_interactive(signer, &pwd, r)
|
||||
}
|
||||
Ok("".to_string())
|
||||
for r in reqs {
|
||||
sign_interactive(signer, &password, r)
|
||||
}
|
||||
Ok("".to_owned())
|
||||
}
|
||||
Err(err) => {
|
||||
Err(format!("error: {:?}", err))
|
||||
}
|
||||
}
|
||||
}).wait().unwrap()
|
||||
}).map_err(|err| {
|
||||
format!("{:?}", err)
|
||||
}).wait())
|
||||
}
|
||||
|
||||
fn list_transactions(signer: &mut SignerRpc) -> Result<String, String> {
|
||||
signer.requests_to_confirm().map(|reqs| {
|
||||
try!(signer.requests_to_confirm().map(|reqs| {
|
||||
match reqs {
|
||||
Ok(reqs) => {
|
||||
let mut s = "Transaction queue:".to_string();
|
||||
if reqs.len() == 0 {
|
||||
s = s + &"No transactions in signing queue";
|
||||
} else {
|
||||
for r in reqs {
|
||||
s = s + &format!("\n{}", r);
|
||||
}
|
||||
}
|
||||
Ok(s)
|
||||
Ok(ref reqs) if reqs.is_empty() => {
|
||||
Ok("No transactions in signing queue".to_owned())
|
||||
}
|
||||
Ok(ref reqs) => {
|
||||
Ok(format!("Transaction queue:\n{}", reqs
|
||||
.iter()
|
||||
.map(|r| format!("{}", r))
|
||||
.collect::<Vec<String>>()
|
||||
.join("\n")))
|
||||
}
|
||||
Err(err) => {
|
||||
Err(format!("error: {:?}", err))
|
||||
}
|
||||
}
|
||||
}).wait().unwrap()
|
||||
}).map_err(|err| {
|
||||
format!("{:?}", err)
|
||||
}).wait())
|
||||
}
|
||||
|
||||
fn sign_transaction(signer: &mut SignerRpc,
|
||||
id: U256,
|
||||
pwd: &String) -> Result<String, String> {
|
||||
signer.confirm_request(id, None, &pwd).map(|res| {
|
||||
password: &str) -> Result<String, String> {
|
||||
try!(signer.confirm_request(id, None, password).map(|res| {
|
||||
match res {
|
||||
Ok(u) => Ok(format!("Signed transaction id: {:#x}", u)),
|
||||
Err(e) => Err(format!("{:?}", e)),
|
||||
}
|
||||
}).wait().unwrap()
|
||||
}).map_err(|err| {
|
||||
format!("{:?}", err)
|
||||
}).wait())
|
||||
}
|
||||
|
||||
fn reject_transaction(signer: &mut SignerRpc,
|
||||
id: U256) -> Result<String, String> {
|
||||
signer.reject_request(id).map(|res| {
|
||||
try!(signer.reject_request(id).map(|res| {
|
||||
match res {
|
||||
Ok(true) => Ok(format!("Rejected transaction id {:#x}", id)),
|
||||
Ok(false) => Err(format!("No such request")),
|
||||
Err(e) => Err(format!("{:?}", e)),
|
||||
}
|
||||
}).wait().unwrap()
|
||||
}).map_err(|err| {
|
||||
format!("{:?}", err)
|
||||
}).wait())
|
||||
}
|
||||
|
||||
// cmds
|
||||
|
||||
pub fn cmd_signer_list(signerport: u16,
|
||||
authfile: PathBuf) -> Result<String, String> {
|
||||
match SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport),
|
||||
&authfile) {
|
||||
Ok(mut signer) => {
|
||||
list_transactions(&mut signer)
|
||||
}
|
||||
Err(e) => Err(format!("{:?}", e))
|
||||
}
|
||||
let mut signer = try!(SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport), &authfile).map_err(|err| {
|
||||
format!("{:?}", err)
|
||||
}));
|
||||
list_transactions(&mut signer)
|
||||
}
|
||||
|
||||
pub fn cmd_signer_reject(id: usize,
|
||||
signerport: u16,
|
||||
pub fn cmd_signer_reject(id: Option<usize>, signerport: u16,
|
||||
authfile: PathBuf) -> Result<String, String> {
|
||||
match SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport),
|
||||
&authfile) {
|
||||
Ok(mut signer) => {
|
||||
reject_transaction(&mut signer, U256::from(id))
|
||||
},
|
||||
Err(e) => Err(format!("{:?}", e))
|
||||
}
|
||||
let id = try!(id.ok_or(format!("id required for signer reject")));
|
||||
let mut signer = try!(SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport), &authfile).map_err(|err| {
|
||||
format!("{:?}", err)
|
||||
}));
|
||||
reject_transaction(&mut signer, U256::from(id))
|
||||
}
|
||||
|
||||
pub fn cmd_signer_sign(id: Option<usize>,
|
||||
pwfile: Option<PathBuf>,
|
||||
signerport: u16,
|
||||
authfile: PathBuf) -> Result<String, String> {
|
||||
let pwd;
|
||||
let password;
|
||||
match pwfile {
|
||||
Some(pwfile) => {
|
||||
match File::open(pwfile) {
|
||||
Ok(fd) => {
|
||||
match BufReader::new(fd).lines().next() {
|
||||
Some(Ok(line)) => pwd = line,
|
||||
Some(Ok(line)) => password = line,
|
||||
_ => return Err(format!("No password in file"))
|
||||
}
|
||||
},
|
||||
Err(e) => return Err(format!("Could not open pwfile: {}", e))
|
||||
Err(e) => return Err(format!("Could not open password file: {}", e))
|
||||
}
|
||||
}
|
||||
None => {
|
||||
pwd = rpassword::prompt_password_stdout("Password: ").unwrap();
|
||||
password = match rpassword::prompt_password_stdout("Password: ") {
|
||||
Ok(p) => p,
|
||||
Err(e) => return Err(format!("{}", e)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
match SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport),
|
||||
&authfile) {
|
||||
Ok(mut signer) => {
|
||||
match id {
|
||||
Some(id) => {
|
||||
sign_transaction(&mut signer, U256::from(id), &pwd)
|
||||
},
|
||||
None => {
|
||||
sign_transactions(&mut signer, pwd)
|
||||
}
|
||||
}
|
||||
let mut signer = try!(SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport), &authfile).map_err(|err| {
|
||||
format!("{:?}", err)
|
||||
}));
|
||||
|
||||
match id {
|
||||
Some(id) => {
|
||||
sign_transaction(&mut signer, U256::from(id), &password)
|
||||
},
|
||||
None => {
|
||||
sign_transactions(&mut signer, password)
|
||||
}
|
||||
Err(e) => return Err(format!("{:?}", e))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user