#ifndef RAVA_REPL_SESSION_H
#define RAVA_REPL_SESSION_H
#include "repl_types.h"
#include "repl_history.h"
typedef struct {
RavaREPLVariable_t *variables;
size_t variable_count;
size_t variable_capacity;
RavaREPLMethod_t *methods;
size_t method_count;
size_t method_capacity;
RavaREPLClass_t *classes;
size_t class_count;
size_t class_capacity;
RavaProgram_t *program;
RavaClass_t *session_class;
RavaVM_t *vm;
RavaREPLHistory_t *history;
time_t start_time;
int execution_count;
bool debug_mode;
char *last_error;
} RavaREPLSession_t;
RavaREPLSession_t* rava_repl_session_create(void);
void rava_repl_session_destroy(RavaREPLSession_t *session);
bool rava_repl_session_add_variable(RavaREPLSession_t *session, const char *name,
const char *type_name, const char *initializer,
RavaValueType_e type, RavaValue_t value);
RavaREPLVariable_t* rava_repl_session_get_variable(RavaREPLSession_t *session, const char *name);
bool rava_repl_session_set_variable(RavaREPLSession_t *session, const char *name, RavaValue_t value);
void rava_repl_session_clear_variables(RavaREPLSession_t *session);
bool rava_repl_session_add_method(RavaREPLSession_t *session, const char *name,
const char *return_type, const char *source);
RavaREPLMethod_t* rava_repl_session_get_method(RavaREPLSession_t *session, const char *name);
bool rava_repl_session_add_class(RavaREPLSession_t *session, const char *name, const char *source);
RavaREPLClass_t* rava_repl_session_get_class(RavaREPLSession_t *session, const char *name);
char* rava_repl_session_generate_source(RavaREPLSession_t *session);
bool rava_repl_session_recompile(RavaREPLSession_t *session);
void rava_repl_session_set_error(RavaREPLSession_t *session, const char *error);
const char* rava_repl_session_get_error(RavaREPLSession_t *session);
#endif