#include "app/app.h" #include "bindings/definitions.h" namespace { void Params_free(mrb_state *mrb, void *ptr) { UNUSED(mrb); uint64_t id = ((Wrapper *)ptr)->id; app::element_pool.release(id); delete (Wrapper *)ptr; } const struct mrb_data_type Params_type = {"Params", Params_free}; mrb_value Params_init(mrb_state *mrb, mrb_value self) { Wrapper *old = (Wrapper *)DATA_PTR(self); if (old) mrb_free(mrb, old); mrb_data_init(self, nullptr, &Params_type); Wrapper *s = new Wrapper(); mrb_int id; mrb_get_args(mrb, "z", &id); app::element_pool.use(id); s->id = id; mrb_data_init(self, s, &Params_type); return self; } mrb_value params_get(mrb_state *mrb, mrb_value self) { mrb_sym key; mrb_get_args(mrb, "n", &key); uint64_t id = ((Wrapper *)DATA_PTR(self))->id; app::element_pool.use(id); app::EText *element = (app::EText *)app::element_pool[id]; auto it = element->params.find(mrb_sym2name(mrb, key)); if (it == element->params.end()) return mrb_nil_value(); return mrb_str_new_cstr(mrb, it->second.c_str()); } mrb_value params_set(mrb_state *mrb, mrb_value self) { mrb_sym key; mrb_value value; mrb_get_args(mrb, "no", &key, &value); uint64_t id = ((Wrapper *)DATA_PTR(self))->id; app::element_pool.use(id); app::EText *element = (app::EText *)app::element_pool[id]; element->params[mrb_sym2name(mrb, key)] = mrb_str_to_cstr(mrb, mrb_obj_as_string(mrb, value)); element->reload_text(); return mrb_nil_value(); } } // namespace namespace definitions { void register_params() { DEF_CLASS(Params, MRB_ARGS_REQ(1)); ADD_METHOD(Params, "[]", params_get, MRB_ARGS_REQ(1)); ADD_METHOD(Params, "[]=", params_set, MRB_ARGS_REQ(2)); bindings.Params = {Params_class, &Params_type}; } } // namespace definitions