zap-model 0.1.0

Internal models for zap, a simple configuration management tool
Documentation
/// This describes the task definition grammar for Zap

taskfile = _{ SOI
            ~ task+
            ~ EOI }

task = { "task"
        ~ identifier
        ~ opening_brace
        ~ parameters?
        ~ script
        ~ closing_brace
        }

parameters = { "parameters"
              ~ opening_brace
              ~ parameter+
              ~ closing_brace
              }
parameter = { identifier
             ~ opening_brace
             ~ required?
             ~ help
             ~ ptype
             ~ closing_brace
             }

required = { "required" ~ equals ~ bool }
help = { "help" ~ equals ~ string }
ptype = { "type" ~ equals ~ typedef }


script = { "script"
          ~ opening_brace
          ~ (script_inline | script_file)
          ~ closing_brace
          }
script_inline = { "inline" ~ equals ~ string }
script_file   = { "file" ~ equals ~ string }



// Unfortunately pest doesn't yet support sharing rules between grammars
// so everything below this line is copy/pasted between task.pest and
// plan.pest, when making changes to one, make sure to change the other

// An identifier will be used to refer to the task later
identifier = { ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_")* }

opening_brace = _{ "{" }
closing_brace = _{ "}" }
equals        = _{ "=" }
quote         = _{ "'" }
triple_quote  = _{ "'''" }

string        = { triple_quoted | single_quoted }
single_quoted = ${ (quote ~ inner_single_str ~ quote) }
inner_single_str = @{ (!(quote | "\\") ~ ANY)* ~ (escape ~ inner_single_str)? }

triple_quoted = ${ (triple_quote ~ inner_triple_str ~ triple_quote) }
inner_triple_str = @{ (!(triple_quote | "\\") ~ ANY)* ~ (escape ~ inner_triple_str)? }

escape    = @{ "\\" ~ ("\"" | "\\" | "r" | "n" | "t" | "0" | "'" | code | unicode) }
code      = @{ "x" ~ hex_digit{2} }
unicode   = @{ "u" ~ opening_brace ~ hex_digit{2, 6} ~ closing_brace }
hex_digit = @{ '0'..'9' | 'a'..'f' | 'A'..'F' }

typedef = { string_type }
string_type = { "string" }

bool = { truthy | falsey }
truthy = { "true" }
falsey = { "false" }

block_comment = _{ "/*" ~ (block_comment | !"*/" ~ ANY)* ~ "*/" }
COMMENT    = _{ block_comment | ("//" ~ (!NEWLINE~ ANY)*) }
WHITESPACE = _{ " " | "\t" | NEWLINE }