excalidraw flow and basic rust ws

This commit is contained in:
2026-04-30 17:56:57 +00:00
parent 1ac0909c21
commit 7d579faa82
7 changed files with 2859 additions and 29 deletions

View 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"

View 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;
}
}
}
}