1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use super::strings::name;
use super::util::{ignore_comments, opt_spacelike};
use super::value::space_list;
use crate::sass::{CallArgs, FormalArgs, Value};
use nom::types::CompleteByteSlice as Input;
use nom::*;

named!(pub formal_args<Input, FormalArgs>,
       do_parse!(tag!("(") >> opt_spacelike >>
                 v: separated_list!(
                     preceded!(tag!(","), opt_spacelike),
                     do_parse!(tag!("$") >> name: name >>
                               d: opt!(do_parse!(
                                   opt_spacelike >>
                                   tag!(":") >> opt_spacelike >>
                                   d: space_list >> opt_spacelike >>
                                   (d))) >>
                               (name.replace('-', "_"),
                                d.unwrap_or(Value::Null)))) >>
                 va: opt!(tag!("...")) >> opt_spacelike >>
                 preceded!(
                     opt!(delimited!(opt_spacelike, tag!(","), opt_spacelike)),
                     tag!(")")) >>
                 (FormalArgs::new(v, va.is_some()))));

named!(pub call_args<Input, CallArgs>,
       delimited!(
           tag!("("),
           map!(separated_list!(
               delimited!(opt_spacelike, tag!(","), opt_spacelike),
               pair!(opt!(delimited!(
                        tag!("$"),
                        map!(name, |n: String| n.replace("-", "_")),
                        preceded!(ignore_comments,
                                  tag!(":")))),
                     alt!(space_list |
                          delimited!(ignore_comments,
                                     space_list,
                                     ignore_comments)))),
                CallArgs::new),
           preceded!(
               opt!(delimited!(opt_spacelike, opt!(tag!(",")), opt_spacelike)),
               tag!(")"))));