#ifndef __GRAVITY_DELEGATE__
#define __GRAVITY_DELEGATE__
#include <stdint.h>
#include "gravity_value.h"
typedef enum {
GRAVITY_ERROR_NONE = 0,
GRAVITY_ERROR_SYNTAX,
GRAVITY_ERROR_SEMANTIC,
GRAVITY_ERROR_RUNTIME,
GRAVITY_ERROR_IO,
GRAVITY_WARNING,
} error_type_t;
typedef struct {
uint32_t code;
uint32_t lineno;
uint32_t colno;
uint32_t fileid;
uint32_t offset;
} error_desc_t;
#define ERROR_DESC_NONE (error_desc_t){0,0,0,0,0}
typedef void (*gravity_log_callback) (const char *message, void *xdata);
typedef void (*gravity_error_callback) (error_type_t error_type, const char *description, error_desc_t error_desc, void *xdata);
typedef void (*gravity_unittest_callback) (error_type_t error_type, const char *desc, const char *note, gravity_value_t value, int32_t row, int32_t col, void *xdata);
typedef void (*gravity_parser_callback) (void *token, void *xdata);
typedef const char* (*gravity_precode_callback) (void *xdata);
typedef const char* (*gravity_loadfile_callback) (const char *file, size_t *size, uint32_t *fileid, void *xdata);
typedef const char* (*gravity_filename_callback) (uint32_t fileid, void *xdata);
typedef bool (*gravity_bridge_initinstance) (gravity_vm *vm, void *xdata, gravity_instance_t *instance, gravity_value_t args[], int16_t nargs);
typedef bool (*gravity_bridge_setvalue) (gravity_vm *vm, void *xdata, gravity_value_t target, const char *key, gravity_value_t value);
typedef bool (*gravity_bridge_getvalue) (gravity_vm *vm, void *xdata, gravity_value_t target, const char *key, uint32_t vindex);
typedef bool (*gravity_bridge_setundef) (gravity_vm *vm, void *xdata, gravity_value_t target, const char *key, gravity_value_t value);
typedef bool (*gravity_bridge_getundef) (gravity_vm *vm, void *xdata, gravity_value_t target, const char *key, uint32_t vindex);
typedef bool (*gravity_bridge_execute) (gravity_vm *vm, void *xdata, gravity_value_t args[], int16_t nargs, uint32_t vindex);
typedef uint32_t (*gravity_bridge_size) (gravity_vm *vm, gravity_object_t *obj);
typedef void (*gravity_bridge_free) (gravity_vm *vm, gravity_object_t *obj);
typedef struct {
void *xdata;
gravity_log_callback log_callback;
gravity_error_callback error_callback;
gravity_unittest_callback unittest_callback;
gravity_parser_callback parser_callback;
gravity_precode_callback precode_callback;
gravity_loadfile_callback loadfile_callback;
gravity_filename_callback filename_callback;
gravity_bridge_initinstance bridge_initinstance;
gravity_bridge_setvalue bridge_setvalue;
gravity_bridge_getvalue bridge_getvalue;
gravity_bridge_setundef bridge_setundef;
gravity_bridge_getundef bridge_getundef;
gravity_bridge_execute bridge_execute;
gravity_bridge_size bridge_size;
gravity_bridge_free bridge_free;
} gravity_delegate_t;
#endif