use std::net::SocketAddr;
use serde::{de::DeserializeOwned, Serialize};
use serde_json::json;
use snops_common::{rpc::error::SnarkosRequestError, state::NetworkId};
use super::REST_CLIENT;
use crate::env::error::EnvRequestError;
pub fn reparse_json<T: DeserializeOwned>(v: impl Serialize) -> Result<T, serde_json::Error> {
serde_json::from_value(json!(&v))
}
pub fn reparse_json_env<T: DeserializeOwned>(v: impl Serialize) -> Result<T, EnvRequestError> {
serde_json::from_value(json!(&v)).map_err(|e| {
EnvRequestError::AgentRequestError(SnarkosRequestError::JsonParseError(e.to_string()))
})
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum RoutePrefix {
StateRoot,
BlockHeight,
BlockHash,
}
pub fn route_prefix_check(route: &str) -> Option<RoutePrefix> {
match route {
"/latest/stateRoot" | "/stateRoot/latest" => Some(RoutePrefix::StateRoot),
"/latest/height" | "/block/height/latest" => Some(RoutePrefix::BlockHeight),
"/latest/hash" | "/block/hash/latest" => Some(RoutePrefix::BlockHash),
_ => None,
}
}
pub async fn get_on_addr<T: DeserializeOwned>(
network: NetworkId,
route: &str,
addr: SocketAddr,
) -> Result<T, SnarkosRequestError> {
let url = format!("http://{addr}/{network}{route}");
let request = REST_CLIENT.get(&url).send();
tokio::time::timeout(std::time::Duration::from_secs(5), request)
.await
.map_err(|_| SnarkosRequestError::TimedOut)?
.map_err(|e| SnarkosRequestError::RequestError(e.to_string()))?
.json::<T>()
.await
.map_err(|e| SnarkosRequestError::JsonParseError(e.to_string()))
}