aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/dabmux.rs57
1 files 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::<Vec<String>>()
- .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"))