use crate::primitives::RUGCHECK_URL;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct Risk {
pub name: String,
pub level: String,
pub description: String,
pub score: f64,
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct TokenCheck {
pub token_program: String,
pub token_type: String,
pub risks: Vec<Risk>,
}
pub async fn fetch_summary_report(mint: String) -> Result<TokenCheck, Box<dyn std::error::Error>> {
let url = format!("{}/tokens/{}/report/summary", RUGCHECK_URL, mint);
let response = reqwest::get(&url).await?;
if !response.status().is_success() {
return Err(format!("HTTP error! status: {}", response.status()).into());
}
let data: serde_json::Value = response.json().await?;
let mut token_check = TokenCheck::default();
let token_program = data.get("tokenProgram").and_then(|p| p.as_str()).expect("tokenProgram field");
token_check.token_program = token_program.into();
let token_type = data.get("tokenType").and_then(|p| p.as_str()).expect("tokenType field");
token_check.token_type = token_type.into();
let mut risks: Vec<Risk> = vec![];
let risks_data = data.get("risks").and_then(|p| p.as_array()).expect("risks field");
for risk in risks_data {
let mut r = Risk::default();
let name = risk.get("name").and_then(|p| p.as_str()).expect("name field");
let description = risk.get("description").and_then(|p| p.as_str()).expect("description field");
let score = risk.get("score").and_then(|p| p.as_f64()).expect("score field");
let level = risk.get("level").and_then(|p| p.as_str()).expect("level field");
r.name = name.into();
r.description = description.into();
r.score = score;
r.level = level.into();
risks.push(r);
}
token_check.risks = risks;
Ok(token_check)
}