From 5cdbc6faf2ce53173bf190620da0bfe1e0ae6409 Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Fri, 20 Sep 2024 14:41:14 +0200 Subject: Improve RC --- src/dabmux.rs | 57 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/src/dabmux.rs b/src/dabmux.rs index fcdd864..dbf6ea9 100644 --- a/src/dabmux.rs +++ b/src/dabmux.rs @@ -32,24 +32,36 @@ impl DabMux { for (module_name, params_value) in root { let params = params_value.as_object().ok_or(anyhow!("RC module {} is not a JSON object", module_name))?; - for (param_name, value_json) in params { - - let value = match value_json { - Value::Null => "null".to_owned(), - Value::Bool(b) => b.to_string(), - Value::Number(n) => n.to_string(), - Value::String(s) => s.clone(), - Value::Array(_) => return Err(anyhow!(format!("Unexpected array in {}.{}", module_name, param_name))), - Value::Object(_) => return Err(anyhow!(format!("Unexpected object in {}.{}", module_name, param_name))), - }; - + // ODR-DabMux doesn't allow setting only label through the RC, so we have to merge them together + if let (Some(Value::String(l)), Some(Value::String(sl))) = (params.get("label").clone(), params.get("shortlabel").clone()) { + let value = format!("{},{}", l, sl); all_params.push( Param { module: module_name.to_owned(), - param: param_name.to_owned(), + param: "label".to_owned(), value }); } + + for (param_name, value_json) in params { + if !(param_name == "label" || param_name == "shortlabel") { + let value = match value_json { + Value::Null => "null".to_owned(), + Value::Bool(b) => if *b { "1".to_owned() } else { "0".to_owned() }, + Value::Number(n) => n.to_string(), + Value::String(s) => s.clone(), + Value::Array(_) => return Err(anyhow!(format!("Unexpected array in {}.{}", module_name, param_name))), + Value::Object(_) => return Err(anyhow!(format!("Unexpected object in {}.{}", module_name, param_name))), + }; + + all_params.push( + Param { + module: module_name.to_owned(), + param: param_name.to_owned(), + value + }); + } + } } Ok(all_params) @@ -91,19 +103,28 @@ impl DabMux { if items[0].is_readable() { let mut parts = sock.recv_multipart(0)?; - let j : String = parts.drain(..) + let j : serde_json::Value = parts.drain(..) .map(|p| match String::from_utf8(p) { Ok(s) => s, Err(_) => "???".to_owned(), }) - .collect::>() - .join(","); + .collect(); - eprintln!("SET_RC: {}", j); + let j_arr = j.as_array().unwrap(); - let v: Value = serde_json::Value::String(j); - Ok(v) + //eprintln!("SET_RC: {}", j); + if j_arr[0].as_str() == Some("ok") { + Ok(j) + } + else { + if j_arr.len() > 0 && j_arr[1].is_string() { + Err(anyhow!(format!("Failed to set RC: {}", j_arr[1].as_str().unwrap()))) + } + else { + Err(anyhow!("Failed to set RC: unknown error")) + } + } } else { Err(anyhow!("Timeout reading RC")) -- cgit v1.2.3