Skip to content

Commit fb353f4

Browse files
committed
Add support for Lambda function arguments in the function dispatcher
1 parent 4d831b1 commit fb353f4

File tree

4 files changed

+10
-2
lines changed

4 files changed

+10
-2
lines changed

dsc/src/subcommand.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,7 @@ fn list_functions(functions: &FunctionDispatcher, function_name: Option<&String>
672672
let returned_types= [
673673
(FunctionArgKind::Array, "a"),
674674
(FunctionArgKind::Boolean, "b"),
675+
(FunctionArgKind::Lambda, "l"),
675676
(FunctionArgKind::Number, "n"),
676677
(FunctionArgKind::String, "s"),
677678
(FunctionArgKind::Object, "o"),

lib/dsc-lib/locales/en-us.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ argCountRequired = "Function '%{name}' requires between %{min_args} and %{max_ar
247247
noArrayArgs = "Function '%{name}' does not accept array arguments, accepted types are: %{accepted_args_string}"
248248
noBooleanArgs = "Function '%{name}' does not accept boolean arguments, accepted types are: %{accepted_args_string}"
249249
noNumberArgs = "Function '%{name}' does not accept number arguments, accepted types are: %{accepted_args_string}"
250+
noLambdaArgs = "Function '%{name}' does not accept lambda arguments, accepted types are: %{accepted_args_string}"
250251
noNullArgs = "Function '%{name}' does not accept null arguments, accepted types are: %{accepted_args_string}"
251252
noObjectArgs = "Function '%{name}' does not accept object arguments, accepted types are: %{accepted_args_string}"
252253
noStringArgs = "Function '%{name}' does not accept string arguments, accepted types are: %{accepted_args_string}"

lib/dsc-lib/src/functions/map.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ impl Function for Map {
2121
max_args: 2,
2222
accepted_arg_ordered_types: vec![
2323
vec![FunctionArgKind::Array],
24-
vec![FunctionArgKind::String], // Lambda ID as string
24+
vec![FunctionArgKind::Lambda],
2525
],
2626
remaining_arg_accepted_types: None,
2727
return_types: vec![FunctionArgKind::Array],

lib/dsc-lib/src/functions/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ pub mod try_which;
9696
pub enum FunctionArgKind {
9797
Array,
9898
Boolean,
99+
Lambda,
99100
Null,
100101
Number,
101102
Object,
@@ -107,6 +108,7 @@ impl Display for FunctionArgKind {
107108
match self {
108109
FunctionArgKind::Array => write!(f, "Array"),
109110
FunctionArgKind::Boolean => write!(f, "Boolean"),
111+
FunctionArgKind::Lambda => write!(f, "Lambda"),
110112
FunctionArgKind::Null => write!(f, "Null"),
111113
FunctionArgKind::Number => write!(f, "Number"),
112114
FunctionArgKind::Object => write!(f, "Object"),
@@ -353,17 +355,21 @@ impl FunctionDispatcher {
353355
}
354356

355357
fn check_arg_against_expected_types(name: &str, arg: &Value, expected_types: &[FunctionArgKind]) -> Result<(), DscError> {
358+
let is_lambda = arg.as_str().is_some_and(|s| s.starts_with("__lambda_"));
359+
356360
if arg.is_array() && !expected_types.contains(&FunctionArgKind::Array) {
357361
return Err(DscError::Parser(t!("functions.noArrayArgs", name = name, accepted_args_string = expected_types.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(", ")).to_string()));
358362
} else if arg.is_boolean() && !expected_types.contains(&FunctionArgKind::Boolean) {
359363
return Err(DscError::Parser(t!("functions.noBooleanArgs", name = name, accepted_args_string = expected_types.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(", ")).to_string()));
364+
} else if is_lambda && !expected_types.contains(&FunctionArgKind::Lambda) {
365+
return Err(DscError::Parser(t!("functions.noLambdaArgs", name = name, accepted_args_string = expected_types.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(", ")).to_string()));
360366
} else if arg.is_null() && !expected_types.contains(&FunctionArgKind::Null) {
361367
return Err(DscError::Parser(t!("functions.noNullArgs", name = name, accepted_args_string = expected_types.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(", ")).to_string()));
362368
} else if arg.is_number() && !expected_types.contains(&FunctionArgKind::Number) {
363369
return Err(DscError::Parser(t!("functions.noNumberArgs", name = name, accepted_args_string = expected_types.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(", ")).to_string()));
364370
} else if arg.is_object() && !expected_types.contains(&FunctionArgKind::Object) {
365371
return Err(DscError::Parser(t!("functions.noObjectArgs", name = name, accepted_args_string = expected_types.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(", ")).to_string()));
366-
} else if arg.is_string() && !expected_types.contains(&FunctionArgKind::String) {
372+
} else if arg.is_string() && !is_lambda && !expected_types.contains(&FunctionArgKind::String) {
367373
return Err(DscError::Parser(t!("functions.noStringArgs", name = name, accepted_args_string = expected_types.iter().map(std::string::ToString::to_string).collect::<Vec<_>>().join(", ")).to_string()));
368374
}
369375
Ok(())

0 commit comments

Comments
 (0)