use serde::{Deserialize, Serialize};
use serde_json::Value;
use tracing::debug;
use crate::{
rpc::{ClientVersion, RpcApiContext, RpcHandler},
utils::RpcErr,
};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ClientVersionV1 {
pub code: String,
pub name: String,
pub version: String,
pub commit: String,
}
impl ClientVersionV1 {
pub fn from_client_version(cv: &ClientVersion) -> Self {
let commit = cv.commit.chars().take(8).collect::<String>();
Self {
code: "EX".to_string(),
name: cv.name.clone(),
version: format!("v{}", cv.version),
commit,
}
}
}
#[derive(Debug)]
pub struct GetClientVersionV1Request {
#[allow(dead_code)]
consensus_client: ClientVersionV1,
}
impl std::fmt::Display for GetClientVersionV1Request {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"GetClientVersionV1Request {{ consensus_client: {} {} {} }}",
self.consensus_client.code, self.consensus_client.name, self.consensus_client.version
)
}
}
impl RpcHandler for GetClientVersionV1Request {
fn parse(params: &Option<Vec<Value>>) -> Result<Self, RpcErr> {
let params = params
.as_ref()
.ok_or(RpcErr::BadParams("No params provided".to_owned()))?;
if params.len() != 1 {
return Err(RpcErr::BadParams("Expected 1 param".to_owned()));
}
let consensus_client: ClientVersionV1 = serde_json::from_value(params[0].clone())?;
Ok(GetClientVersionV1Request { consensus_client })
}
async fn handle(&self, context: RpcApiContext) -> Result<Value, RpcErr> {
debug!("Requested engine_getClientVersionV1: {self}");
let client_version =
ClientVersionV1::from_client_version(&context.node_data.client_version);
serde_json::to_value(vec![client_version])
.map_err(|error| RpcErr::Internal(error.to_string()))
}
}