exchange/src/templating/mustach-wrap.h
2023-05-11 01:16:53 +02:00

235 lines
9.4 KiB
C

/*
Author: José Bollo <jobol@nonadev.net>
https://gitlab.com/jobol/mustach
SPDX-License-Identifier: ISC
*/
#ifndef _mustach_wrap_h_included_
#define _mustach_wrap_h_included_
/*
* mustach-wrap is intended to make integration of JSON
* libraries easier by wrapping mustach extensions in a
* single place.
*
* As before, using mustach and only mustach is possible
* (by using only mustach.h) but does not implement high
* level features coming with extensions implemented by
* this high level wrapper.
*/
#include "mustach.h"
/*
* Definition of the writing callbacks for mustach functions
* producing output to callbacks.
*
* Two callback types are defined:
*
* @mustach_write_cb_t:
*
* callback receiving the escaped data to be written as 3 parameters:
*
* 1. the 'closure', the same given to the wmustach_... function
* 2. a pointer to a 'buffer' containing the characters to be written
* 3. the size in bytes of the data pointed by 'buffer'
*
* @mustach_emit_cb_t:
*
* callback receiving the data to be written and a flag indicating
* if escaping should be done or not as 4 parameters:
*
* 1. the 'closure', the same given to the emustach_... function
* 2. a pointer to a 'buffer' containing the characters to be written
* 3. the size in bytes of the data pointed by 'buffer'
* 4. a boolean indicating if 'escape' should be done
*/
#ifndef _mustach_output_callbacks_defined_
#define _mustach_output_callbacks_defined_
typedef int mustach_write_cb_t(void *closure, const char *buffer, size_t size);
typedef int mustach_emit_cb_t(void *closure, const char *buffer, size_t size, int escape);
#endif
/**
* Flags specific to mustach wrap
*/
#define Mustach_With_SingleDot 4 /* obsolete, always set */
#define Mustach_With_Equal 8
#define Mustach_With_Compare 16
#define Mustach_With_JsonPointer 32
#define Mustach_With_ObjectIter 64
#define Mustach_With_IncPartial 128 /* obsolete, always set */
#define Mustach_With_EscFirstCmp 256
#define Mustach_With_PartialDataFirst 512
#define Mustach_With_ErrorUndefined 1024
#undef Mustach_With_AllExtensions
#define Mustach_With_AllExtensions 1023 /* don't include ErrorUndefined */
/**
* mustach_wrap_itf - high level wrap of mustach - interface for callbacks
*
* The functions sel, subsel, enter and next should return 0 or 1.
*
* All other functions should normally return MUSTACH_OK (zero).
*
* If any function returns a negative value, it means an error that
* stop the processing and that is reported to the caller. Mustach
* also has its own error codes. Using the macros MUSTACH_ERROR_USER
* and MUSTACH_IS_ERROR_USER could help to avoid clashes.
*
* @start: If defined (can be NULL), starts the mustach processing
* of the closure, called at the very beginning before any
* mustach processing occurs.
*
* @stop: If defined (can be NULL), stops the mustach processing
* of the closure, called at the very end after all mustach
* processing occurered. The status returned by the processing
* is passed to the stop.
*
* @compare: If defined (can be NULL), compares the value of the
* currently selected item with the given value and returns
* a negative value if current value is lesser, a positive
* value if the current value is greater or zero when
* values are equals.
* If 'compare' is NULL, any comparison in mustach
* is going to fails.
*
* @sel: Selects the item of the given 'name'. If 'name' is NULL
* Selects the current item. Returns 1 if the selection is
* effective or else 0 if the selection failed.
*
* @subsel: Selects from the currently selected object the value of
* the field of given name. Returns 1 if the selection is
* effective or else 0 if the selection failed.
*
* @enter: Enters the section of 'name' if possible.
* Musts return 1 if entered or 0 if not entered.
* When 1 is returned, the function 'leave' will always be called.
* Conversely 'leave' is never called when enter returns 0 or
* a negative value.
* When 1 is returned, the function must activate the first
* item of the section.
*
* @next: Activates the next item of the section if it exists.
* Musts return 1 when the next item is activated.
* Musts return 0 when there is no item to activate.
*
* @leave: Leaves the last entered section
*
* @get: Returns in 'sbuf' the value of the current selection if 'key'
* is zero. Otherwise, when 'key' is not zero, return in 'sbuf'
* the name of key of the current selection, or if no such key
* exists, the empty string. Must return 1 if possible or
* 0 when not possible or an error code.
*/
struct mustach_wrap_itf {
int (*start)(void *closure);
void (*stop)(void *closure, int status);
int (*compare)(void *closure, const char *value);
int (*sel)(void *closure, const char *name);
int (*subsel)(void *closure, const char *name);
int (*enter)(void *closure, int objiter);
int (*next)(void *closure);
int (*leave)(void *closure);
int (*get)(void *closure, struct mustach_sbuf *sbuf, int key);
};
/**
* Mustach interface used internally by mustach wrapper functions.
* Can be used for overriding behaviour.
*/
extern const struct mustach_itf mustach_wrap_itf;
/**
* Global hook for providing partials. When set to a not NULL value, the pointed
* function replaces the default behaviour and is called to provide the partial
* of the given 'name' in 'sbuf'.
* The function must return MUSTACH_OK when it filled 'sbuf' with value of partial
* or must return an error code if it failed.
*/
extern int (*mustach_wrap_get_partial)(const char *name, struct mustach_sbuf *sbuf);
/**
* mustach_wrap_file - Renders the mustache 'template' in 'file' for an abstract
* wrapper of interface 'itf' and 'closure'.
*
* @template: the template string to instantiate
* @length: length of the template or zero if unknown and template null terminated
* @itf: the interface of the abstract wrapper
* @closure: the closure of the abstract wrapper
* @file: the file where to write the result
*
* Returns 0 in case of success, -1 with errno set in case of system error
* a other negative value in case of error.
*/
extern int mustach_wrap_file(const char *template, size_t length, const struct mustach_wrap_itf *itf, void *closure, int flags, FILE *file);
/**
* mustach_wrap_fd - Renders the mustache 'template' in 'fd' for an abstract
* wrapper of interface 'itf' and 'closure'.
*
* @template: the template string to instantiate
* @length: length of the template or zero if unknown and template null terminated
* @itf: the interface of the abstract wrapper
* @closure: the closure of the abstract wrapper
* @fd: the file descriptor number where to write the result
*
* Returns 0 in case of success, -1 with errno set in case of system error
* a other negative value in case of error.
*/
extern int mustach_wrap_fd(const char *template, size_t length, const struct mustach_wrap_itf *itf, void *closure, int flags, int fd);
/**
* mustach_wrap_mem - Renders the mustache 'template' in 'result' for an abstract
* wrapper of interface 'itf' and 'closure'.
*
* @template: the template string to instantiate
* @length: length of the template or zero if unknown and template null terminated
* @itf: the interface of the abstract wrapper
* @closure: the closure of the abstract wrapper
* @result: the pointer receiving the result when 0 is returned
* @size: the size of the returned result
*
* Returns 0 in case of success, -1 with errno set in case of system error
* a other negative value in case of error.
*/
extern int mustach_wrap_mem(const char *template, size_t length, const struct mustach_wrap_itf *itf, void *closure, int flags, char **result, size_t *size);
/**
* mustach_wrap_write - Renders the mustache 'template' for an abstract
* wrapper of interface 'itf' and 'closure' to custom writer
* 'writecb' with 'writeclosure'.
*
* @template: the template string to instantiate
* @length: length of the template or zero if unknown and template null terminated
* @itf: the interface of the abstract wrapper
* @closure: the closure of the abstract wrapper
* @writecb: the function that write values
* @closure: the closure for the write function
*
* Returns 0 in case of success, -1 with errno set in case of system error
* a other negative value in case of error.
*/
extern int mustach_wrap_write(const char *template, size_t length, const struct mustach_wrap_itf *itf, void *closure, int flags, mustach_write_cb_t *writecb, void *writeclosure);
/**
* mustach_wrap_emit - Renders the mustache 'template' for an abstract
* wrapper of interface 'itf' and 'closure' to custom emiter 'emitcb'
* with 'emitclosure'.
*
* @template: the template string to instantiate
* @length: length of the template or zero if unknown and template null terminated
* @itf: the interface of the abstract wrapper
* @closure: the closure of the abstract wrapper
* @emitcb: the function that emit values
* @closure: the closure for the write function
*
* Returns 0 in case of success, -1 with errno set in case of system error
* a other negative value in case of error.
*/
extern int mustach_wrap_emit(const char *template, size_t length, const struct mustach_wrap_itf *itf, void *closure, int flags, mustach_emit_cb_t *emitcb, void *emitclosure);
#endif