class Oj::StreamWriter

Public Class Methods

new(options) click to toggle source

Creates a new StreamWriter. @param [Hash] options formating options

static VALUE
stream_writer_new(int argc, VALUE *argv, VALUE self) {
    StreamWriterType    type = STREAM_IO;
    int                 fd = 0;
    VALUE               stream = argv[0];
    VALUE               clas = rb_obj_class(stream);
    StreamWriter        sw;
#if !IS_WINDOWS
    VALUE               s;
#endif
    
    if (oj_stringio_class == clas) {
        type = STRING_IO;
#if !IS_WINDOWS
    } else if (rb_respond_to(stream, oj_fileno_id) &&
               Qnil != (s = rb_funcall(stream, oj_fileno_id, 0)) &&
               0 != (fd = FIX2INT(s))) {
        type = FILE_IO;
#endif
    } else if (rb_respond_to(stream, oj_write_id)) {
        type = STREAM_IO;
    } else {
        rb_raise(rb_eArgError, "expected an IO Object.");
    }
    sw = ALLOC(struct _StreamWriter);
    str_writer_init(&sw->sw);
    if (2 == argc) {
        oj_parse_options(argv[1], &sw->sw.opts);
    }
    sw->sw.out.indent = sw->sw.opts.indent;
    sw->stream = stream;
    sw->type = type;
    sw->fd = fd;

    return Data_Wrap_Struct(oj_stream_writer_class, 0, stream_writer_free, sw);
}

Public Instance Methods

pop() click to toggle source

Pops up a level in the JSON document closing the array or object that is currently open.

static VALUE
stream_writer_pop(VALUE self) {
    StreamWriter        sw = (StreamWriter)DATA_PTR(self);

    stream_writer_reset_buf(sw);
    oj_str_writer_pop(&sw->sw);
    stream_writer_write(sw);
    return Qnil;
}
pop_all() click to toggle source

Pops all level in the JSON document closing all the array or object that is currently open.

static VALUE
stream_writer_pop_all(VALUE self) {
    StreamWriter        sw = (StreamWriter)DATA_PTR(self);

    stream_writer_reset_buf(sw);
    oj_str_writer_pop_all(&sw->sw);
    stream_writer_write(sw);

    return Qnil;
}
push_array(key=nil) click to toggle source

Pushes an array onto the JSON document. Future pushes will be to this object until a pop() is called. @param [String] key the key if adding to an object in the JSON document

static VALUE
stream_writer_push_array(int argc, VALUE *argv, VALUE self) {
    StreamWriter        sw = (StreamWriter)DATA_PTR(self);

    stream_writer_reset_buf(sw);
    switch (argc) {
    case 0:
        oj_str_writer_push_array(&sw->sw, 0);
        break;
    case 1:
        if (Qnil == argv[0]) {
            oj_str_writer_push_array(&sw->sw, 0);
        } else {
            rb_check_type(argv[0], T_STRING);
            oj_str_writer_push_array(&sw->sw, StringValuePtr(argv[0]));
        }
        break;
    default:
        rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'.");
        break;
    }
    stream_writer_write(sw);
    return Qnil;
}
push_value(value, key=nil) click to toggle source

Pushes a string onto the JSON document. The String must be a valid JSON encoded string. No additional checking is done to verify the validity of the string. @param [Object] value value to add to the JSON document @param [String] key the key if adding to an object in the JSON document

static VALUE
stream_writer_push_json(int argc, VALUE *argv, VALUE self) {
    StreamWriter        sw = (StreamWriter)DATA_PTR(self);

    rb_check_type(argv[0], T_STRING);
    stream_writer_reset_buf(sw);
    switch (argc) {
    case 1:
        oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
        break;
    case 2:
        if (Qnil == argv[0]) {
            oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), 0);
        } else {
            rb_check_type(argv[1], T_STRING);
            oj_str_writer_push_json((StrWriter)DATA_PTR(self), StringValuePtr(*argv), StringValuePtr(argv[1]));
        }
        break;
    default:
        rb_raise(rb_eArgError, "Wrong number of argument to 'push_json'.");
        break;
    }
    stream_writer_write(sw);
    return Qnil;
}
push_key(key) click to toggle source

Pushes a key onto the JSON document. The key will be used for the next push if currently in a JSON object and ignored otherwise. If a key is provided on the next push then that new key will be ignored. @param [String] key the key pending for the next push

static VALUE
stream_writer_push_key(VALUE self, VALUE key) {
    StreamWriter        sw = (StreamWriter)DATA_PTR(self);

    rb_check_type(key, T_STRING);
    stream_writer_reset_buf(sw);
    oj_str_writer_push_key(&sw->sw, StringValuePtr(key));
    stream_writer_write(sw);
    return Qnil;
}
push_object(key=nil) click to toggle source

Pushes an object onto the JSON document. Future pushes will be to this object until a pop() is called. @param [String] key the key if adding to an object in the JSON document

static VALUE
stream_writer_push_object(int argc, VALUE *argv, VALUE self) {
    StreamWriter        sw = (StreamWriter)DATA_PTR(self);

    stream_writer_reset_buf(sw);
    switch (argc) {
    case 0:
        oj_str_writer_push_object(&sw->sw, 0);
        break;
    case 1:
        if (Qnil == argv[0]) {
            oj_str_writer_push_object(&sw->sw, 0);
        } else {
            rb_check_type(argv[0], T_STRING);
            oj_str_writer_push_object(&sw->sw, StringValuePtr(argv[0]));
        }
        break;
    default:
        rb_raise(rb_eArgError, "Wrong number of argument to 'push_object'.");
        break;
    }
    stream_writer_write(sw);
    return Qnil;
}
push_value(value, key=nil) click to toggle source

Pushes a value onto the JSON document. @param [Object] value value to add to the JSON document @param [String] key the key if adding to an object in the JSON document

static VALUE
stream_writer_push_value(int argc, VALUE *argv, VALUE self) {
    StreamWriter        sw = (StreamWriter)DATA_PTR(self);

    stream_writer_reset_buf(sw);
    switch (argc) {
    case 1:
        oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
        break;
    case 2:
        if (Qnil == argv[0]) {
            oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, 0);
        } else {
            rb_check_type(argv[1], T_STRING);
            oj_str_writer_push_value((StrWriter)DATA_PTR(self), *argv, StringValuePtr(argv[1]));
        }
        break;
    default:
        rb_raise(rb_eArgError, "Wrong number of argument to 'push_value'.");
        break;
    }
    stream_writer_write(sw);
    return Qnil;
}