ibc-relayer-cli 1.13.2

Hermes is an IBC Relayer written in Rust
use std::io;

use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader};
use tokio::net::TcpListener;
use tokio::net::TcpStream;
use tracing_subscriber::filter;
use tracing_subscriber::reload::Handle;

use ibc_relayer::config::TracingServerConfig;

pub type ReloadHandle<S> = Handle<filter::EnvFilter, S>;

pub async fn spawn_reload_handler<S>(
    reload_handle: ReloadHandle<S>,
    config: TracingServerConfig,
) -> io::Result<()> {
    if !config.enabled {
        return Ok(());
    }

    let listener = TcpListener::bind(("0.0.0.0", config.port)).await?;

    loop {
        let (socket, _) = listener.accept().await?;
        let mut reader = BufReader::new(socket);

        let mut buffer = String::new();
        reader.read_line(&mut buffer).await?;

        let mut socket = reader.into_inner();

        let cmd = buffer.trim_end();
        let _ = reload_handle.reload(filter::EnvFilter::new(cmd));
        let success_msg = format!("Successfully set tracing filter to `{}`", cmd);
        socket.write_all(success_msg.as_bytes()).await?;
    }
}

pub async fn send_command(cmd: &str, port: u16) -> io::Result<String> {
    let mut stream = TcpStream::connect(("127.0.0.1", port)).await?;

    stream.write_all(cmd.as_bytes()).await?;
    stream.write_all(b"\n").await?;

    let mut buffer = String::new();
    stream.read_to_string(&mut buffer).await?;

    Ok(buffer)
}