matching_engine/formatters/
json_formatter.rs

1use serde_json::{from_str, to_string, Value};
2
3use crate::formatters::formatter::Formatter;
4use crate::model::domain::{Fill, OrderSingle};
5
6// Import Serde and Serde JSON macros
7
8///Provides implementation to convert OrderSingle and Fill to and from json format
9pub struct JsonFormatter {}
10
11impl JsonFormatter {
12    pub fn is_valid_json(val: &str) -> bool {
13        match from_str::<Value>(val) {
14            Ok(_) => true,
15            Err(_) => false,
16        }
17    }
18}
19
20impl Formatter<Fill> for JsonFormatter {
21    fn format_to(fill: Fill) -> String {
22        to_string(&fill).expect("Error serializing fill")
23    }
24
25    fn format_from(data: String) -> Fill {
26        from_str(&data).unwrap()
27    }
28}
29
30impl Formatter<OrderSingle> for JsonFormatter {
31    fn format_to(order: OrderSingle) -> String {
32        to_string(&order).expect("Error serializing order")
33    }
34    fn format_from(data: String) -> OrderSingle {
35        from_str(&data).unwrap()
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use serde_json::to_string;
42
43    use crate::formatters::formatter::Formatter;
44    use crate::formatters::json_formatter::JsonFormatter;
45    use crate::model::domain::Fill;
46    use crate::utils::create_order_from_string;
47
48    #[test]
49    fn test_serialize_fill_and_order() {
50        let order = create_order_from_string("id1 IBM 20 601.5 Buy".to_string());
51        let string_val = to_string(&order).unwrap();
52        println!("{string_val}");
53        assert!(JsonFormatter::is_valid_json(&string_val));
54        let fill = Fill::from(&order);
55        let string_val = JsonFormatter::format_to(fill);
56        println!("{string_val}");
57        assert!(JsonFormatter::is_valid_json(&string_val))
58    }
59}