vessel/web/temple-parsers.c
2025-09-06 22:03:31 +03:00

59 lines
1.9 KiB
C

#include "include/conf.h"
#include "include/temple-expr.h"
#include "include/temple-tokens.h"
#include "include/temple-parsers.h"
vw_TempleASTNode *vw_TempleParser_parse_comment(vs_Logger *logger,
const char *input,
const char *end,
const char **readp) {
if (!logger || !input || !end || !readp || !*readp) {
return NULL;
}
const char *comment_start = *readp + 2; /* skip {# */
const char *comment_end = vw_Temple_lex_find_end(comment_start, end, "#}", 2);
if (!comment_end) {
vs_flog_error(logger,
"Error: Unterminated comment at position %zu. Expected '#}'",
(size_t)(*readp - input));
return NULL;
}
vw_TempleASTNode *node = vw_TempleASTNode_new_comment(comment_start, comment_end);
if (!node) {
return NULL;
}
*readp = comment_end + 2; /* skip #} */
return node;
}
vw_TempleASTNode *vw_TempleParser_parse_output(vs_Logger *logger,
const char *input,
const char *end,
const char **readp) {
if (!logger || !input || !end || !readp || !*readp) {
return NULL;
}
const char *expr_start = *readp + 2; /* skip {{ */
const char *expr_end = vw_Temple_lex_find_end(expr_start, end, "}}", 2);
if (!expr_end) {
vs_flog_error(logger,
"Error: Unterminated output expression at position %zu. Expected '}}'",
(size_t)(*readp - input));
return NULL;
}
vw_TempleASTNode *node = vw_TempleParser_parse_expr(logger, expr_start, expr_end);
if (!node) {
return NULL;
}
*readp = expr_end + 2; /* skip }} */
return node;
}