module.exports = grammar({
name: 'fluentbit',
extras: $ => [],
rules: {
config: $ => repeat(
choice(
$._config_block,
seq($.comment, $._newline),
),
),
_config_block: $ => choice(
$.section,
$.directive,
),
section: $ => seq(
field('header', $.section_header),
field('body', $.section_body),
),
section_header: $ => seq(
'[', field('name', $.section_header_type), ']',
$._newline,
),
section_body: $ => prec.right(2, repeat1(
choice(
seq(
$._INDENT,
choice(
$.entry,
$.comment,
),
$._newline,
),
$._line_only_spaces,
),
)),
directive: $ => seq(
'@',
choice(
$.directive_set,
$.directive_include,
),
$._newline,
),
directive_set: $ => seq('SET', $._WS, $._assign_expr),
directive_include: $ => seq('INCLUDE', $._WS, field('pattern', $.value_type)),
_assign_expr: $ => seq(
field('key', $.key_type),
optional($._WS),
'=',
optional($._WS),
field('value', $.value_type),
),
entry: $ => seq(
field('key', $.key_type),
$._WS,
field('value', $.value_type),
),
section_header_type: $ => /[a-zA-Z0-9_]+/,
key_type: $ => /[a-zA-Z0-9_\-\.]+/,
value_type: $ => /[^\r\n]+/,
_newline: $ => /\r?\n/,
_line_only_spaces: $ => / *\r?\n/,
_INDENT: $ => ' ', _WS: $ => / +/,
comment: $ => token(seq('#', /.*/)),
},
});