excalidraw flow and basic rust ws
This commit is contained in:
13
rust_test/test_world/Cargo.toml
Normal file
13
rust_test/test_world/Cargo.toml
Normal file
@@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "test_world"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
tokio-tungstenite = { version = "0.24", features = ["native-tls"] }
|
||||
futures-util = "0.3"
|
||||
url = "2"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
redis = "0.25.0"
|
||||
70
rust_test/test_world/src/main.rs
Normal file
70
rust_test/test_world/src/main.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
use tokio_tungstenite::{connect_async, tungstenite::protocol::Message};
|
||||
use futures_util::StreamExt;
|
||||
use url::Url;
|
||||
use serde::{Serialize, Deserialize};
|
||||
use redis::Commands;
|
||||
|
||||
// Aster Book Ticker (TOB)
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
pub struct BookTickerResponse {
|
||||
pub stream: String,
|
||||
pub data: BookTickerData,
|
||||
}
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
pub struct BookTickerData {
|
||||
#[serde(rename(deserialize = "e"))]
|
||||
pub event_type: String,
|
||||
#[serde(rename(deserialize = "u"))]
|
||||
pub update_id: u64,
|
||||
#[serde(rename(deserialize = "s"))]
|
||||
pub symbol: String,
|
||||
#[serde(rename(deserialize = "b"))]
|
||||
pub best_bid_price: String,
|
||||
#[serde(rename(deserialize = "B"))]
|
||||
pub best_bid_qty: String,
|
||||
#[serde(rename(deserialize = "a"))]
|
||||
pub best_ask_price: String,
|
||||
#[serde(rename(deserialize = "A"))]
|
||||
pub best_ask_qty: String,
|
||||
#[serde(rename(deserialize = "T"))]
|
||||
pub transaction_time: u64,
|
||||
#[serde(rename(deserialize = "E"))]
|
||||
pub event_time: u64,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
// Connect to a local Valkey instance
|
||||
let vk_client = redis::Client::open("redis://localhost:6379/0").unwrap();
|
||||
let mut con = vk_client.get_connection().unwrap();
|
||||
|
||||
let url = Url::parse("wss://fstream.asterdex.com/stream?streams=btcusdt@bookTicker").unwrap();
|
||||
let (ws_stream, _) = connect_async(url.as_str()).await.expect("Failed to connect");
|
||||
println!("WebSocket client connected");
|
||||
|
||||
let (_, mut read) = ws_stream.split();
|
||||
|
||||
while let Some(msg) = read.next().await {
|
||||
match msg {
|
||||
Ok(Message::Text(text)) => {
|
||||
let parsed: BookTickerResponse = serde_json::from_str(&text).expect("Failed to parse JSON");
|
||||
println!("Symbol: {} - Bid: {}", parsed.data.symbol, parsed.data.best_bid_price);
|
||||
let serialized: String = serde_json::to_string(&parsed).map_err(|_| "Serialization failed").expect("Failed to serialize struct");
|
||||
// println!("{:?}", serialized);
|
||||
let _: () = con.set("test_key", serialized).unwrap();
|
||||
},
|
||||
Ok(Message::Binary(bin)) => println!("[binary] {} bytes", bin.len()),
|
||||
Ok(Message::Ping(_)) => println!("[ping]"),
|
||||
Ok(Message::Pong(_)) => println!("[pong]"),
|
||||
Ok(Message::Close(frame)) => {
|
||||
println!("[close] {:?}", frame);
|
||||
break;
|
||||
}
|
||||
Ok(Message::Frame(_)) => {}
|
||||
Err(e) => {
|
||||
eprintln!("[error] {e}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user