Skip to content

Commit 950e63a

Browse files
committed
Add argument length checks
1 parent 58c425d commit 950e63a

File tree

2 files changed

+50
-33
lines changed

2 files changed

+50
-33
lines changed

src/backends/mock_main.rs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,20 @@ impl Operation {
5858
.1
5959
.iter()
6060
.flat_map(|arg| match arg {
61-
OperationArg::None => vec![],
62-
OperationArg::Index(i) => {
63-
vec![statements[*i].clone().try_into()]
64-
}
61+
OperationArg::None => None,
62+
OperationArg::Index(i) => Some(statements[*i].clone().try_into()),
6563
})
6664
.collect::<Result<Vec<crate::middleware::Statement>>>()?;
6765
middleware::Operation::op(self.0, &deref_args)
6866
}
67+
/// Argument method. Trailing Nones are filtered out.
68+
pub fn args(&self) -> Vec<OperationArg> {
69+
let maybe_last_arg_index = (0..self.1.len()).rev().find(|i| !self.1[*i].is_none());
70+
match maybe_last_arg_index {
71+
None => vec![],
72+
Some(i) => self.1[0..i + 1].to_vec(),
73+
}
74+
}
6975
}
7076

7177
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -75,6 +81,14 @@ impl Statement {
7581
pub fn is_none(&self) -> bool {
7682
self.0 == NativeStatement::None
7783
}
84+
/// Argument method. Trailing Nones are filtered out.
85+
pub fn args(&self) -> Vec<StatementArg> {
86+
let maybe_last_arg_index = (0..self.1.len()).rev().find(|i| !self.1[*i].is_none());
87+
match maybe_last_arg_index {
88+
None => vec![],
89+
Some(i) => self.1[0..i + 1].to_vec(),
90+
}
91+
}
7892
}
7993

