dpscript/ir/validator/checker/
arg.rs

1use super::IRChecker;
2use crate::{IRArgumentOperation, IRCheckerContext, IRNode, Result, UnsourcedValidatorError};
3
4impl IRChecker for IRArgumentOperation {
5    fn check(&mut self, cx: &mut IRCheckerContext) -> Result<()> {
6        match self {
7            Self::Set(it) => match *it.value.clone() {
8                IRNode::Literal(_) => Ok(()),
9
10                IRNode::Reference(it) => {
11                    let refs = cx.get_refs();
12
13                    if !refs.contains_key(&it) {
14                        return Err(UnsourcedValidatorError {
15                            err: format!("Cannot find reference: {}", it),
16                        }
17                        .into());
18                    }
19
20                    Ok(())
21                }
22
23                other => Err(UnsourcedValidatorError {
24                    err: format!("Cannot set a {} as an argument value!", other),
25                }
26                .into()),
27            },
28
29            Self::Get(it) => {
30                let refs = cx.get_refs();
31
32                if !refs.contains_key(&it.var) {
33                    return Err(UnsourcedValidatorError {
34                        err: format!("Cannot find reference: {}", it.var),
35                    }
36                    .into());
37                }
38
39                Ok(())
40            }
41
42            Self::Clear => Ok(()),
43        }
44    }
45}