From 2c1ae5b8a8f5018e8f0ce14c314d598a3e0bf427 Mon Sep 17 00:00:00 2001 From: Afsal Thaj Date: Mon, 30 Sep 2024 20:45:24 +1000 Subject: [PATCH] Let binding for a result function --- golem-rib/src/interpreter/rib_interpreter.rs | 21 ++- .../src/worker_service_rib_interpreter/mod.rs | 135 ------------------ 2 files changed, 15 insertions(+), 141 deletions(-) diff --git a/golem-rib/src/interpreter/rib_interpreter.rs b/golem-rib/src/interpreter/rib_interpreter.rs index 6531e1ce9..1a93b177c 100644 --- a/golem-rib/src/interpreter/rib_interpreter.rs +++ b/golem-rib/src/interpreter/rib_interpreter.rs @@ -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![ ( @@ -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(); @@ -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), ]); diff --git a/golem-worker-service-base/src/worker_service_rib_interpreter/mod.rs b/golem-worker-service-base/src/worker_service_rib_interpreter/mod.rs index 100c8fc9e..85229b1dc 100644 --- a/golem-worker-service-base/src/worker_service_rib_interpreter/mod.rs +++ b/golem-worker-service-base/src/worker_service_rib_interpreter/mod.rs @@ -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();