static void init_error_type_metadata(Dictionary *metadata) { Dictionary types = ARRAY_DICT_INIT; Dictionary exception_metadata = ARRAY_DICT_INIT; PUT(exception_metadata, "id", INTEGER_OBJ(kErrorTypeException)); Dictionary validation_metadata = ARRAY_DICT_INIT; PUT(validation_metadata, "id", INTEGER_OBJ(kErrorTypeValidation)); PUT(types, "Exception", DICTIONARY_OBJ(exception_metadata)); PUT(types, "Validation", DICTIONARY_OBJ(validation_metadata)); PUT(*metadata, "error_types", DICTIONARY_OBJ(types)); }
static void ui_bridge_cursor_styleset(UI *b, Dictionary style) { Object copy = copy_object(DICTIONARY_OBJ(style)); Object *pobj = xmalloc(sizeof(copy)); *pobj = copy; UI_CALL(b, cursor_styleset, 2, b, pobj); }
/// Creates a deep clone of an object static Object copy_object(Object obj) { switch (obj.type) { case kObjectTypeNil: case kObjectTypeBoolean: case kObjectTypeInteger: case kObjectTypeFloat: return obj; case kObjectTypeString: return STRING_OBJ(cstr_to_string(obj.data.string.data)); case kObjectTypeArray: { Array rv = ARRAY_DICT_INIT; for (size_t i = 0; i < obj.data.array.size; i++) { ADD(rv, copy_object(obj.data.array.items[i])); } return ARRAY_OBJ(rv); } case kObjectTypeDictionary: { Dictionary rv = ARRAY_DICT_INIT; for (size_t i = 0; i < obj.data.dictionary.size; i++) { KeyValuePair item = obj.data.dictionary.items[i]; PUT(rv, item.key.data, copy_object(item.value)); } return DICTIONARY_OBJ(rv); } default: abort(); } }
static Array translate_contents(UI *ui, Array contents) { Array new_contents = ARRAY_DICT_INIT; for (size_t i = 0; i < contents.size; i++) { Array item = contents.items[i].data.array; Array new_item = ARRAY_DICT_INIT; int attr = (int)item.items[0].data.integer; if (attr) { Dictionary rgb_attrs = hlattrs2dict(syn_attr2entry(attr), ui->rgb); ADD(new_item, DICTIONARY_OBJ(rgb_attrs)); } else { ADD(new_item, DICTIONARY_OBJ((Dictionary)ARRAY_DICT_INIT)); } ADD(new_item, copy_object(item.items[1])); ADD(new_contents, ARRAY_OBJ(new_item)); } return new_contents; }
static void init_type_metadata(Dictionary *metadata) { Dictionary types = ARRAY_DICT_INIT; Dictionary buffer_metadata = ARRAY_DICT_INIT; PUT(buffer_metadata, "id", INTEGER_OBJ(kObjectTypeBuffer)); Dictionary window_metadata = ARRAY_DICT_INIT; PUT(window_metadata, "id", INTEGER_OBJ(kObjectTypeWindow)); Dictionary tabpage_metadata = ARRAY_DICT_INIT; PUT(tabpage_metadata, "id", INTEGER_OBJ(kObjectTypeTabpage)); PUT(types, "Buffer", DICTIONARY_OBJ(buffer_metadata)); PUT(types, "Window", DICTIONARY_OBJ(window_metadata)); PUT(types, "Tabpage", DICTIONARY_OBJ(tabpage_metadata)); PUT(*metadata, "types", DICTIONARY_OBJ(types)); }
static void remote_ui_hl_attr_define(UI *ui, Integer id, HlAttrs rgb_attrs, HlAttrs cterm_attrs, Array info) { if (!ui->ui_ext[kUILinegrid]) { return; } Array args = ARRAY_DICT_INIT; ADD(args, INTEGER_OBJ(id)); ADD(args, DICTIONARY_OBJ(hlattrs2dict(rgb_attrs, true))); ADD(args, DICTIONARY_OBJ(hlattrs2dict(cterm_attrs, false))); if (ui->ui_ext[kUIHlState]) { ADD(args, ARRAY_OBJ(copy_array(info))); } else { ADD(args, ARRAY_OBJ((Array)ARRAY_DICT_INIT)); } push_call(ui, "hl_attr_define", args); }
Dictionary api_metadata(void) { static Dictionary metadata = ARRAY_DICT_INIT; if (!metadata.size) { msgpack_rpc_init_function_metadata(&metadata); init_error_type_metadata(&metadata); init_type_metadata(&metadata); } return copy_object(DICTIONARY_OBJ(metadata)).data.dictionary; }
static void remote_ui_highlight_set(UI *ui, int id) { Array args = ARRAY_DICT_INIT; UIData *data = ui->data; if (data->hl_id == id) { return; } data->hl_id = id; Dictionary hl = hlattrs2dict(syn_attr2entry(id), ui->rgb); ADD(args, DICTIONARY_OBJ(hl)); push_call(ui, "highlight_set", args); }
static void remote_ui_cmdline_show(UI *ui, Array args) { Array new_args = ARRAY_DICT_INIT; Array contents = args.items[0].data.array; Array new_contents = ARRAY_DICT_INIT; for (size_t i = 0; i < contents.size; i++) { Array item = contents.items[i].data.array; Array new_item = ARRAY_DICT_INIT; int attr = (int)item.items[0].data.integer; if (attr) { Dictionary rgb_attrs = hlattrs2dict(syn_attr2entry(attr), ui->rgb); ADD(new_item, DICTIONARY_OBJ(rgb_attrs)); } else { ADD(new_item, DICTIONARY_OBJ((Dictionary)ARRAY_DICT_INIT)); } ADD(new_item, copy_object(item.items[1])); ADD(new_contents, ARRAY_OBJ(new_item)); } ADD(new_args, ARRAY_OBJ(new_contents)); for (size_t i = 1; i < args.size; i++) { ADD(new_args, copy_object(args.items[i])); } push_call(ui, "cmdline_show", new_args); }
void provider_init_feature_metadata(Dictionary *metadata) { Dictionary md = ARRAY_DICT_INIT; for (size_t i = 0; i < FEATURE_COUNT; i++) { Array methods = ARRAY_DICT_INIT; Feature *f = &features[i]; size_t j; char *method; for (method = f->methods[j = 0]; method; method = f->methods[++j]) { ADD(methods, STRING_OBJ(cstr_to_string(method))); } PUT(md, f->name, ARRAY_OBJ(methods)); } PUT(*metadata, "features", DICTIONARY_OBJ(md)); }
Array ui_array(void) { Array all_uis = ARRAY_DICT_INIT; for (size_t i = 0; i < ui_count; i++) { UI *ui = uis[i]; Dictionary info = ARRAY_DICT_INIT; PUT(info, "width", INTEGER_OBJ(ui->width)); PUT(info, "height", INTEGER_OBJ(ui->height)); PUT(info, "rgb", BOOLEAN_OBJ(ui->rgb)); for (UIExtension j = 0; j < kUIExtCount; j++) { PUT(info, ui_ext_names[j], BOOLEAN_OBJ(ui->ui_ext[j])); } if (ui->inspect) { ui->inspect(ui, &info); } ADD(all_uis, DICTIONARY_OBJ(info)); } return all_uis; }
static void remote_ui_highlight_set(UI *ui, HlAttrs attrs) { Array args = ARRAY_DICT_INIT; Dictionary hl = ARRAY_DICT_INIT; if (attrs.bold) { PUT(hl, "bold", BOOLEAN_OBJ(true)); } if (attrs.underline) { PUT(hl, "underline", BOOLEAN_OBJ(true)); } if (attrs.undercurl) { PUT(hl, "undercurl", BOOLEAN_OBJ(true)); } if (attrs.italic) { PUT(hl, "italic", BOOLEAN_OBJ(true)); } if (attrs.reverse) { PUT(hl, "reverse", BOOLEAN_OBJ(true)); } if (attrs.foreground != -1) { PUT(hl, "foreground", INTEGER_OBJ(attrs.foreground)); } if (attrs.background != -1) { PUT(hl, "background", INTEGER_OBJ(attrs.background)); } if (attrs.special != -1) { PUT(hl, "special", INTEGER_OBJ(attrs.special)); } ADD(args, DICTIONARY_OBJ(hl)); push_call(ui, "highlight_set", args); }