Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Implement UserDataMigrator Framework - Rule based Shim Layer #655

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
35 changes: 17 additions & 18 deletions core/main/src/broker/endpoint_broker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -688,7 +688,7 @@ impl BrokerOutputForwarder {
if let Some(filter) = broker_request.rule.transform.get_transform_data(
super::rules_engine::RuleTransformType::Response,
) {
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);
} else if response.result.is_none() && response.error.is_none() {
response.result = Some(Value::Null);
}
Expand Down Expand Up @@ -792,17 +792,17 @@ async fn forward_extn_event(
}
}

fn apply_response(
pub fn apply_response(
result_response_filter: String,
rpc_request: &RpcRequest,
method: &str,
response: &mut JsonRpcApiResponse,
) {
match serde_json::to_value(response.clone()) {
Ok(input) => {
match jq_compile(
input,
&result_response_filter,
format!("{}_response", rpc_request.ctx.method),
format!("{}_response", method),
) {
Ok(jq_out) => {
trace!(
Expand Down Expand Up @@ -862,7 +862,6 @@ fn apply_filter(broker_request: &BrokerRequest, result: &Value, rpc_request: &Rp
&filter,
format!("{}_event filter", rpc_request.ctx.method),
) {
println!("apply_filter: {:?}", r);
if r.is_null() {
return false;
} else {
Expand Down Expand Up @@ -1005,7 +1004,7 @@ mod tests {
let filter = "if .result and .result.success then (.result.stbVersion | split(\"_\") [0]) elif .error then if .error.code == -32601 then {error: { code: -1, message: \"Unknown method.\" }} else \"Error occurred with a different code\" end else \"No result or recognizable error\" end".to_string();
//let mut response = JsonRpcApiResponse::mock();
//response.error = Some(error);
apply_response(filter, &rpc_request, &mut output.data);
apply_response(filter, &rpc_request.ctx.method, &mut output.data);
//let msg = output.data.error.unwrap().get("message").unwrap().clone();
assert_eq!(
output.data.error.unwrap().get("message").unwrap().clone(),
Expand All @@ -1020,7 +1019,7 @@ mod tests {
let filter = "if .result and .result.success then .result.value elif .error.code==22 or .error.code==43 then null else .error end".to_string();
//let mut response = JsonRpcApiResponse::mock();
//response.error = Some(error);
apply_response(filter, &rpc_request, &mut output.data);
apply_response(filter, &rpc_request.ctx.method, &mut output.data);
assert_eq!(output.data.error, None);
assert_eq!(output.data.result.unwrap(), serde_json::Value::Null);

Expand All @@ -1032,7 +1031,7 @@ mod tests {
let filter = "if .result and .result.success then .result.value elif .error.code==22 or .error.code==43 then null else { error: .error } end".to_string();
//let mut response = JsonRpcApiResponse::mock();
//response.error = Some(error.clone());
apply_response(filter, &rpc_request, &mut output.data);
apply_response(filter, &rpc_request.ctx.method, &mut output.data);
assert_eq!(output.data.error, Some(error));
}

Expand All @@ -1059,7 +1058,7 @@ mod tests {
let mut data = JsonRpcApiResponse::mock();
data.result = Some(result);
let mut output: BrokerOutput = BrokerOutput { data: data.clone() };
apply_response(filter, &rpc_request, &mut output.data);
apply_response(filter, &rpc_request.ctx.method, &mut output.data);
assert_eq!(output.data.result.unwrap(), "SCXI11BEI".to_string());

// device.videoResolution
Expand All @@ -1069,7 +1068,7 @@ mod tests {
response.result = Some(result);
//let data = JsonRpcApiResponse::mock();
//let mut output: BrokerOutput = BrokerOutput { data: data.clone() };
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);
assert_eq!(response.result.unwrap(), json!([1920, 1080]));

// device.audio
Expand All @@ -1079,7 +1078,7 @@ mod tests {
let filter = "if .result and .result.success then .result | {\"stereo\": (.supportedAudioFormat | index(\"PCM\") > 0),\"dolbyDigital5.1\": (.supportedAudioFormat | index(\"DOLBY AC3\") > 0),\"dolbyDigital5.1plus\": (.supportedAudioFormat | index(\"DOLBY EAC3\") > 0),\"dolbyAtmos\": (.supportedAudioFormat | index(\"DOLBY EAC3 ATMOS\") > 0)} elif .error then if .error.code == -32601 then \"Unknown method.\" else \"Error occurred with a different code\" end else \"No result or recognizable error\" end".to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);
assert_eq!(
response.result.unwrap(),
json!({"dolbyAtmos": true, "dolbyDigital5.1": true, "dolbyDigital5.1plus": false, "stereo": true})
Expand All @@ -1094,7 +1093,7 @@ mod tests {
let filter = "if .result and .result.success then (.result.interfaces | .[] | select(.connected) | {\"state\": \"connected\",\"type\": .interface | ascii_downcase }) elif .error then if .error.code == -32601 then \"Unknown method.\" else \"Error occurred with a different code\" end else \"No result or recognizable error\" end".to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);
assert_eq!(
response.result.unwrap(),
json!({"state":"connected", "type":"wifi"})
Expand All @@ -1107,7 +1106,7 @@ mod tests {
let filter = "if .result.success then (if .result.friendlyName | length == 0 then \"Living Room\" else .result.friendlyName end) else \"Living Room\" end".to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);
assert_eq!(response.result.unwrap(), json!("my_device"));

// localization.language
Expand All @@ -1118,7 +1117,7 @@ mod tests {
.to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);

assert_eq!(response.result.unwrap(), json!("FR"));

Expand All @@ -1129,7 +1128,7 @@ mod tests {
let filter = "if .result.success then (if .result.friendlyName | length == 0 then \"Living Room\" else .result.friendlyName end) else \"Living Room\" end".to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);

assert_eq!(response.result.unwrap(), json!("my_device"));

Expand All @@ -1140,7 +1139,7 @@ mod tests {
let filter = "if .result.success then null else { code: -32100, message: \"couldn't set skip restriction\" } end".to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);

assert_eq!(response.result.unwrap(), serde_json::Value::Null);

Expand All @@ -1151,7 +1150,7 @@ mod tests {
let filter = "if .result.success then .result.value elif .error.code==22 or .error.code==43 then \"null\" else .error end".to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);
assert_eq!(response.result.unwrap(), "some_value");

// localization.countryCode
Expand All @@ -1161,7 +1160,7 @@ mod tests {
let filter = "if .result.success then if .result.territory == \"ITA\" then \"IT\" elif .result.territory == \"GBR\" then \"GB\" elif .result.territory == \"IRL\" then \"IE\" elif .result.territory == \"DEU\" then \"DE\" elif .result.territory == \"AUS\" then \"AU\" else \"GB\" end end".to_string();
let mut response = JsonRpcApiResponse::mock();
response.result = Some(result);
apply_response(filter, &rpc_request, &mut response);
apply_response(filter, &rpc_request.ctx.method, &mut response);
assert_eq!(response.result.unwrap(), "GB");
}
}
18 changes: 15 additions & 3 deletions core/main/src/broker/rules_engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use ripple_sdk::{
serde_json::Value,
utils::error::RippleError,
};
use serde::Deserialize;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::{fs, path::Path};

Expand Down Expand Up @@ -83,21 +83,27 @@ pub enum RuleEndpointProtocol {
Thunder,
}

#[derive(Debug, Clone, Deserialize)]
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Rule {
pub alias: String,
// Not every rule needs transform
#[serde(default)]
pub transform: RuleTransform,
#[serde(skip_serializing_if = "Option::is_none")]
pub filter: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub endpoint: Option<String>,
}

#[derive(Debug, Clone, Deserialize, Default)]
#[derive(Debug, Clone, Deserialize, Default, Serialize)]
pub struct RuleTransform {
#[serde(skip_serializing_if = "Option::is_none")]
pub request: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub event: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub event_decorator_method: Option<String>,
}

Expand Down Expand Up @@ -202,6 +208,12 @@ impl RuleEngine {
}
None
}
pub fn get_rule_by_method(&self, method: &str) -> Option<Rule> {
if let Some(rule) = self.rules.rules.get(&method.to_lowercase()).cloned() {
return Some(rule);
}
None
}
}

pub fn jq_compile(input: Value, filter: &str, reference: String) -> Result<Value, RippleError> {
Expand Down
1 change: 1 addition & 0 deletions core/main/src/broker/thunder/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@
// SPDX-License-Identifier: Apache-2.0
//
pub mod thunder_plugins_status_mgr;
pub mod user_data_migrator;
Loading
Loading