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;
}