use serde_json::Value;
use std::error::Error;
use regex::Regex;
use crate::model::{
SymbolSpread,
Symbol,
FromStr
};
pub fn vec_to_json(
data: Vec<String>
) -> Result<Value, Box<dyn Error>> {
let mut symbol_spreads: Vec<SymbolSpread> = Vec::new();
for entry in data.iter() {
let parts: Vec<&str> = entry.split_whitespace().collect();
if parts.len() != 4 {
continue;
}
let symbol = match Symbol::from_str(parts[0]) {
Ok(sym) => sym,
Err(_) => return Err("Failed to parse symbol".into()),
};
let ask = match parts[1].parse::<f64>() {
Ok(num) => num,
Err(_) => return Err("Failed to parse ask price".into()),
};
let bid = match parts[2].parse::<f64>() {
Ok(num) => num,
Err(_) => return Err("Failed to parse bid price".into()),
};
let spread = match parts[3].parse::<f64>() {
Ok(num) => num,
Err(_) => return Err("Failed to parse spread".into()),
};
let symbol_spread = SymbolSpread {
symbol,
ask,
bid,
spread,
};
symbol_spreads.push(symbol_spread);
}
let mut json_array: Vec<Value> = Vec::new();
for spread in symbol_spreads {
let obj: Value = serde_json::json!({
"symbol": spread.symbol.to_string(),
"ask": spread.ask,
"bid": spread.bid,
"spread": spread.spread,
});
json_array.push(obj);
}
let json_output: Value = serde_json::value::Value::Array(json_array);
Ok(json_output)
}
pub fn wrap_json_under_key(
json_object: Value,
key: String
) -> Result<Value, Box<dyn Error>> {
let wrapped_object: Value = serde_json::json!(
{ key: json_object }
);
Ok(wrapped_object)
}
pub fn extract_broker_name(
url: &str
) -> Result<String, &'static str> {
let re: Regex = regex::Regex::new(r"/([^/]+)/\d+$").unwrap();
if let Some(caps) = re.captures(url) {
if let Some(matched) = caps.get(1) {
return Ok(matched.as_str().to_string());
}
}
Err("Could not extract broker name from URL")
}