File: //usr/include/dovecot/sieve/sieve-validator.h
#ifndef SIEVE_VALIDATOR_H
#define SIEVE_VALIDATOR_H
#include "lib.h"
#include "sieve-common.h"
/*
* Types
*/
enum sieve_argument_type {
SAT_NUMBER,
SAT_CONST_STRING,
SAT_VAR_STRING,
SAT_STRING_LIST,
SAT_COUNT
};
struct sieve_command_registration;
/*
* Validator
*/
struct sieve_validator;
struct sieve_validator *
sieve_validator_create(struct sieve_ast *ast,
struct sieve_error_handler *ehandler,
enum sieve_compile_flags flags);
void sieve_validator_free(struct sieve_validator **valdtr);
pool_t sieve_validator_pool(struct sieve_validator *valdtr);
bool sieve_validator_run(struct sieve_validator *valdtr);
/*
* Accessors
*/
struct sieve_error_handler *
sieve_validator_error_handler(struct sieve_validator *valdtr);
struct sieve_ast *sieve_validator_ast(struct sieve_validator *valdtr);
struct sieve_script *sieve_validator_script(struct sieve_validator *valdtr);
struct sieve_instance *sieve_validator_svinst(struct sieve_validator *valdtr);
enum sieve_compile_flags
sieve_validator_compile_flags(struct sieve_validator *valdtr);
/*
* Command/Test registry
*/
void sieve_validator_register_command(struct sieve_validator *valdtr,
const struct sieve_extension *ext,
const struct sieve_command_def *command);
/*
* Per-command tagged argument registry
*/
void sieve_validator_register_tag(struct sieve_validator *valdtr,
struct sieve_command_registration *cmd_reg,
const struct sieve_extension *ext,
const struct sieve_argument_def *tag_def,
int id_code);
void sieve_validator_register_external_tag(
struct sieve_validator *valdtr, const char *command,
const struct sieve_extension *ext,
const struct sieve_argument_def *tag_def, int id_code);
void sieve_validator_register_persistent_tag(
struct sieve_validator *valdtr, const char *command,
const struct sieve_extension *ext,
const struct sieve_argument_def *tag_def);
/*
* Overriding the default literal arguments
*/
void sieve_validator_argument_override(
struct sieve_validator *valdtr, enum sieve_argument_type type,
const struct sieve_extension *ext,
const struct sieve_argument_def *arg_def);
bool sieve_validator_argument_activate_super(
struct sieve_validator *valdtr, struct sieve_command *cmd,
struct sieve_ast_argument *arg, bool constant);
/*
* Argument validation API
*/
bool sieve_validate_positional_argument(struct sieve_validator *valdtr,
struct sieve_command *cmd,
struct sieve_ast_argument *arg,
const char *arg_name,
unsigned int arg_pos,
enum sieve_ast_argument_type req_type);
bool sieve_validator_argument_activate(struct sieve_validator *valdtr,
struct sieve_command *cmd,
struct sieve_ast_argument *arg,
bool constant);
bool sieve_validate_tag_parameter(struct sieve_validator *valdtr,
struct sieve_command *cmd,
struct sieve_ast_argument *tag,
struct sieve_ast_argument *param,
const char *arg_name, unsigned int arg_pos,
enum sieve_ast_argument_type req_type,
bool constant);
/*
* Extension support
*/
struct sieve_validator_extension {
const struct sieve_extension_def *ext;
bool (*check_conflict)(const struct sieve_extension *ext,
struct sieve_validator *valdtr, void *context,
struct sieve_ast_argument *require_arg,
const struct sieve_extension *ext_other,
bool required);
bool (*validate)(const struct sieve_extension *ext,
struct sieve_validator *valdtr, void *context,
struct sieve_ast_argument *require_arg, bool required);
void (*free)(const struct sieve_extension *ext,
struct sieve_validator *valdtr, void *context);
};
bool sieve_validator_extension_load(struct sieve_validator *valdtr,
struct sieve_command *cmd,
struct sieve_ast_argument *ext_arg,
const struct sieve_extension *ext,
bool required) ATTR_NULL(2, 3);
const struct sieve_extension *
sieve_validator_extension_load_by_name(struct sieve_validator *valdtr,
struct sieve_command *cmd,
struct sieve_ast_argument *ext_arg,
const char *ext_name);
const struct sieve_extension *
sieve_validator_extension_load_implicit(struct sieve_validator *valdtr,
const char *ext_name);
void sieve_validator_extension_register(
struct sieve_validator *valdtr, const struct sieve_extension *ext,
const struct sieve_validator_extension *valext, void *context);
bool sieve_validator_extension_loaded(struct sieve_validator *valdtr,
const struct sieve_extension *ext);
void sieve_validator_extension_set_context(struct sieve_validator *valdtr,
const struct sieve_extension *ext,
void *context);
void *sieve_validator_extension_get_context(struct sieve_validator *valdtr,
const struct sieve_extension *ext);
/*
* Validator object registry
*/
struct sieve_validator_object_registry;
struct sieve_validator_object_registry *
sieve_validator_object_registry_get(struct sieve_validator *valdtr,
const struct sieve_extension *ext);
void sieve_validator_object_registry_add(
struct sieve_validator_object_registry *regs,
const struct sieve_extension *ext,
const struct sieve_object_def *obj_def);
bool sieve_validator_object_registry_find(
struct sieve_validator_object_registry *regs, const char *identifier,
struct sieve_object *obj);
struct sieve_validator_object_registry *
sieve_validator_object_registry_create(struct sieve_validator *valdtr);
struct sieve_validator_object_registry *
sieve_validator_object_registry_init(struct sieve_validator *valdtr,
const struct sieve_extension *ext);
/*
* Error handling
*/
void sieve_validator_error(struct sieve_validator *valdtr,
const char *csrc_filename, unsigned int csrc_linenum,
unsigned int source_line, const char *fmt, ...)
ATTR_FORMAT(5, 6);
#define sieve_validator_error(valdtr, ...) \
sieve_validator_error(valdtr, __FILE__, __LINE__, __VA_ARGS__)
void sieve_validator_warning(struct sieve_validator *valdtr,
const char *csrc_filename,
unsigned int csrc_linenum,
unsigned int source_line, const char *fmt, ...)
ATTR_FORMAT(5, 6);
#define sieve_validator_warning(valdtr, ...) \
sieve_validator_warning(valdtr, __FILE__, __LINE__, __VA_ARGS__)
#endif