tarantool-rs 0.0.10

Asyncronous tokio-based client for Tarantool
Documentation
use clap::Parser;
use rustyline::{error::ReadlineError, DefaultEditor};
use tarantool_rs::*;

const HISTORY_FILE: &str = "/tmp/tarantool_rs_cli_client_history.txt";

#[derive(Parser, Debug)]
#[command(author, version, about = "Dummy CLI client for Tarantool")]
struct Args {
    tarantool_address: String,
}

#[tokio::main]
async fn main() -> std::result::Result<(), anyhow::Error> {
    pretty_env_logger::init();

    let args = Args::parse();

    let conn = Connection::builder()
        .build(args.tarantool_address.clone())
        .await?;
    println!("connected to Tarantool instance {}", args.tarantool_address);

    let mut rl = DefaultEditor::new()?;
    let _ = rl.load_history(HISTORY_FILE);
    loop {
        let readline = rl.readline(&format!("{}> ", args.tarantool_address));
        match readline {
            Ok(line) => {
                let _ = rl.add_history_entry(line.as_str());
                process_input(&conn, line).await
            }
            Err(ReadlineError::Interrupted) => {
                break;
            }
            Err(ReadlineError::Eof) => {
                break;
            }
            Err(err) => {
                println!("Error: {}", err);
                break;
            }
        }
    }
    let _ = rl.save_history(HISTORY_FILE);
    Ok(())
}

async fn process_input(conn: &Connection, line: String) {
    let query = format!("return ({})", line);
    match conn
        .eval::<_, _>(query, ())
        .await
        .and_then(|resp| Ok(resp.decode_full()?))
    {
        Ok(x) => println!(
            "Result: {}",
            serde_json::to_string(&x).expect("All MessagePack values should be valid for JSON")
        ),
        Err(err) => eprintln!("Error: {}", err),
    }
}