1st commit

This commit is contained in:
2026-05-15 08:58:30 +07:00
commit 0e24b7d044
28 changed files with 15184 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
use msghandler::{smartreceive, SmartreceiveOptions};
#[tokio::main]
async fn main() {
// Simulated NATS message JSON (received from NATS subscription)
let msg_json_str = r#"{
"correlation_id": "abc123-def456-ghi789",
"msg_id": "msg-uuid-001",
"timestamp": "2026-05-13T12:00:00.000Z",
"send_to": "/agent/wine/api/v1/prompt",
"msg_purpose": "chat",
"sender_name": "js-webapp",
"sender_id": "sender-uuid-001",
"receiver_name": "rust-backend",
"receiver_id": "",
"reply_to": "/agent/wine/api/v1/response",
"reply_to_msg_id": "",
"broker_url": "nats://localhost:4222",
"metadata": {},
"payloads": [
{
"id": "payload-uuid-001",
"dataname": "message",
"payload_type": "text",
"transport": "direct",
"encoding": "base64",
"size": 29,
"data": "SGVsbG8gZnJvbSBKYXZhU2NyaXB0ISE=",
"metadata": {"payload_bytes": 29}
},
{
"id": "payload-uuid-002",
"dataname": "user_data",
"payload_type": "dictionary",
"transport": "direct",
"encoding": "json",
"size": 58,
"data": "eyJ0eXBlIjoiY2hhdCIsInNlbmRlciI6InNlcnZpY2VBIiwicmVjZWl2ZXIiOiJzZXJ2aWNlQiJ9",
"metadata": {"payload_bytes": 58}
}
]
}"#;
let options = SmartreceiveOptions::default();
match smartreceive(msg_json_str, &options).await {
Ok(envelope) => {
println!("=== Envelope Received ===");
println!("Correlation ID: {}", envelope.correlation_id);
println!("Message ID: {}", envelope.msg_id);
println!("Subject: {}", envelope.send_to);
println!("Purpose: {}", envelope.msg_purpose);
println!("Sender: {}", envelope.sender_name);
println!("Receiver: {}", envelope.receiver_name);
println!("Payloads: {}", envelope.payloads.len());
println!();
for payload in &envelope.payloads {
println!("--- Payload: {} ---", payload.dataname);
println!(" Type: {}", payload.payload_type);
println!(" Transport: {}", payload.transport);
println!(" Encoding: {}", payload.encoding);
println!(" Size: {} bytes", payload.size);
// In a real scenario, you would deserialize payload.data here
// based on payload_type to get the actual data
match payload.payload_type.as_str() {
"text" => {
// For demonstration, decode the base64
use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64};
if payload.transport == "direct" {
let decoded = BASE64.decode(&payload.data).unwrap();
println!(" Data: {}", String::from_utf8_lossy(&decoded));
} else {
println!(" URL: {}", payload.data);
}
}
"dictionary" => {
use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64};
if payload.transport == "direct" {
let decoded = BASE64.decode(&payload.data).unwrap();
let json: serde_json::Value = serde_json::from_slice(&decoded).unwrap();
println!(" Data: {}", serde_json::to_string_pretty(&json).unwrap());
}
}
other => {
println!(" Data type: {}", other);
}
}
}
}
Err(e) => {
eprintln!("Error: {}", e);
}
}
}

View File

@@ -0,0 +1,70 @@
use msghandler::{smartsend, Payload, SmartsendOptions};
#[tokio::main]
async fn main() {
// Create mixed payload data
let payloads = vec![
(
"message".to_string(),
Payload::Text("Hello from Rust!".to_string()),
"text".to_string(),
),
(
"user_data".to_string(),
Payload::Dictionary(serde_json::json!({
"name": "Alice",
"role": "admin",
"scores": [95, 88, 92]
})),
"dictionary".to_string(),
),
(
"avatar".to_string(),
Payload::Binary(vec![0x89, 0x50, 0x4E, 0x47]), // PNG header
"image".to_string(),
),
];
let options = SmartsendOptions {
broker_url: "nats://localhost:4222".to_string(),
fileserver_url: "http://localhost:8080".to_string(),
msg_purpose: "chat".to_string(),
sender_name: "rust-example".to_string(),
..Default::default()
};
match smartsend("/agent/wine/api/v1/prompt", &payloads, &options).await {
Ok((envelope, json_str)) => {
println!("=== Envelope Created ===");
println!("Correlation ID: {}", envelope.correlation_id);
println!("Message ID: {}", envelope.msg_id);
println!("Timestamp: {}", envelope.timestamp);
println!("Subject: {}", envelope.send_to);
println!("Purpose: {}", envelope.msg_purpose);
println!("Sender: {}", envelope.sender_name);
println!("Payloads: {}", envelope.payloads.len());
println!();
for payload in &envelope.payloads {
println!("Payload: {} (type: {}, transport: {}, encoding: {})",
payload.dataname,
payload.payload_type,
payload.transport,
payload.encoding);
println!(" Size: {} bytes", payload.size);
println!(" Data: {}", if payload.transport == "direct" {
&payload.data[..payload.data.len().min(40)]
} else {
&payload.data[..payload.data.len().min(60)]
});
}
println!();
println!("=== JSON String for NATS Publishing ===");
println!("{}", json_str);
}
Err(e) => {
eprintln!("Error: {}", e);
}
}
}