use anyhow::Result;
pub struct RelayResponse {
pub status: u16,
pub body: String,
}
#[derive(Clone)]
pub struct RelayClient {
base: String,
http: reqwest::Client,
}
impl RelayClient {
pub fn new(base_url: impl Into<String>) -> Self {
let base = base_url.into();
let base = base.trim_end_matches('/').to_string();
Self {
base,
http: reqwest::Client::new(),
}
}
pub fn base_url(&self) -> &str {
&self.base
}
async fn finish(resp: reqwest::Response) -> Result<RelayResponse> {
let status = resp.status().as_u16();
let body = resp.text().await.unwrap_or_default();
Ok(RelayResponse { status, body })
}
pub async fn get_signal(&self, kind: &str, mint: &str) -> Result<RelayResponse> {
let url = format!("{}/signal/{}/{}", self.base, kind, mint);
Self::finish(self.http.get(url).send().await?).await
}
pub async fn inference_quote(&self, intent_digest: &str) -> Result<RelayResponse> {
let url = format!("{}/inference/quote", self.base);
let body = serde_json::json!({ "intent_digest": intent_digest });
Self::finish(self.http.post(url).json(&body).send().await?).await
}
pub async fn experience_buy(&self, max_price: u64) -> Result<RelayResponse> {
let url = format!("{}/experience/buy", self.base);
let body = serde_json::json!({ "max_price": max_price });
Self::finish(self.http.post(url).json(&body).send().await?).await
}
pub async fn health(&self) -> Result<RelayResponse> {
let url = format!("{}/health", self.base);
Self::finish(self.http.get(url).send().await?).await
}
}