Fix type deserialization
This commit is contained in:
+57
-7
@@ -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)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct NewToken {
|
pub struct NewToken {
|
||||||
@@ -6,16 +62,10 @@ pub struct NewToken {
|
|||||||
pub name: String,
|
pub name: String,
|
||||||
pub symbol: String,
|
pub symbol: String,
|
||||||
pub uri: String,
|
pub uri: String,
|
||||||
|
|
||||||
#[serde(rename = "marketCapSol")]
|
#[serde(rename = "marketCapSol")]
|
||||||
pub market_cap_sol: f64,
|
pub market_cap_sol: f64,
|
||||||
|
|
||||||
#[serde(rename = "solAmount")]
|
#[serde(rename = "solAmount")]
|
||||||
pub sol_amount: f64,
|
pub sol_amount: f64,
|
||||||
|
|
||||||
#[serde(rename = "traderPublicKey")]
|
#[serde(rename = "traderPublicKey")]
|
||||||
pub trader_public_key: String,
|
pub trader_public_key: String,
|
||||||
|
|
||||||
#[serde(rename = "txType")]
|
|
||||||
pub tx_type: String,
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
while let Some(msg) = ws.next().await {
|
while let Some(msg) = ws.next().await {
|
||||||
let msg = msg?;
|
let msg = msg?;
|
||||||
if let tokio_tungstenite::tungstenite::Message::Text(text) = 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);
|
println!("{:?}", token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user