/* ./library/tsf_fsdb_protocol.h -- generated by tsf_define from ./library/tsf_fsdb_protocol.t */

#include "tsf.h"

#ifdef __cplusplus
extern "C" {
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_state
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_state
struct tsf_fsdb_state_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command
struct tsf_fsdb_command_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response
struct tsf_fsdb_response_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_uint8__array
#define TSF_DEFINE_STRUCT_DECL_uint8__array
struct uint8__array_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__put
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__put
struct tsf_fsdb_command__put_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__out_write
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__out_write
struct tsf_fsdb_command__out_write_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__get
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__get
struct tsf_fsdb_command__get_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__rm
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_command__rm
struct tsf_fsdb_command__rm_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload
struct tsf_fsdb_response__payload_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__welcome
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__welcome
struct tsf_fsdb_response__payload__welcome_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__welcome__version
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__welcome__version
struct tsf_fsdb_response__payload__welcome__version_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__sys_error
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__sys_error
struct tsf_fsdb_response__payload__sys_error_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__proto_error
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__proto_error
struct tsf_fsdb_response__payload__proto_error_s;
#endif

#ifndef TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__in_data
#define TSF_DEFINE_STRUCT_DECL_tsf_fsdb_response__payload__in_data
struct tsf_fsdb_response__payload__in_data_s;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_state
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_state
typedef struct tsf_fsdb_state_s tsf_fsdb_state_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_command
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_command
typedef struct tsf_fsdb_command_s tsf_fsdb_command_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_response
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_response
typedef struct tsf_fsdb_response_s tsf_fsdb_response_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_uint8__array
#define TSF_DEFINE_TYPEDEF_uint8__array
typedef struct uint8__array_s uint8__array_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_command__put
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_command__put
typedef struct tsf_fsdb_command__put_s tsf_fsdb_command__put_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_command__out_write
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_command__out_write
typedef struct tsf_fsdb_command__out_write_s tsf_fsdb_command__out_write_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_command__get
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_command__get
typedef struct tsf_fsdb_command__get_s tsf_fsdb_command__get_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_command__rm
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_command__rm
typedef struct tsf_fsdb_command__rm_s tsf_fsdb_command__rm_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload
typedef struct tsf_fsdb_response__payload_s tsf_fsdb_response__payload_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__welcome
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__welcome
typedef struct tsf_fsdb_response__payload__welcome_s tsf_fsdb_response__payload__welcome_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__welcome__version
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__welcome__version
typedef struct tsf_fsdb_response__payload__welcome__version_s tsf_fsdb_response__payload__welcome__version_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__sys_error
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__sys_error
typedef struct tsf_fsdb_response__payload__sys_error_s tsf_fsdb_response__payload__sys_error_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__proto_error
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__proto_error
typedef struct tsf_fsdb_response__payload__proto_error_s tsf_fsdb_response__payload__proto_error_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__in_data
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_response__payload__in_data
typedef struct tsf_fsdb_response__payload__in_data_s tsf_fsdb_response__payload__in_data_t;
#endif

#ifndef TSF_DEFINE_TYPEDEF_tsf_fsdb_buffer
#define TSF_DEFINE_TYPEDEF_tsf_fsdb_buffer
typedef uint8__array_t tsf_fsdb_buffer_t;
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_uint8__array
#define TSF_DEFINE_STRUCT_DEF_uint8__array
struct uint8__array_s {
    uint8_t *data;
    uint32_t len;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_state
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_state
struct tsf_fsdb_state_s {
    tsf_choice_t value;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__put
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__put
struct tsf_fsdb_command__put_s {
    tsf_buffer_t* key;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__out_write
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__out_write
struct tsf_fsdb_command__out_write_s {
    tsf_fsdb_buffer_t data;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__get
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__get
struct tsf_fsdb_command__get_s {
    tsf_buffer_t* key;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__rm
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command__rm
struct tsf_fsdb_command__rm_s {
    tsf_buffer_t* key;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_command
struct tsf_fsdb_command_s {
    tsf_choice_t value;
    union {
        tsf_fsdb_command__put_t put;
        tsf_fsdb_command__out_write_t out_write;
        tsf_fsdb_command__get_t get;
        tsf_fsdb_command__rm_t rm;
    } u;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__welcome__version
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__welcome__version
struct tsf_fsdb_response__payload__welcome__version_s {
    int32_t major;
    int32_t minor;
    int32_t patch;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__welcome
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__welcome
struct tsf_fsdb_response__payload__welcome_s {
    char* name;
    tsf_fsdb_response__payload__welcome__version_t version;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__sys_error
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__sys_error
struct tsf_fsdb_response__payload__sys_error_s {
    char* msg;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__proto_error
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__proto_error
struct tsf_fsdb_response__payload__proto_error_s {
    char* msg;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__in_data
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload__in_data
struct tsf_fsdb_response__payload__in_data_s {
    tsf_fsdb_buffer_t data;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response__payload
struct tsf_fsdb_response__payload_s {
    tsf_choice_t value;
    union {
        tsf_fsdb_response__payload__welcome_t welcome;
        tsf_fsdb_response__payload__sys_error_t sys_error;
        tsf_fsdb_response__payload__proto_error_t proto_error;
        tsf_fsdb_response__payload__in_data_t in_data;
    } u;
};
#endif

#ifndef TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response
#define TSF_DEFINE_STRUCT_DEF_tsf_fsdb_response
struct tsf_fsdb_response_s {
    tsf_fsdb_state_t state;
    tsf_fsdb_response__payload_t payload;
};
#endif

#ifndef TSF_DEFINE_CHOICE_DEFS_tsf_fsdb_state
#define TSF_DEFINE_CHOICE_DEFS_tsf_fsdb_state
#define tsf_fsdb_state__clear 0
#define tsf_fsdb_state__put 1
#define tsf_fsdb_state__get 2
static TSF_inline const char *tsf_fsdb_state__to_str(tsf_choice_t value) {
    switch (value) {
    case 0: return "clear";
    case 1: return "put";
    case 2: return "get";
    case UINT32_MAX: return "<unknown>";
    default: abort();
    }
}
#endif

#ifndef TSF_DEFINE_CHOICE_DEFS_tsf_fsdb_command
#define TSF_DEFINE_CHOICE_DEFS_tsf_fsdb_command
#define tsf_fsdb_command__ping 0
#define tsf_fsdb_command__put 1
#define tsf_fsdb_command__out_write 2
#define tsf_fsdb_command__out_commit 3
#define tsf_fsdb_command__get 4
#define tsf_fsdb_command__rm 5
#define tsf_fsdb_command__reset 6
static TSF_inline const char *tsf_fsdb_command__to_str(tsf_choice_t value) {
    switch (value) {
    case 0: return "ping";
    case 1: return "put";
    case 2: return "out_write";
    case 3: return "out_commit";
    case 4: return "get";
    case 5: return "rm";
    case 6: return "reset";
    case UINT32_MAX: return "<unknown>";
    default: abort();
    }
}
#endif

#ifndef TSF_DEFINE_CHOICE_DEFS_tsf_fsdb_response__payload
#define TSF_DEFINE_CHOICE_DEFS_tsf_fsdb_response__payload
#define tsf_fsdb_response__payload__ok 0
#define tsf_fsdb_response__payload__welcome 1
#define tsf_fsdb_response__payload__sys_error 2
#define tsf_fsdb_response__payload__proto_error 3
#define tsf_fsdb_response__payload__not_found 4
#define tsf_fsdb_response__payload__in_data 5
#define tsf_fsdb_response__payload__in_eof 6
static TSF_inline const char *tsf_fsdb_response__payload__to_str(tsf_choice_t value) {
    switch (value) {
    case 0: return "ok";
    case 1: return "welcome";
    case 2: return "sys_error";
    case 3: return "proto_error";
    case 4: return "not_found";
    case 5: return "in_data";
    case 6: return "in_eof";
    case UINT32_MAX: return "<unknown>";
    default: abort();
    }
}
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_buffer
#define TSF_DEFINE_FUNCS_tsf_fsdb_buffer
tsf_type_t *tsf_fsdb_buffer__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_buffer__destruct(tsf_fsdb_buffer_t *data);
tsf_genrtr_t *tsf_fsdb_buffer__get_generator(void) TSF_ATTRIBUTE_NOINLINE;
tsf_parser_t *tsf_fsdb_buffer__get_parser(void) TSF_ATTRIBUTE_NOINLINE;
static TSF_inline tsf_bool_t instanceof__tsf_fsdb_buffer(tsf_type_t *type) { return tsf_type_instanceof(type, tsf_fsdb_buffer__get_type()); }
static TSF_inline tsf_bool_t buf_instanceof__tsf_fsdb_buffer(tsf_buffer_t *buf) { return tsf_buffer_instanceof(buf, tsf_fsdb_buffer__get_type()); }
static TSF_inline tsf_buffer_t *tsf_fsdb_buffer__generate(void *data) { return tsf_generator_generate(tsf_fsdb_buffer__get_generator(), data); }
static TSF_inline tsf_buffer_t *tsf_fsdb_buffer__generate_in(void *data, void *region) { return tsf_generator_generate_in(tsf_fsdb_buffer__get_generator(), data, region); }
static TSF_inline tsf_fsdb_buffer_t *tsf_fsdb_buffer__parse(tsf_buffer_t *buf) { return (tsf_fsdb_buffer_t*)tsf_parser_parse(tsf_fsdb_buffer__get_parser(), buf); }
static TSF_inline tsf_fsdb_buffer_t *tsf_fsdb_buffer__parse_in(tsf_buffer_t *buf, void *region) { return (tsf_fsdb_buffer_t*)tsf_parser_parse_in(tsf_fsdb_buffer__get_parser(), buf, region); }
static TSF_inline tsf_bool_t tsf_fsdb_buffer__parse_into(tsf_buffer_t *buf, tsf_fsdb_buffer_t *data, void *region) { return tsf_parser_parse_into(tsf_fsdb_buffer__get_parser(), buf, data, region); }
tsf_bool_t tsf_fsdb_buffer__write(tsf_stream_file_output_t *out, tsf_fsdb_buffer_t *data) TSF_ATTRIBUTE_NOINLINE;
tsf_fsdb_buffer_t *tsf_fsdb_buffer__read(tsf_stream_file_input_t *inp) TSF_ATTRIBUTE_NOINLINE;
tsf_bool_t tsf_fsdb_buffer__read_into(tsf_stream_file_input_t *inp, tsf_fsdb_buffer_t *result) TSF_ATTRIBUTE_NOINLINE;
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_state
#define TSF_DEFINE_FUNCS_tsf_fsdb_state
tsf_type_t *tsf_fsdb_state__get_type(void) TSF_ATTRIBUTE_NOINLINE;
static TSF_inline void tsf_fsdb_state__destruct(tsf_fsdb_state_t *data) { }
tsf_genrtr_t *tsf_fsdb_state__get_generator(void) TSF_ATTRIBUTE_NOINLINE;
tsf_parser_t *tsf_fsdb_state__get_parser(void) TSF_ATTRIBUTE_NOINLINE;
static TSF_inline tsf_bool_t instanceof__tsf_fsdb_state(tsf_type_t *type) { return tsf_type_instanceof(type, tsf_fsdb_state__get_type()); }
static TSF_inline tsf_bool_t buf_instanceof__tsf_fsdb_state(tsf_buffer_t *buf) { return tsf_buffer_instanceof(buf, tsf_fsdb_state__get_type()); }
static TSF_inline tsf_buffer_t *tsf_fsdb_state__generate(void *data) { return tsf_generator_generate(tsf_fsdb_state__get_generator(), data); }
static TSF_inline tsf_buffer_t *tsf_fsdb_state__generate_in(void *data, void *region) { return tsf_generator_generate_in(tsf_fsdb_state__get_generator(), data, region); }
static TSF_inline tsf_fsdb_state_t *tsf_fsdb_state__parse(tsf_buffer_t *buf) { return (tsf_fsdb_state_t*)tsf_parser_parse(tsf_fsdb_state__get_parser(), buf); }
static TSF_inline tsf_fsdb_state_t *tsf_fsdb_state__parse_in(tsf_buffer_t *buf, void *region) { return (tsf_fsdb_state_t*)tsf_parser_parse_in(tsf_fsdb_state__get_parser(), buf, region); }
static TSF_inline tsf_bool_t tsf_fsdb_state__parse_into(tsf_buffer_t *buf, tsf_fsdb_state_t *data, void *region) { return tsf_parser_parse_into(tsf_fsdb_state__get_parser(), buf, data, region); }
tsf_bool_t tsf_fsdb_state__write(tsf_stream_file_output_t *out, tsf_fsdb_state_t *data) TSF_ATTRIBUTE_NOINLINE;
tsf_fsdb_state_t *tsf_fsdb_state__read(tsf_stream_file_input_t *inp) TSF_ATTRIBUTE_NOINLINE;
tsf_bool_t tsf_fsdb_state__read_into(tsf_stream_file_input_t *inp, tsf_fsdb_state_t *result) TSF_ATTRIBUTE_NOINLINE;
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_command
#define TSF_DEFINE_FUNCS_tsf_fsdb_command
tsf_type_t *tsf_fsdb_command__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_command__destruct(tsf_fsdb_command_t *data);
tsf_genrtr_t *tsf_fsdb_command__get_generator(void) TSF_ATTRIBUTE_NOINLINE;
tsf_parser_t *tsf_fsdb_command__get_parser(void) TSF_ATTRIBUTE_NOINLINE;
static TSF_inline tsf_bool_t instanceof__tsf_fsdb_command(tsf_type_t *type) { return tsf_type_instanceof(type, tsf_fsdb_command__get_type()); }
static TSF_inline tsf_bool_t buf_instanceof__tsf_fsdb_command(tsf_buffer_t *buf) { return tsf_buffer_instanceof(buf, tsf_fsdb_command__get_type()); }
static TSF_inline tsf_buffer_t *tsf_fsdb_command__generate(void *data) { return tsf_generator_generate(tsf_fsdb_command__get_generator(), data); }
static TSF_inline tsf_buffer_t *tsf_fsdb_command__generate_in(void *data, void *region) { return tsf_generator_generate_in(tsf_fsdb_command__get_generator(), data, region); }
static TSF_inline tsf_fsdb_command_t *tsf_fsdb_command__parse(tsf_buffer_t *buf) { return (tsf_fsdb_command_t*)tsf_parser_parse(tsf_fsdb_command__get_parser(), buf); }
static TSF_inline tsf_fsdb_command_t *tsf_fsdb_command__parse_in(tsf_buffer_t *buf, void *region) { return (tsf_fsdb_command_t*)tsf_parser_parse_in(tsf_fsdb_command__get_parser(), buf, region); }
static TSF_inline tsf_bool_t tsf_fsdb_command__parse_into(tsf_buffer_t *buf, tsf_fsdb_command_t *data, void *region) { return tsf_parser_parse_into(tsf_fsdb_command__get_parser(), buf, data, region); }
tsf_bool_t tsf_fsdb_command__write(tsf_stream_file_output_t *out, tsf_fsdb_command_t *data) TSF_ATTRIBUTE_NOINLINE;
tsf_fsdb_command_t *tsf_fsdb_command__read(tsf_stream_file_input_t *inp) TSF_ATTRIBUTE_NOINLINE;
tsf_bool_t tsf_fsdb_command__read_into(tsf_stream_file_input_t *inp, tsf_fsdb_command_t *result) TSF_ATTRIBUTE_NOINLINE;
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_response
#define TSF_DEFINE_FUNCS_tsf_fsdb_response
tsf_type_t *tsf_fsdb_response__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_response__destruct(tsf_fsdb_response_t *data);
tsf_genrtr_t *tsf_fsdb_response__get_generator(void) TSF_ATTRIBUTE_NOINLINE;
tsf_parser_t *tsf_fsdb_response__get_parser(void) TSF_ATTRIBUTE_NOINLINE;
static TSF_inline tsf_bool_t instanceof__tsf_fsdb_response(tsf_type_t *type) { return tsf_type_instanceof(type, tsf_fsdb_response__get_type()); }
static TSF_inline tsf_bool_t buf_instanceof__tsf_fsdb_response(tsf_buffer_t *buf) { return tsf_buffer_instanceof(buf, tsf_fsdb_response__get_type()); }
static TSF_inline tsf_buffer_t *tsf_fsdb_response__generate(void *data) { return tsf_generator_generate(tsf_fsdb_response__get_generator(), data); }
static TSF_inline tsf_buffer_t *tsf_fsdb_response__generate_in(void *data, void *region) { return tsf_generator_generate_in(tsf_fsdb_response__get_generator(), data, region); }
static TSF_inline tsf_fsdb_response_t *tsf_fsdb_response__parse(tsf_buffer_t *buf) { return (tsf_fsdb_response_t*)tsf_parser_parse(tsf_fsdb_response__get_parser(), buf); }
static TSF_inline tsf_fsdb_response_t *tsf_fsdb_response__parse_in(tsf_buffer_t *buf, void *region) { return (tsf_fsdb_response_t*)tsf_parser_parse_in(tsf_fsdb_response__get_parser(), buf, region); }
static TSF_inline tsf_bool_t tsf_fsdb_response__parse_into(tsf_buffer_t *buf, tsf_fsdb_response_t *data, void *region) { return tsf_parser_parse_into(tsf_fsdb_response__get_parser(), buf, data, region); }
tsf_bool_t tsf_fsdb_response__write(tsf_stream_file_output_t *out, tsf_fsdb_response_t *data) TSF_ATTRIBUTE_NOINLINE;
tsf_fsdb_response_t *tsf_fsdb_response__read(tsf_stream_file_input_t *inp) TSF_ATTRIBUTE_NOINLINE;
tsf_bool_t tsf_fsdb_response__read_into(tsf_stream_file_input_t *inp, tsf_fsdb_response_t *result) TSF_ATTRIBUTE_NOINLINE;
#endif

#ifndef TSF_DEFINE_FUNCS_uint8__array
#define TSF_DEFINE_FUNCS_uint8__array
#define uint8__array__get_type uint8__arrayVXsGBvRhW4Fl9bKAn6H5135aCp2WbtgGrd8g1pf__get_type
#define uint8__array__destruct uint8__arrayVXsGBvRhW4Fl9bKAn6H5135aCp2WbtgGrd8g1pf__destruct
tsf_type_t *uint8__array__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void uint8__array__destruct(uint8__array_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_command__put
#define TSF_DEFINE_FUNCS_tsf_fsdb_command__put
tsf_type_t *tsf_fsdb_command__put__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_command__put__destruct(tsf_fsdb_command__put_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_command__out_write
#define TSF_DEFINE_FUNCS_tsf_fsdb_command__out_write
tsf_type_t *tsf_fsdb_command__out_write__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_command__out_write__destruct(tsf_fsdb_command__out_write_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_command__get
#define TSF_DEFINE_FUNCS_tsf_fsdb_command__get
tsf_type_t *tsf_fsdb_command__get__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_command__get__destruct(tsf_fsdb_command__get_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_command__rm
#define TSF_DEFINE_FUNCS_tsf_fsdb_command__rm
tsf_type_t *tsf_fsdb_command__rm__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_command__rm__destruct(tsf_fsdb_command__rm_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_response__payload
#define TSF_DEFINE_FUNCS_tsf_fsdb_response__payload
tsf_type_t *tsf_fsdb_response__payload__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_response__payload__destruct(tsf_fsdb_response__payload_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__welcome
#define TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__welcome
tsf_type_t *tsf_fsdb_response__payload__welcome__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_response__payload__welcome__destruct(tsf_fsdb_response__payload__welcome_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__welcome__version
#define TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__welcome__version
tsf_type_t *tsf_fsdb_response__payload__welcome__version__get_type(void) TSF_ATTRIBUTE_NOINLINE;
static TSF_inline void tsf_fsdb_response__payload__welcome__version__destruct(tsf_fsdb_response__payload__welcome__version_t *data) { }
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__sys_error
#define TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__sys_error
tsf_type_t *tsf_fsdb_response__payload__sys_error__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_response__payload__sys_error__destruct(tsf_fsdb_response__payload__sys_error_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__proto_error
#define TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__proto_error
tsf_type_t *tsf_fsdb_response__payload__proto_error__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_response__payload__proto_error__destruct(tsf_fsdb_response__payload__proto_error_t *data);
#endif

#ifndef TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__in_data
#define TSF_DEFINE_FUNCS_tsf_fsdb_response__payload__in_data
tsf_type_t *tsf_fsdb_response__payload__in_data__get_type(void) TSF_ATTRIBUTE_NOINLINE;
void tsf_fsdb_response__payload__in_data__destruct(tsf_fsdb_response__payload__in_data_t *data);
#endif

#ifdef __cplusplus
};
#endif