8094
impl ToFields for Statement {
@@ -102,29 +116,30 @@ impl TryFrom<Statement> for middleware::Statement {
102116
type S = middleware::Statement;
103117
type NS = NativeStatement;
104118
type SA = StatementArg;
119+
let proper_args = s.args();
105120
let args = (
106-
s.1.get(0).cloned(),
107-
s.1.get(1).cloned(),
108-
s.1.get(2).cloned(),
121+
proper_args.get(0).cloned(),
122+
proper_args.get(1).cloned(),
123+
proper_args.get(2).cloned(),
109124
);
110-
Ok(match (s.0, args) {
111-
(NS::None, _) => S::None,
112-
(NS::ValueOf, (Some(SA::Key(ak)), Some(SA::Literal(v)), _)) => S::ValueOf(ak, v),
113-
(NS::Equal, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _)) => S::Equal(ak1, ak2),
114-
(NS::NotEqual, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _)) => S::NotEqual(ak1, ak2),
115-
(NS::Gt, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _)) => S::Gt(ak1, ak2),
116-
(NS::Lt, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _)) => S::Lt(ak1, ak2),
117-
(NS::Contains, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _)) => S::Contains(ak1, ak2),
118-
(NS::NotContains, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _)) => {
125+
Ok(match (s.0, args, proper_args.len()) {
126+
(NS::None, _, 0) => S::None,
127+
(NS::ValueOf, (Some(SA::Key(ak)), Some(SA::Literal(v)), _), 2) => S::ValueOf(ak, v),
128+
(NS::Equal, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _), 2) => S::Equal(ak1, ak2),
129+
(NS::NotEqual, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _), 2) => S::NotEqual(ak1, ak2),
130+
(NS::Gt, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _), 2) => S::Gt(ak1, ak2),
131+
(NS::Lt, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _), 2) => S::Lt(ak1, ak2),
132+
(NS::Contains, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _), 2) => S::Contains(ak1, ak2),
133+
(NS::NotContains, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), _), 2) => {
119134
S::NotContains(ak1, ak2)
120135
}
121-
(NS::SumOf, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), Some(SA::Key(ak3)))) => {
136+
(NS::SumOf, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), Some(SA::Key(ak3))), 3) => {
122137
S::SumOf(ak1, ak2, ak3)
123138
}
124-
(NS::ProductOf, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), Some(SA::Key(ak3)))) => {
139+
(NS::ProductOf, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), Some(SA::Key(ak3))), 3) => {
125140
S::ProductOf(ak1, ak2, ak3)
126141
}
127-
(NS::MaxOf, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), Some(SA::Key(ak3)))) => {
142+
(NS::MaxOf, (Some(SA::Key(ak1)), Some(SA::Key(ak2)), Some(SA::Key(ak3))), 3) => {
128143
S::MaxOf(ak1, ak2, ak3)
129144
}
130145
_ => Err(anyhow!("Ill-formed statement expression {:?}", s))?,

src/middleware/mod.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -511,26 +511,28 @@ impl Operation {
511511
args.get(1).cloned(),
512512
args.get(2).cloned(),
513513
);
514-
Ok(match (op_code, arg_tup) {
515-
(NO::None, (None, None, None)) => Self::None,
516-
(NO::NewEntry, (None, None, None)) => Self::NewEntry,
517-
(NO::CopyStatement, (Some(s), None, None)) => Self::CopyStatement(s),
518-
(NO::EqualFromEntries, (Some(s1), Some(s2), None)) => Self::EqualFromEntries(s1, s2),
519-
(NO::NotEqualFromEntries, (Some(s1), Some(s2), None)) => {
514+
Ok(match (op_code, arg_tup, args.len()) {
515+
(NO::None, (None, None, None), 0) => Self::None,
516+
(NO::NewEntry, (None, None, None), 0) => Self::NewEntry,
517+
(NO::CopyStatement, (Some(s), None, None), 1) => Self::CopyStatement(s),
518+
(NO::EqualFromEntries, (Some(s1), Some(s2), None), 2) => Self::EqualFromEntries(s1, s2),
519+
(NO::NotEqualFromEntries, (Some(s1), Some(s2), None), 2) => {
520520
Self::NotEqualFromEntries(s1, s2)
521521
}
522-
(NO::GtFromEntries, (Some(s1), Some(s2), None)) => Self::GtFromEntries(s1, s2),
523-
(NO::LtFromEntries, (Some(s1), Some(s2), None)) => Self::LtFromEntries(s1, s2),
524-
(NO::ContainsFromEntries, (Some(s1), Some(s2), None)) => {
522+
(NO::GtFromEntries, (Some(s1), Some(s2), None), 2) => Self::GtFromEntries(s1, s2),
523+
(NO::LtFromEntries, (Some(s1), Some(s2), None), 2) => Self::LtFromEntries(s1, s2),
524+
(NO::ContainsFromEntries, (Some(s1), Some(s2), None), 2) => {
525525
Self::ContainsFromEntries(s1, s2)
526526
}
527-
(NO::NotContainsFromEntries, (Some(s1), Some(s2), None)) => {
527+
(NO::NotContainsFromEntries, (Some(s1), Some(s2), None), 2) => {
528528
Self::NotContainsFromEntries(s1, s2)
529529
}
530-
(NO::RenameContainedBy, (Some(s1), Some(s2), None)) => Self::RenameContainedBy(s1, s2),
531-
(NO::SumOf, (Some(s1), Some(s2), Some(s3))) => Self::SumOf(s1, s2, s3),
532-
(NO::ProductOf, (Some(s1), Some(s2), Some(s3))) => Self::ProductOf(s1, s2, s3),
533-
(NO::MaxOf, (Some(s1), Some(s2), Some(s3))) => Self::MaxOf(s1, s2, s3),
530+
(NO::RenameContainedBy, (Some(s1), Some(s2), None), 2) => {
531+
Self::RenameContainedBy(s1, s2)
532+
}
533+
(NO::SumOf, (Some(s1), Some(s2), Some(s3)), 3) => Self::SumOf(s1, s2, s3),
534+
(NO::ProductOf, (Some(s1), Some(s2), Some(s3)), 3) => Self::ProductOf(s1, s2, s3),
535+
(NO::MaxOf, (Some(s1), Some(s2), Some(s3)), 3) => Self::MaxOf(s1, s2, s3),
534536
_ => Err(anyhow!(
535537
"Ill-formed operation {:?} with arguments {:?}.",
536538
op_code,

0 commit comments

Comments
 (0)