Skip to main content

openpql_pql_parser/ast/
fncall.rs

1use super::{Expr, Ident, Loc, LocInfo, Spanned, String};
2
3#[derive(Clone, PartialEq, derive_more::From, derive_more::Debug)]
4#[debug("{:?}({})", self.name, _to_str(&self.args))]
5pub struct FnCall<'i> {
6    pub name: Ident<'i>,
7    pub args: Vec<Expr<'i>>,
8
9    pub loc: (Loc, Loc),
10}
11
12impl Spanned for FnCall<'_> {
13    fn loc(&self) -> LocInfo {
14        self.loc
15    }
16}
17
18fn _to_str(elems: &[Expr<'_>]) -> String {
19    elems
20        .iter()
21        .map(|e| format!("{e:?}"))
22        .collect::<Vec<_>>()
23        .join(",")
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use crate::*;
30
31    #[test]
32    fn test_fn_call() {
33        let src = "equity(hero, river)";
34        let fncall = parse_fn_call(src).unwrap();
35
36        let ident = |id| Ident::from((id, loc(src, id)));
37
38        assert_eq!(fncall.name, ident("equity"));
39        assert_eq!(fncall.args.len(), 2);
40        assert_eq!(fncall.args[0], ident("hero").into());
41        assert_eq!(fncall.args[1], ident("river").into());
42        assert_eq!(fncall.loc, (0, src.len()));
43    }
44
45    #[test]
46    fn test_debug() {
47        let fncall = parse_fn_call("equity(hero, 1.23)").unwrap();
48
49        assert_eq!(format!("{fncall:?}"), "equity(hero,1.23)");
50    }
51}