Fix type deserialization

This commit is contained in:
2026-08-05 05:22:12 +02:00
parent 5553774d52
commit cfa33e11cc
2 changed files with 58 additions and 8 deletions
+57 -7
View File
@@ -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<D>(deserializer: D) -> Result<Self, D::Error>
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,
}
+1 -1
View File
@@ -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);
}
}