From 536300d03c8d733664fa3922e29a2cfe2493ff1e Mon Sep 17 00:00:00 2001 From: Jesse Hallett Date: Fri, 22 Nov 2024 15:42:36 -0800 Subject: [PATCH] parses and ignores type annotations in native operaton parameters when executing --- .../src/procedure/interpolated_command.rs | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/crates/mongodb-agent-common/src/procedure/interpolated_command.rs b/crates/mongodb-agent-common/src/procedure/interpolated_command.rs index 0761156a..ac6775a3 100644 --- a/crates/mongodb-agent-common/src/procedure/interpolated_command.rs +++ b/crates/mongodb-agent-common/src/procedure/interpolated_command.rs @@ -123,14 +123,18 @@ enum NativeMutationPart { } /// Parse a string or key in a native procedure into parts where variables have the syntax -/// `{{}}`. +/// `{{}}` or `{{ | type expression }}`. fn parse_native_mutation(string: &str) -> Vec { let vec: Vec> = string .split("{{") .filter(|part| !part.is_empty()) .map(|part| match part.split_once("}}") { None => vec![NativeMutationPart::Text(part.to_string())], - Some((var, text)) => { + Some((placeholder_content, text)) => { + let var = match placeholder_content.split_once("|") { + Some((var_name, _type_annotation)) => var_name, + None => placeholder_content, + }; if text.is_empty() { vec![NativeMutationPart::Parameter(var.trim().into())] } else { @@ -324,4 +328,45 @@ mod tests { ); Ok(()) } + + #[test] + fn strips_type_annotation_from_placeholder_text() -> anyhow::Result<()> { + let native_mutation = NativeMutation { + result_type: Type::Object(ObjectType { + name: Some("InsertArtist".into()), + fields: [("ok".into(), Type::Scalar(MongoScalarType::Bson(S::Bool)))].into(), + }), + command: doc! { + "insert": "Artist", + "documents": [{ + "Name": "{{name | string! }}", + }], + }, + selection_criteria: Default::default(), + description: Default::default(), + }; + + let input_arguments = [( + "name".into(), + MutationProcedureArgument::Literal { + value: json!("Regina Spektor"), + argument_type: Type::Scalar(MongoScalarType::Bson(S::String)), + }, + )] + .into(); + + let arguments = arguments_to_mongodb_expressions(input_arguments)?; + let command = interpolated_command(&native_mutation.command, &arguments)?; + + assert_eq!( + command, + bson::doc! { + "insert": "Artist", + "documents": [{ + "Name": "Regina Spektor", + }], + } + ); + Ok(()) + } }