Skip to content

Commit

Permalink
Let binding for a result function
Browse files Browse the repository at this point in the history
  • Loading branch information
afsalthaj committed Sep 30, 2024
1 parent 11ec2d9 commit 2c1ae5b
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 141 deletions.
21 changes: 15 additions & 6 deletions golem-rib/src/interpreter/rib_interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1897,16 +1897,18 @@ mod interpreter_tests {
let failure: u64 = 401;
let d = if authorisation == "admin" then success else failure;
function-no-arg-unit();
let unit_result = function-unit(input);
{ a : a, b : b, c: c, d: d}
"#;

let expr = Expr::from_text(expr).unwrap();

let foo_result_type = AnalysedType::Option(TypeOption {
let non_unit_result_type = AnalysedType::Option(TypeOption {
inner: Box::new(AnalysedType::Str(TypeStr)),
});

let foo_result_value = internal::get_type_annotated_value(&foo_result_type, "none");
let non_unit_result_value = internal::get_type_annotated_value(&non_unit_result_type, "none");

let input_type = internal::analysed_type_record(vec![
(
Expand Down Expand Up @@ -1964,14 +1966,21 @@ mod interpreter_tests {
let mut component_metadata = internal::get_component_metadata(
"function-option",
vec![input_type.clone()],
Some(foo_result_type.clone()),
Some(non_unit_result_type.clone()),
);

// bar is a no-arg unit function
let bar_component_metadata =
let function_no_arg_unit_metadata =
internal::get_component_metadata("function-no-arg-unit", vec![], None);

component_metadata.extend(bar_component_metadata);
let function_unit_metadata = internal::get_component_metadata(
"function-unit",
vec![input_type.clone()],
None
);

component_metadata.extend(function_no_arg_unit_metadata);
component_metadata.extend(function_unit_metadata);

let compiled = compiler::compile(&expr, &component_metadata).unwrap();

Expand All @@ -1980,7 +1989,7 @@ mod interpreter_tests {
let functions_and_result = HashMap::from_iter(vec![
(
internal::FunctionName("function-option".to_string()),
Some(foo_result_value),
Some(non_unit_result_value),
),
(internal::FunctionName("function-no-arg-unit".to_string()), None),
]);
Expand Down
135 changes: 0 additions & 135 deletions golem-worker-service-base/src/worker_service_rib_interpreter/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -710,141 +710,6 @@ mod tests {
assert!(response.into_body().is_empty());
}

#[tokio::test]
async fn test_evaluation_with_request_body_with_select_fields() {
let noop_executor = DefaultEvaluator::noop();

let request_details = get_request_details(
r#"
{
"id": "bId",
"name": "bName",
"titles": [
"bTitle1", "bTitle2"
],
"address": {
"street": "bStreet",
"city": "bCity"
}
}"#,
&HeaderMap::new(),
);

// The spec that will become part of the component metadata
let request_body_type = get_analysed_type_record(vec![
("id".to_string(), AnalysedType::Str(TypeStr)),
("name".to_string(), AnalysedType::Str(TypeStr)),
(
"titles".to_string(),
AnalysedType::List(TypeList {
inner: Box::new(AnalysedType::Str(TypeStr)),
}),
),
(
"address".to_string(),
get_analysed_type_record(vec![
("street".to_string(), AnalysedType::Str(TypeStr)),
("city".to_string(), AnalysedType::Str(TypeStr)),
]),
),
]);

let request_type =
get_analysed_type_record(vec![("body".to_string(), request_body_type.clone())]);

// Output from worker - doesn't matter
let worker_response = create_none(Some(&AnalysedType::Str(TypeStr)));

// Output from worker
let return_type = AnalysedType::Option(TypeOption {
inner: Box::new(AnalysedType::try_from(&worker_response).unwrap()),
});

let component_metadata =
get_analysed_exports("foo", vec![request_type.clone()], return_type);

let expr_str = r#"${
let input = { body: { id: "bId", name: "bName", titles: request.body.titles, address: request.body.address } };
let result = foo(input);
match result { some(value) => "personal-id", none => request.body.address.street }
}"#;

let expr1 = rib::from_string(expr_str).unwrap();
let value1 = noop_executor
.evaluate_with_worker_response(
&expr1,
Some(worker_response.clone()),
component_metadata.clone(),
Some((request_details, request_type)),
)
.await
.unwrap();

let expected = TypeAnnotatedValue::Str("bStreet".to_string());

assert_eq!(&value1, &expected);
}

#[tokio::test]
async fn test_evaluation_with_zero_worker_response() {
let noop_executor = DefaultEvaluator::noop();

let resolved_variables = get_request_details(
r#"
{
"path": {
"id": "pId"
}
}"#,
&HeaderMap::new(),
);

let expr = rib::from_string("${let s: str = worker.response.address.street; s}").unwrap();
let result = noop_executor
.evaluate_pure_expr_with_request_details(&expr, &resolved_variables)
.await;
assert!(result.is_err());
}

#[tokio::test]
async fn test_evaluation_with_pattern_match_some() {
let noop_executor = DefaultEvaluator::noop();

// Output from worker
let record = create_record(vec![(
"id".to_string(),
TypeAnnotatedValue::Str("pId".to_string()),
)])
.unwrap();
let worker_response = create_option(record).unwrap();

// Output from worker
let return_type = AnalysedType::try_from(&worker_response).unwrap();

let component_metadata =
get_analysed_exports("foo", vec![AnalysedType::U64(TypeU64)], return_type);

let expr_str = r#"${let result = foo(1); match result { some(value) => "personal-id", none => "not found" }}"#;

let expr1 = rib::from_string(expr_str).unwrap();
let value1 = noop_executor
.evaluate_with_worker_response(
&expr1,
Some(worker_response.clone()),
component_metadata.clone(),
None,
)
.await
.unwrap();

let expected = TypeAnnotatedValue::Str("personal-id".to_string());

assert_eq!(&value1, &expected);
}

#[tokio::test]
async fn test_evaluation_with_pattern_match_none() {
let noop_executor = DefaultEvaluator::noop();
Expand Down

0 comments on commit 2c1ae5b

Please sign in to comment.