/** * Encodes and appends the array `array` to `w` */ void watchman_dump_array(watchman_t *w, VALUE array) { long i; watchman_append(w, &watchman_array_marker, sizeof(watchman_array_marker)); watchman_dump_int(w, RARRAY_LEN(array)); for (i = 0; i < RARRAY_LEN(array); i++) { watchman_dump(w, rb_ary_entry(array, i)); } }
/** * RubyWatchman.dump(serializable) * * Converts the Ruby object, `serializable`, into a binary string in the * Watchman binary protocol format. * * Examples of serializable objects include arrays, hashes, strings, numbers * (integers, floats), booleans, and nil. */ VALUE RubyWatchman_dump(VALUE self, VALUE serializable) { watchman_t *w = watchman_init(); watchman_dump(w, serializable); // update header with final length information uint64_t *len = (uint64_t *)(w->data + sizeof(WATCHMAN_HEADER) - sizeof(uint64_t) - 1); *len = w->len - sizeof(WATCHMAN_HEADER) + 1; // prepare final return value VALUE serialized = rb_str_buf_new(w->len); rb_str_buf_cat(serialized, (const char*)w->data, w->len); watchman_free(w); return serialized; }
/** * Helper method that encodes and appends a key/value pair (`key`, `value`) from * a hash to the watchman_t struct passed in via `data` */ int watchman_dump_hash_iterator(VALUE key, VALUE value, VALUE data) { watchman_t *w = (watchman_t *)data; watchman_dump_string(w, StringValue(key)); watchman_dump(w, value); return ST_CONTINUE; }