Skip to content

Commit 985e935

Browse files
committed
Add feature gate to allow trailing args.
1 parent 139fa28 commit 985e935

File tree

6 files changed

+26
-13
lines changed

6 files changed

+26
-13
lines changed

rust/nasl-builtin-std/src/array.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ fn make_array(positionals: CheckedPositionals<NaslValue>) -> HashMap<String, Nas
2727
values.insert(positionals[idx - 1].to_string(), val.clone());
2828
}
2929
}
30-
values.into()
30+
values
3131
}
3232

3333
fn create_list(positionals: CheckedPositionals<NaslValue>) -> Vec<NaslValue> {

rust/nasl-builtin-string/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ fn write_nasl_string(s: &mut String, value: &NaslValue) -> Result<(), FunctionEr
127127
fn string(positional: CheckedPositionals<&NaslValue>) -> Result<NaslValue, FunctionErrorKind> {
128128
let mut s = String::with_capacity(2 * positional.len());
129129
for p in positional {
130-
write_nasl_string_value(&mut s, &p)?;
130+
write_nasl_string_value(&mut s, p)?;
131131
}
132132
Ok(s.into())
133133
}

rust/nasl-builtin-utils/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@ nasl-syntax = { path = "../nasl-syntax" }
1010
storage = { path = "../storage" }
1111
thiserror = "1.0.62"
1212
tracing = "0.1"
13+
14+
[features]
15+
default = ["enforce-no-trailing-arguments"]
16+
enforce-no-trailing-arguments = []

rust/nasl-builtin-utils/src/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ impl Register {
183183
}
184184

185185
/// Return an iterator over the names of the named arguments.
186-
pub fn iter_named_args<'a>(&'a self) -> Option<impl Iterator<Item = &str>> {
186+
pub fn iter_named_args(&self) -> Option<impl Iterator<Item = &str>> {
187187
self.blocks
188188
.last()
189189
.map(|x| x.defined.keys().map(|x| x.as_str()))

rust/nasl-builtin-utils/src/function/utils.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,21 +112,23 @@ pub fn get_maybe_named_arg<'a, T: FromNaslValue<'a>>(
112112
/// as a named argument.
113113
fn check_named_args(
114114
register: &Register,
115+
_nasl_fn_name: &str,
115116
named: &[&str],
116117
maybe_named: &[&str],
117118
) -> Result<usize, FunctionErrorKind> {
118119
let mut num_maybe_named = 0;
119120
for arg_name in register.iter_named_args().unwrap() {
120-
if arg_name == FC_ANON_ARGS {
121+
if arg_name == FC_ANON_ARGS || named.contains(&arg_name) {
121122
continue;
123+
} else if maybe_named.contains(&arg_name) {
124+
num_maybe_named += 1;
122125
} else {
123-
if named.contains(&arg_name) {
124-
continue;
125-
} else if maybe_named.contains(&arg_name) {
126-
num_maybe_named += 1;
127-
} else {
128-
return Err(FunctionErrorKind::UnexpectedArgument(arg_name.into()));
129-
}
126+
#[cfg(feature = "enforce-no-trailing-arguments")]
127+
return Err(FunctionErrorKind::UnexpectedArgument(arg_name.into()));
128+
#[cfg(not(feature = "enforce-no-trailing-arguments"))]
129+
tracing::debug!(
130+
"Unexpected named argument '{arg_name}' in NASL function {_nasl_fn_name}."
131+
);
130132
}
131133
}
132134
Ok(num_maybe_named)
@@ -137,19 +139,25 @@ fn check_named_args(
137139
/// named arguments exist.
138140
pub fn check_args(
139141
register: &Register,
142+
_nasl_fn_name: &str,
140143
named: &[&str],
141144
maybe_named: &[&str],
142145
max_num_expected_positional: Option<usize>,
143146
) -> Result<(), FunctionErrorKind> {
144-
let num_maybe_named_given = check_named_args(register, named, maybe_named)?;
147+
let num_maybe_named_given = check_named_args(register, _nasl_fn_name, named, maybe_named)?;
145148
let num_positional_given = register.positional().len();
146149
if let Some(max_num_expected_positional) = max_num_expected_positional {
147150
let num_positional_expected = max_num_expected_positional - num_maybe_named_given;
148151
if num_positional_given > num_positional_expected {
152+
#[cfg(feature = "enforce-no-trailing-arguments")]
149153
return Err(FunctionErrorKind::TrailingPositionalArguments {
150154
expected: num_positional_expected,
151155
got: num_positional_given,
152156
});
157+
#[cfg(not(feature = "enforce-no-trailing-arguments"))]
158+
tracing::debug!(
159+
"Trailing positional arguments in NASL function {_nasl_fn_name}. Expected {num_positional_expected}, found {num_positional_given}"
160+
);
153161
}
154162
}
155163
Ok(())

rust/nasl-function-proc-macro/src/codegen.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,9 @@ impl<'a> ArgsStruct<'a> {
121121
let num = self.max_num_allowed_positional();
122122
quote! { Some(#num) }
123123
};
124+
let fn_name = self.function.sig.ident.to_string();
124125
quote! {
125-
::nasl_builtin_utils::function::utils::check_args(_register, #named_array, #maybe_named_array, #num_allowed_positional_args)?;
126+
::nasl_builtin_utils::function::utils::check_args(_register, #fn_name, #named_array, #maybe_named_array, #num_allowed_positional_args)?;
126127
}
127128
}
128129

0 commit comments

Comments
 (0)