refactor: hemar reboot

This commit is contained in:
2025-09-28 04:44:46 +00:00
parent 5dd03a947f
commit 38bf9151eb
27 changed files with 374 additions and 38 deletions

116
package/c/hemar-legacy/hemar.h Executable file
View File

@@ -0,0 +1,116 @@
/*
* hemar.h
* Template parser for Hemar
*/
#ifndef HEMAR_TEMPLATE_H
#define HEMAR_TEMPLATE_H
#include "postgres.h"
#include "utils/memutils.h"
/* Maximum length for template syntax elements */
#define TEMPLATE_MAX_PREFIX_LEN 32
/* Template error codes */
typedef enum {
TEMPLATE_ERROR_NONE = 0,
TEMPLATE_ERROR_UNKNOWN_TAG,
TEMPLATE_UNEXPECTED_OPEN_BRACES_AFFTER_SECTION_CONTROLE,
TEMPLATE_UNEXPECTED_OPEN_BRACES_AFFTER_SECTION_SOURCE,
TEMPLATE_ERROR_UNEXPECTED_INTERPOLATION_END,
TEMPLATE_ERROR_NO_SOURSE_IN_SECTION,
TEMPLATE_ERROR_NESTED_INTERPOLATION,
TEMPLATE_ERROR_UNEXPECTED_SECTION_END,
TEMPLATE_ERROR_NO_BEGIN_IN_SECTION,
TEMPLATE_ERROR_NESTED_INCLUDE,
TEMPLATE_ERROR_NESTED_EXECUTE,
TEMPLATE_ERROR_INVALID_CONFIG,
TEMPLATE_ERROR_OUT_OF_MEMORY,
TEMPLATE_ERROR_UNEXPECTED_INCLUDE_END,
TEMPLATE_ERROR_UNEXPECTED_EXECUTE_END
} TemplateErrorCode;
/* Template node types */
typedef enum {
TEMPLATE_NODE_TEXT,
TEMPLATE_NODE_INTERPOLATE,
TEMPLATE_NODE_SECTION,
TEMPLATE_NODE_EXECUTE,
TEMPLATE_NODE_INCLUDE
} TemplateNodeType;
/* Template configuration structure */
typedef struct {
struct {
struct {
const char *open; /* Default: "{%" */
const char *close; /* Default: "%}" */
} Braces;
struct {
const char *control; /* default: "for " */
const char *source; /* default: "in " */
const char *begin; /* default: "do " */
const char *end; /* default: "end" */
} Section;
struct {
const char *invoke; /* default: "" */
} Interpolate;
struct {
const char *invoke; /* default: "include " */
} Include;
struct {
const char *invoke; /* default: "exec " */
} Execute;
const char *nesting; /* default: "->" */
} Syntax;
} TemplateConfig;
/* Forward declaration */
typedef struct TemplateNode TemplateNode;
/* Template value structures */
typedef struct {
char *iterator;
char *collection;
TemplateNode *body;
} TemplateSectionValue;
typedef struct {
char *key;
} TemplateInterpolateValue;
typedef struct {
char *code;
} TemplateExecuteValue;
typedef struct {
char *key;
} TemplateIncludeValue;
typedef struct {
char *content;
} TemplateTextValue;
typedef union {
TemplateSectionValue section;
TemplateInterpolateValue interpolate;
TemplateExecuteValue execute;
TemplateIncludeValue include;
TemplateTextValue text;
} TemplateValue;
/* Template node structure */
struct TemplateNode {
TemplateNodeType type;
TemplateValue *value;
TemplateNode *next;
};
/* Function declarations */
TemplateConfig template_default_config(MemoryContext context);
bool template_validate_config(const TemplateConfig *config, TemplateErrorCode *error_code);
TemplateNode *template_parse(MemoryContext context, const char **s, const TemplateConfig *config, bool inner_parse, TemplateErrorCode *error_code);
void template_free_node(TemplateNode *node);
const char *template_error_to_string(TemplateErrorCode code, TemplateConfig *config);
#endif /* HEMAR_TEMPLATE_H */