2023-07-04 19:37:50 +02:00
|
|
|
module.exports = grammar({
|
|
|
|
name: "hurl",
|
|
|
|
|
|
|
|
rules: {
|
|
|
|
source_file: ($) => repeat($._statement),
|
|
|
|
|
|
|
|
// statements
|
|
|
|
|
|
|
|
_statement: ($) =>
|
|
|
|
choice($._declaration_statement),
|
|
|
|
|
|
|
|
_declaration_statement: ($) =>
|
2023-07-04 20:07:50 +02:00
|
|
|
choice(
|
|
|
|
$.request_declaration,
|
|
|
|
$.header_declaration,
|
|
|
|
alias($.http_response_declaration, $.response),
|
|
|
|
),
|
|
|
|
|
|
|
|
// declarations
|
2023-07-04 19:37:50 +02:00
|
|
|
|
|
|
|
request_declaration: ($) =>
|
2023-07-04 20:07:50 +02:00
|
|
|
seq($._literal, field("url", $.url)),
|
|
|
|
|
|
|
|
header_declaration: ($) =>
|
|
|
|
seq(
|
|
|
|
field("header_name", $.header_name),
|
|
|
|
":",
|
|
|
|
field("header_value", $.header_value)
|
|
|
|
),
|
|
|
|
|
|
|
|
http_response_declaration: $ => seq($.scheme_literal, $._space_literal, $.status_code_pattern),
|
|
|
|
|
|
|
|
// literals
|
2023-07-04 19:37:50 +02:00
|
|
|
|
|
|
|
_literal: ($) => choice($.request_literal),
|
|
|
|
|
|
|
|
request_literal: (_$) =>
|
|
|
|
choice(
|
|
|
|
"GET",
|
|
|
|
"POST",
|
|
|
|
"PUT",
|
|
|
|
"DELETE",
|
|
|
|
"CONNECT",
|
|
|
|
"OPTIONS",
|
|
|
|
"TRACE",
|
|
|
|
"PATCH",
|
|
|
|
"LINK",
|
|
|
|
"UNLINK",
|
|
|
|
"PURGE",
|
|
|
|
"LOCK",
|
|
|
|
"UNLOCK",
|
|
|
|
"PROPFIND",
|
|
|
|
"VIEW"
|
|
|
|
),
|
|
|
|
|
2023-07-04 20:07:50 +02:00
|
|
|
scheme_literal: $ => "HTTP",
|
|
|
|
|
|
|
|
_space_literal: $ => " ",
|
|
|
|
|
|
|
|
// patterns
|
|
|
|
|
|
|
|
status_code_pattern: $ => /[\d]{3}/,
|
|
|
|
header_name: ($) => /[a-zA-Z-_0-9]+/,
|
|
|
|
header_value: ($) =>
|
|
|
|
/[a-zA-Z-_0-9\s:;\.,\\\/\"\'\?\!\(\)\{\}\[\]@<>=\-\+\*\#\$\&`|~^%]+/,
|
|
|
|
|
|
|
|
url: ($) => /\S+/,
|
2023-07-04 19:37:50 +02:00
|
|
|
},
|
|
|
|
});
|