}
pub struct Client {
+ filename: String,
socket: UnixStream,
// If set, the client will print to stdout the messages sent and
impl Client {
pub fn connect<T: AsRef<str>>(filename: T, verbose: bool) -> Result<Self, ClientError> {
let filename = filename.as_ref().to_string();
- let socket = UnixStream::connect(filename)?;
- let mut client = Self { socket, verbose };
+ let socket = UnixStream::connect(&filename)?;
+ let mut client = Self {
+ filename,
+ socket,
+ verbose,
+ };
client.handshake()?;
Ok(client)
}
+ pub fn reconnect(&mut self) -> Result<(), ClientError> {
+ if self.verbose {
+ println!("Reconnecting to socket: {}", self.filename);
+ }
+ self.socket = UnixStream::connect(&self.filename)?;
+ self.handshake()?;
+ Ok(())
+ }
+
fn handshake(&mut self) -> Result<(), ClientError> {
self.send(&json!({"version": "0.2"}))?;
self.read().map(serde_json::from_value::<Response>)??;
if line.starts_with("quit") {
break;
}
- match command_parser.parse(&line) {
- Ok(command) => match interactive_request_response(&mut client, &command) {
- Ok(response) => {
- let response: Response = serde_json::from_value(response).unwrap();
- if response.status == "OK" {
- println!("Success:");
- println!(
- "{}",
- serde_json::to_string_pretty(&response.message).unwrap()
- );
- } else {
- println!("Error:");
- println!("{}", serde_json::to_string(&response.message).unwrap());
+ let mut retry = false;
+ loop {
+ match command_parser.parse(&line) {
+ Ok(command) => match interactive_request_response(&mut client, &command) {
+ Ok(response) => {
+ let response: Response = serde_json::from_value(response).unwrap();
+ if response.status == "OK" {
+ println!("Success:");
+ println!(
+ "{}",
+ serde_json::to_string_pretty(&response.message).unwrap()
+ );
+ } else {
+ println!("Error:");
+ println!("{}", serde_json::to_string(&response.message).unwrap());
+ }
+ break;
}
- }
+ Err(err) => {
+ println!("Error: {}", err);
+ if retry {
+ break;
+ }
+ if let Err(err) = client.reconnect() {
+ println!("Error: {}", &err);
+ break;
+ } else {
+ retry = true;
+ continue;
+ }
+ }
+ },
Err(err) => {
println!("{}", err);
+ break;
}
- },
- Err(err) => {
- println!("{}", err);
}
}
}