class Yajl::Projector
Public Class Methods
new(stream, read_bufsize=4096)
click to toggle source
# File lib/yajl.rb, line 27 def initialize(stream, read_bufsize=4096) @stream = stream @buffer_size = read_bufsize end
Public Instance Methods
project(p1)
click to toggle source
static VALUE rb_yajl_projector_project(VALUE self, VALUE schema) { VALUE stream = rb_iv_get(self, "@stream"); long buffer_size = FIX2LONG(rb_iv_get(self, "@buffer_size")); VALUE buffer = rb_str_new(0, buffer_size); struct yajl_event_stream_s parser = { .funcs = &rb_alloc_funcs, .stream = stream, .buffer = buffer, .offset = (unsigned int)buffer_size, .lexer = yajl_lex_alloc(&rb_alloc_funcs, 0, 1), }; yajl_event_t event = yajl_event_stream_next(&parser, 1); RB_GC_GUARD(stream); RB_GC_GUARD(buffer); VALUE result; int state = 0; if (event.token == yajl_tok_left_brace || event.token == yajl_tok_left_bracket) { VALUE args[3]; args[0] = (VALUE)&parser; args[1] = schema; args[2] = (VALUE)&event; result = rb_protect(rb_protected_yajl_projector_filter, (VALUE)args, &state); } else { yajl_lex_free(parser.lexer); rb_raise(cParseError, "expected left bracket or brace, actually read %s", yajl_tok_name(event.token)); } yajl_lex_free(parser.lexer); if (state) rb_jump_tag(state); return result; }