diff --git a/src/launch.rs b/src/launch.rs index 50184e4..04465d9 100644 --- a/src/launch.rs +++ b/src/launch.rs @@ -1,4 +1,60 @@ -use serde::Deserialize; +use serde::{Deserialize, Deserializer}; +use serde_json::Value; + +#[derive(Debug)] +pub enum PumpDevEvent { + Connected { client_id: u64, message: String }, + ConnectionStatus { connected: bool, timestamp: u64 }, + Subscribed { method: String }, + Create(NewToken), +} + +impl<'de> Deserialize<'de> for PumpDevEvent { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = Value::deserialize(deserializer)?; + + if value.get("txType").is_some() { + let token: NewToken = + serde_json::from_value(value).map_err(serde::de::Error::custom)?; + + return Ok(PumpDevEvent::Create(token)); + } + + #[derive(Deserialize)] + #[serde(tag = "type")] + enum Tagged { + #[serde(rename = "connected")] + Connected { + #[serde(rename = "clientId")] + client_id: u64, + message: String, + }, + + #[serde(rename = "connectionStatus")] + ConnectionStatus { connected: bool, timestamp: u64 }, + + #[serde(rename = "subscribed")] + Subscribed { method: String }, + } + + match serde_json::from_value(value).map_err(serde::de::Error::custom)? { + Tagged::Connected { client_id, message } => { + Ok(PumpDevEvent::Connected { client_id, message }) + } + Tagged::ConnectionStatus { + connected, + timestamp, + } => Ok(PumpDevEvent::ConnectionStatus { + connected, + timestamp, + }), + Tagged::Subscribed { method } => Ok(PumpDevEvent::Subscribed { method }), + } + } +} #[derive(Debug, Deserialize)] pub struct NewToken { @@ -6,16 +62,10 @@ pub struct NewToken { pub name: String, pub symbol: String, pub uri: String, - #[serde(rename = "marketCapSol")] pub market_cap_sol: f64, - #[serde(rename = "solAmount")] pub sol_amount: f64, - #[serde(rename = "traderPublicKey")] pub trader_public_key: String, - - #[serde(rename = "txType")] - pub tx_type: String, } diff --git a/src/main.rs b/src/main.rs index d99d65c..edf66d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,7 @@ async fn main() -> anyhow::Result<()> { while let Some(msg) = ws.next().await { let msg = msg?; if let tokio_tungstenite::tungstenite::Message::Text(text) = msg { - let token: serde_json::Value = serde_json::from_str(&text)?; + let token: launch::PumpDevEvent = serde_json::from_str(&text)?; println!("{:?}", token); } }