I am trying to de/serialize request and response on server/client side. Below is my what I have tried :-
use std::collections::HashMap;
use std::fmt;
use std::io::prelude::*;
use std::net::TcpStream;
use serde_derive::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct Address {
street: String,
city: String,
country: String,
}
#[derive(Serialize, Deserialize)]
enum Gender {
Male,
Female,
}
// #[derive(Debug)] does this internally.
impl fmt::Debug for Gender {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Gender::Male => write!(f, "M"),
Gender::Female => write!(f, "F"),
_ => write!(f, "U"),
}
}
}
#[derive(Serialize, Deserialize, PartialEq, Eq, Hash)]
enum Level {
SSC,
HSC,
Graduation,
}
impl fmt::Debug for Level {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Level::SSC => write!(f, "SSC"),
Level::HSC => write!(f, "HSC"),
Level::Graduation => write!(f, "Graduation"),
_ => write!(f, "Unknown"),
}
}
}
#[derive(Serialize, Deserialize, Debug)]
struct Person {
ssn: String,
age: u16,
name: String,
gender: Gender,
contacts: Vec<String>,
address: Address,
education: HashMap<Level, i32>,
}
#[derive(Serialize, Deserialize, Debug)]
enum Message {
Request { ssn: String },
Response(Person),
Invalid,
}
fn handle_client(mut stream: TcpStream) {
// read data into buffer.
let mut buffer = Vec::new();
match stream.read_to_end(&mut buffer) {
Ok(n) => {
if n == 0 {
println!("connection closed!!!");
return;
}
let req = match serde_json::from_slice::<Message::Request>(&buffer) {
Ok(req) => {
println!("Received a valid request: {:?}", req);
req
}
Err(err) => {
let message = String::from_utf8_lossy(&buffer).to_string();
println!("Received an invalid message : {} ({})", message, err);
Message::Invalid
}
};
}
Err(err) => println!("error"),
}
}
This is where I am stuck (being a beginner in rust). Can anyone please help me with finding standard way for de/serializing request/response.