use serde::Deserialize; use vtse_common::stock::StockName; #[derive(Deserialize, Debug, PartialEq)] #[serde(untagged)] pub(crate) enum ServerOperation { Query(QueryOperation), Meta(MetaOperation), } #[derive(Deserialize, Debug, PartialEq)] #[serde(tag = "type", rename_all = "snake_case")] pub(crate) enum QueryOperation { StockInfo { stock: StockName }, } #[derive(Deserialize, Debug, PartialEq)] #[serde(tag = "type", rename_all = "snake_case")] pub(crate) enum MetaOperation { Register { username: String, password: String }, } #[cfg(test)] mod deserialize { use super::*; use serde_json::json; use std::str::FromStr; #[test] fn server_op_is_transparent() { assert_eq!( serde_json::from_value::(json!({ "type": "stock_info", "stock": "Gura", })) .unwrap(), ServerOperation::Query(QueryOperation::StockInfo { stock: StockName::from_str("Gura").unwrap() }) ) } #[test] fn query_op() { assert_eq!( serde_json::from_value::(json!({ "type": "stock_info", "stock": "Gura", })) .unwrap(), QueryOperation::StockInfo { stock: StockName::from_str("Gura").unwrap() } ) } }