use crate::Error;
use ethexe_common::Address;
use ethexe_rpc_client::DevClient;
use jsonrpsee::{
http_client::HttpClient,
ws_client::{WsClient, WsClientBuilder},
};
use std::{net::SocketAddrV4, process::Child};
#[derive(Debug)]
pub struct VaraEthInstance {
pub(crate) rpc_addr: SocketAddrV4,
pub(crate) eth_rpc_addr: SocketAddrV4,
pub(crate) child: Child,
}
impl VaraEthInstance {
pub async fn router_address(&self) -> Result<Address, Error> {
self.http_client()?
.router_address()
.await
.map_err(Error::QueryRouterAddress)
}
pub async fn ws_client(&self) -> Result<WsClient, Error> {
WsClientBuilder::new()
.build(self.ws_endpoint())
.await
.map_err(Error::BuildWsClient)
}
pub fn http_client(&self) -> Result<HttpClient, Error> {
HttpClient::builder()
.build(self.http_endpoint())
.map_err(Error::BuildHttpClient)
}
pub fn ws_endpoint(&self) -> String {
format!("ws://{}", self.rpc_addr)
}
pub fn http_endpoint(&self) -> String {
format!("http://{}", self.rpc_addr)
}
pub fn ethereum_ws_endpoint(&self) -> String {
format!("ws://{}", self.eth_rpc_addr)
}
pub fn ethereum_http_endpoint(&self) -> String {
format!("http://{}", self.eth_rpc_addr)
}
}
impl Drop for VaraEthInstance {
fn drop(&mut self) {
#[cfg(unix)]
{
let pid = self.child.id() as i32;
unsafe { libc::kill(-pid, libc::SIGTERM) };
}
#[cfg(not(unix))]
let _ = self.child.kill();
}
}