Class: JSON::Ext::Generator::State
- Inherits:
-
Object
- Object
- JSON::Ext::Generator::State
- Defined in:
- ext/json/ext/generator/generator.c
Class Method Summary collapse
-
.from_state(opts) ⇒ Object
Creates a State object from opts, which ought to be Hash to create a new State instance configured by opts, something else to create an unconfigured instance.
Instance Method Summary collapse
-
#[](name) ⇒ Object
Return the value returned by method
name
. -
#allow_nan? ⇒ Boolean
Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise returns false.
-
#array_nl ⇒ Object
This string is put at the end of a line that holds a JSON array.
-
#array_nl=(array_nl) ⇒ Object
This string is put at the end of a line that holds a JSON array.
-
#ascii_only? ⇒ Boolean
Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise returns false.
-
#buffer_initial_length ⇒ Object
This integer returns the current inital length of the buffer.
-
#buffer_initial_length=(length) ⇒ Object
This sets the initial length of the buffer to
length
, iflength
> 0, otherwise its value isn’t changed. -
#check_circular? ⇒ Boolean
Returns true, if circular data structures should be checked, otherwise returns false.
-
#configure(opts) ⇒ Object
(also: #merge)
Configure this State instance with the Hash opts, and return itself.
-
#depth ⇒ Object
This integer returns the current depth of data structure nesting.
-
#depth=(depth) ⇒ Object
This sets the maximum level of data structure nesting in the generated JSON to the integer depth, max_nesting = 0 if no maximum should be checked.
-
#generate(obj) ⇒ Object
Generates a valid JSON document from object
obj
and returns the result. -
#indent ⇒ Object
This string is used to indent levels in the JSON text.
-
#indent=(indent) ⇒ Object
This string is used to indent levels in the JSON text.
-
#new(opts = {}) ⇒ Object
constructor
Instantiates a new State object, configured by opts.
-
#initialize_copy(orig) ⇒ Object
Initializes this object from orig if it to be duplicated/cloned and returns it.
-
#max_nesting ⇒ Object
This integer returns the maximum level of data structure nesting in the generated JSON, max_nesting = 0 if no maximum is checked.
-
#max_nesting=(depth) ⇒ Object
This sets the maximum level of data structure nesting in the generated JSON to the integer depth, max_nesting = 0 if no maximum should be checked.
-
#object_nl ⇒ Object
This string is put at the end of a line that holds a JSON object (or Hash).
-
#object_nl=(object_nl) ⇒ Object
This string is put at the end of a line that holds a JSON object (or Hash).
-
#quirks_mode? ⇒ Object
Returns true, if quirks mode is enabled.
-
#quirks_mode=(enable) ⇒ Object
If set to true, enables the quirks_mode mode.
-
#quirks_mode? ⇒ Boolean
Returns true, if quirks mode is enabled.
-
#space ⇒ Object
This string is used to insert a space between the tokens in a JSON string.
-
#space=(space) ⇒ Object
This string is used to insert a space between the tokens in a JSON string.
-
#space_before ⇒ Object
This string is used to insert a space before the ‘:’ in JSON objects.
-
#space_before=(space_before) ⇒ Object
This string is used to insert a space before the ‘:’ in JSON objects.
-
#to_h ⇒ Object
Returns the configuration instance variables as a hash, that can be passed to the configure method.
Constructor Details
#new(opts = {}) ⇒ Object
Instantiates a new State object, configured by opts.
opts can have the following keys:
-
indent: a string used to indent levels (default: ”),
-
space: a string that is put after, a : or , delimiter (default: ”),
-
space_before: a string that is put before a : pair delimiter (default: ”),
-
object_nl: a string that is put at the end of a JSON object (default: ”),
-
array_nl: a string that is put at the end of a JSON array (default: ”),
-
allow_nan: true if NaN, Infinity, and -Infinity should be generated, otherwise an exception is thrown, if these values are encountered. This options defaults to false.
-
quirks_mode: Enables quirks_mode for parser, that is for example generating single JSON values instead of documents is possible.
-
buffer_initial_length: sets the initial length of the generator’s internal buffer.
907 908 909 910 911 912 913 914 915 916 |
# File 'ext/json/ext/generator/generator.c', line 907
static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE opts;
GET_STATE(self);
state->max_nesting = 19;
state->buffer_initial_length = FBUFFER_INITIAL_LENGTH_DEFAULT;
rb_scan_args(argc, argv, "01", &opts);
if (!NIL_P(opts)) cState_configure(self, opts);
return self;
}
|
Class Method Details
.from_state(opts) ⇒ Object
Creates a State object from opts, which ought to be Hash to create a new State instance configured by opts, something else to create an unconfigured instance. If opts is a State object, it is just returned.
951 952 953 954 955 956 957 958 959 960 961 962 963 |
# File 'ext/json/ext/generator/generator.c', line 951
static VALUE cState_from_state_s(VALUE self, VALUE opts)
{
if (RTEST(rb_obj_is_kind_of(opts, self))) {
return opts;
} else if (RTEST(rb_obj_is_kind_of(opts, rb_cHash))) {
return rb_funcall(self, i_new, 1, opts);
} else {
if (NIL_P(CJSON_SAFE_STATE_PROTOTYPE)) {
CJSON_SAFE_STATE_PROTOTYPE = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
}
return rb_funcall(CJSON_SAFE_STATE_PROTOTYPE, i_dup, 0);
}
}
|
Instance Method Details
#[](name) ⇒ Object
Return the value returned by method name
.
630 631 632 633 634 635 636 637 638 |
# File 'ext/json/ext/generator/generator.c', line 630
static VALUE cState_aref(VALUE self, VALUE name)
{
GET_STATE(self);
if (RTEST(rb_funcall(self, i_respond_to_p, 1, name))) {
return rb_funcall(self, i_send, 1, name);
} else {
return Qnil;
}
}
|
#allow_nan? ⇒ Boolean
Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise returns false.
1191 1192 1193 1194 1195 |
# File 'ext/json/ext/generator/generator.c', line 1191
static VALUE cState_allow_nan_p(VALUE self)
{
GET_STATE(self);
return state->allow_nan ? Qtrue : Qfalse;
}
|
#array_nl ⇒ Object
This string is put at the end of a line that holds a JSON array.
1117 1118 1119 1120 1121 |
# File 'ext/json/ext/generator/generator.c', line 1117
static VALUE cState_array_nl(VALUE self)
{
GET_STATE(self);
return state->array_nl ? rb_str_new2(state->array_nl) : rb_str_new2("");
}
|
#array_nl=(array_nl) ⇒ Object
This string is put at the end of a line that holds a JSON array.
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 |
# File 'ext/json/ext/generator/generator.c', line 1128
static VALUE cState_array_nl_set(VALUE self, VALUE array_nl)
{
unsigned long len;
GET_STATE(self);
Check_Type(array_nl, T_STRING);
len = RSTRING_LEN(array_nl);
if (len == 0) {
if (state->array_nl) {
ruby_xfree(state->array_nl);
state->array_nl = NULL;
}
} else {
if (state->array_nl) ruby_xfree(state->array_nl);
state->array_nl = strdup(RSTRING_PTR(array_nl));
state->array_nl_len = len;
}
return Qnil;
}
|
#ascii_only? ⇒ Boolean
Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise returns false.
1203 1204 1205 1206 1207 |
# File 'ext/json/ext/generator/generator.c', line 1203
static VALUE cState_ascii_only_p(VALUE self)
{
GET_STATE(self);
return state->ascii_only ? Qtrue : Qfalse;
}
|
#buffer_initial_length ⇒ Object
This integer returns the current inital length of the buffer.
1262 1263 1264 1265 1266 |
# File 'ext/json/ext/generator/generator.c', line 1262
static VALUE cState_buffer_initial_length(VALUE self)
{
GET_STATE(self);
return LONG2FIX(state->buffer_initial_length);
}
|
#buffer_initial_length=(length) ⇒ Object
This sets the initial length of the buffer to length
, if length
> 0, otherwise its value isn’t changed.
1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 |
# File 'ext/json/ext/generator/generator.c', line 1274
static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_length)
{
long initial_length;
GET_STATE(self);
Check_Type(buffer_initial_length, T_FIXNUM);
initial_length = FIX2LONG(buffer_initial_length);
if (initial_length > 0) {
state->buffer_initial_length = initial_length;
}
return Qnil;
}
|
#check_circular? ⇒ Boolean
Returns true, if circular data structures should be checked, otherwise returns false.
1154 1155 1156 1157 1158 |
# File 'ext/json/ext/generator/generator.c', line 1154
static VALUE cState_check_circular_p(VALUE self)
{
GET_STATE(self);
return state->max_nesting ? Qtrue : Qfalse;
}
|
#configure(opts) ⇒ Object Also known as: merge
Configure this State instance with the Hash opts, and return itself.
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 |
# File 'ext/json/ext/generator/generator.c', line 510
static VALUE cState_configure(VALUE self, VALUE opts)
{
VALUE tmp;
GET_STATE(self);
tmp = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
if (NIL_P(tmp)) tmp = rb_convert_type(opts, T_HASH, "Hash", "to_h");
if (NIL_P(tmp)) {
rb_raise(rb_eArgError, "opts has to be hash like or convertable into a hash");
}
opts = tmp;
tmp = rb_hash_aref(opts, ID2SYM(i_indent));
if (RTEST(tmp)) {
unsigned long len;
Check_Type(tmp, T_STRING);
len = RSTRING_LEN(tmp);
state->indent = fstrndup(RSTRING_PTR(tmp), len);
state->indent_len = len;
}
tmp = rb_hash_aref(opts, ID2SYM(i_space));
if (RTEST(tmp)) {
unsigned long len;
Check_Type(tmp, T_STRING);
len = RSTRING_LEN(tmp);
state->space = fstrndup(RSTRING_PTR(tmp), len);
state->space_len = len;
}
tmp = rb_hash_aref(opts, ID2SYM(i_space_before));
if (RTEST(tmp)) {
unsigned long len;
Check_Type(tmp, T_STRING);
len = RSTRING_LEN(tmp);
state->space_before = fstrndup(RSTRING_PTR(tmp), len);
state->space_before_len = len;
}
tmp = rb_hash_aref(opts, ID2SYM(i_array_nl));
if (RTEST(tmp)) {
unsigned long len;
Check_Type(tmp, T_STRING);
len = RSTRING_LEN(tmp);
state->array_nl = fstrndup(RSTRING_PTR(tmp), len);
state->array_nl_len = len;
}
tmp = rb_hash_aref(opts, ID2SYM(i_object_nl));
if (RTEST(tmp)) {
unsigned long len;
Check_Type(tmp, T_STRING);
len = RSTRING_LEN(tmp);
state->object_nl = fstrndup(RSTRING_PTR(tmp), len);
state->object_nl_len = len;
}
tmp = ID2SYM(i_max_nesting);
state->max_nesting = 19;
if (option_given_p(opts, tmp)) {
VALUE max_nesting = rb_hash_aref(opts, tmp);
if (RTEST(max_nesting)) {
Check_Type(max_nesting, T_FIXNUM);
state->max_nesting = FIX2LONG(max_nesting);
} else {
state->max_nesting = 0;
}
}
tmp = ID2SYM(i_depth);
state->depth = 0;
if (option_given_p(opts, tmp)) {
VALUE depth = rb_hash_aref(opts, tmp);
if (RTEST(depth)) {
Check_Type(depth, T_FIXNUM);
state->depth = FIX2LONG(depth);
} else {
state->depth = 0;
}
}
tmp = ID2SYM(i_buffer_initial_length);
if (option_given_p(opts, tmp)) {
VALUE buffer_initial_length = rb_hash_aref(opts, tmp);
if (RTEST(buffer_initial_length)) {
long initial_length;
Check_Type(buffer_initial_length, T_FIXNUM);
initial_length = FIX2LONG(buffer_initial_length);
if (initial_length > 0) state->buffer_initial_length = initial_length;
}
}
tmp = rb_hash_aref(opts, ID2SYM(i_allow_nan));
state->allow_nan = RTEST(tmp);
tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only));
state->ascii_only = RTEST(tmp);
tmp = rb_hash_aref(opts, ID2SYM(i_quirks_mode));
state->quirks_mode = RTEST(tmp);
return self;
}
|
#depth ⇒ Object
This integer returns the current depth of data structure nesting.
1237 1238 1239 1240 1241 |
# File 'ext/json/ext/generator/generator.c', line 1237
static VALUE cState_depth(VALUE self)
{
GET_STATE(self);
return LONG2FIX(state->depth);
}
|
#depth=(depth) ⇒ Object
This sets the maximum level of data structure nesting in the generated JSON to the integer depth, max_nesting = 0 if no maximum should be checked.
1249 1250 1251 1252 1253 1254 1255 |
# File 'ext/json/ext/generator/generator.c', line 1249
static VALUE cState_depth_set(VALUE self, VALUE depth)
{
GET_STATE(self);
Check_Type(depth, T_FIXNUM);
state->depth = FIX2LONG(depth);
return Qnil;
}
|
#generate(obj) ⇒ Object
Generates a valid JSON document from object obj
and returns the result. If no valid JSON document can be created this method raises a GeneratorError exception.
877 878 879 880 881 882 883 884 885 |
# File 'ext/json/ext/generator/generator.c', line 877
static VALUE cState_generate(VALUE self, VALUE obj)
{
VALUE result = cState_partial_generate(self, obj);
GET_STATE(self);
if (!state->quirks_mode && !isArrayOrObject(result)) {
rb_raise(eGeneratorError, "only generation of JSON objects or arrays allowed");
}
return result;
}
|
#indent ⇒ Object
This string is used to indent levels in the JSON text.
970 971 972 973 974 |
# File 'ext/json/ext/generator/generator.c', line 970
static VALUE cState_indent(VALUE self)
{
GET_STATE(self);
return state->indent ? rb_str_new2(state->indent) : rb_str_new2("");
}
|
#indent=(indent) ⇒ Object
This string is used to indent levels in the JSON text.
981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 |
# File 'ext/json/ext/generator/generator.c', line 981
static VALUE cState_indent_set(VALUE self, VALUE indent)
{
unsigned long len;
GET_STATE(self);
Check_Type(indent, T_STRING);
len = RSTRING_LEN(indent);
if (len == 0) {
if (state->indent) {
ruby_xfree(state->indent);
state->indent = NULL;
state->indent_len = 0;
}
} else {
if (state->indent) ruby_xfree(state->indent);
state->indent = strdup(RSTRING_PTR(indent));
state->indent_len = len;
}
return Qnil;
}
|
#initialize_copy(orig) ⇒ Object
Initializes this object from orig if it to be duplicated/cloned and returns it.
924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 |
# File 'ext/json/ext/generator/generator.c', line 924
static VALUE cState_init_copy(VALUE obj, VALUE orig)
{
JSON_Generator_State *objState, *origState;
Data_Get_Struct(obj, JSON_Generator_State, objState);
Data_Get_Struct(orig, JSON_Generator_State, origState);
if (!objState) rb_raise(rb_eArgError, "unallocated JSON::State");
MEMCPY(objState, origState, JSON_Generator_State, 1);
objState->indent = fstrndup(origState->indent, origState->indent_len);
objState->space = fstrndup(origState->space, origState->space_len);
objState->space_before = fstrndup(origState->space_before, origState->space_before_len);
objState->object_nl = fstrndup(origState->object_nl, origState->object_nl_len);
objState->array_nl = fstrndup(origState->array_nl, origState->array_nl_len);
if (origState->array_delim) objState->array_delim = fbuffer_dup(origState->array_delim);
if (origState->object_delim) objState->object_delim = fbuffer_dup(origState->object_delim);
if (origState->object_delim2) objState->object_delim2 = fbuffer_dup(origState->object_delim2);
return obj;
}
|
#max_nesting ⇒ Object
This integer returns the maximum level of data structure nesting in the generated JSON, max_nesting = 0 if no maximum is checked.
1166 1167 1168 1169 1170 |
# File 'ext/json/ext/generator/generator.c', line 1166
static VALUE cState_max_nesting(VALUE self)
{
GET_STATE(self);
return LONG2FIX(state->max_nesting);
}
|
#max_nesting=(depth) ⇒ Object
This sets the maximum level of data structure nesting in the generated JSON to the integer depth, max_nesting = 0 if no maximum should be checked.
1178 1179 1180 1181 1182 1183 |
# File 'ext/json/ext/generator/generator.c', line 1178
static VALUE cState_max_nesting_set(VALUE self, VALUE depth)
{
GET_STATE(self);
Check_Type(depth, T_FIXNUM);
return state->max_nesting = FIX2LONG(depth);
}
|
#object_nl ⇒ Object
This string is put at the end of a line that holds a JSON object (or Hash).
1081 1082 1083 1084 1085 |
# File 'ext/json/ext/generator/generator.c', line 1081
static VALUE cState_object_nl(VALUE self)
{
GET_STATE(self);
return state->object_nl ? rb_str_new2(state->object_nl) : rb_str_new2("");
}
|
#object_nl=(object_nl) ⇒ Object
This string is put at the end of a line that holds a JSON object (or Hash).
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 |
# File 'ext/json/ext/generator/generator.c', line 1093
static VALUE cState_object_nl_set(VALUE self, VALUE object_nl)
{
unsigned long len;
GET_STATE(self);
Check_Type(object_nl, T_STRING);
len = RSTRING_LEN(object_nl);
if (len == 0) {
if (state->object_nl) {
ruby_xfree(state->object_nl);
state->object_nl = NULL;
}
} else {
if (state->object_nl) ruby_xfree(state->object_nl);
state->object_nl = strdup(RSTRING_PTR(object_nl));
state->object_nl_len = len;
}
return Qnil;
}
|
#quirks_mode? ⇒ Object
Returns true, if quirks mode is enabled. Otherwise returns false.
1214 1215 1216 1217 1218 |
# File 'ext/json/ext/generator/generator.c', line 1214
static VALUE cState_quirks_mode_p(VALUE self)
{
GET_STATE(self);
return state->quirks_mode ? Qtrue : Qfalse;
}
|
#quirks_mode=(enable) ⇒ Object
If set to true, enables the quirks_mode mode.
1225 1226 1227 1228 1229 1230 |
# File 'ext/json/ext/generator/generator.c', line 1225
static VALUE cState_quirks_mode_set(VALUE self, VALUE enable)
{
GET_STATE(self);
state->quirks_mode = RTEST(enable);
return Qnil;
}
|
#quirks_mode? ⇒ Boolean
Returns true, if quirks mode is enabled. Otherwise returns false.
1214 1215 1216 1217 1218 |
# File 'ext/json/ext/generator/generator.c', line 1214
static VALUE cState_quirks_mode_p(VALUE self)
{
GET_STATE(self);
return state->quirks_mode ? Qtrue : Qfalse;
}
|
#space ⇒ Object
This string is used to insert a space between the tokens in a JSON string.
1007 1008 1009 1010 1011 |
# File 'ext/json/ext/generator/generator.c', line 1007
static VALUE cState_space(VALUE self)
{
GET_STATE(self);
return state->space ? rb_str_new2(state->space) : rb_str_new2("");
}
|
#space=(space) ⇒ Object
This string is used to insert a space between the tokens in a JSON string.
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 |
# File 'ext/json/ext/generator/generator.c', line 1019
static VALUE cState_space_set(VALUE self, VALUE space)
{
unsigned long len;
GET_STATE(self);
Check_Type(space, T_STRING);
len = RSTRING_LEN(space);
if (len == 0) {
if (state->space) {
ruby_xfree(state->space);
state->space = NULL;
state->space_len = 0;
}
} else {
if (state->space) ruby_xfree(state->space);
state->space = strdup(RSTRING_PTR(space));
state->space_len = len;
}
return Qnil;
}
|
#space_before ⇒ Object
This string is used to insert a space before the ‘:’ in JSON objects.
1044 1045 1046 1047 1048 |
# File 'ext/json/ext/generator/generator.c', line 1044
static VALUE cState_space_before(VALUE self)
{
GET_STATE(self);
return state->space_before ? rb_str_new2(state->space_before) : rb_str_new2("");
}
|
#space_before=(space_before) ⇒ Object
This string is used to insert a space before the ‘:’ in JSON objects.
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 |
# File 'ext/json/ext/generator/generator.c', line 1055
static VALUE cState_space_before_set(VALUE self, VALUE space_before)
{
unsigned long len;
GET_STATE(self);
Check_Type(space_before, T_STRING);
len = RSTRING_LEN(space_before);
if (len == 0) {
if (state->space_before) {
ruby_xfree(state->space_before);
state->space_before = NULL;
state->space_before_len = 0;
}
} else {
if (state->space_before) ruby_xfree(state->space_before);
state->space_before = strdup(RSTRING_PTR(space_before));
state->space_before_len = len;
}
return Qnil;
}
|
#to_h ⇒ Object
Returns the configuration instance variables as a hash, that can be passed to the configure method.
607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 |
# File 'ext/json/ext/generator/generator.c', line 607
static VALUE cState_to_h(VALUE self)
{
VALUE result = rb_hash_new();
GET_STATE(self);
rb_hash_aset(result, ID2SYM(i_indent), rb_str_new(state->indent, state->indent_len));
rb_hash_aset(result, ID2SYM(i_space), rb_str_new(state->space, state->space_len));
rb_hash_aset(result, ID2SYM(i_space_before), rb_str_new(state->space_before, state->space_before_len));
rb_hash_aset(result, ID2SYM(i_object_nl), rb_str_new(state->object_nl, state->object_nl_len));
rb_hash_aset(result, ID2SYM(i_array_nl), rb_str_new(state->array_nl, state->array_nl_len));
rb_hash_aset(result, ID2SYM(i_allow_nan), state->allow_nan ? Qtrue : Qfalse);
rb_hash_aset(result, ID2SYM(i_ascii_only), state->ascii_only ? Qtrue : Qfalse);
rb_hash_aset(result, ID2SYM(i_quirks_mode), state->quirks_mode ? Qtrue : Qfalse);
rb_hash_aset(result, ID2SYM(i_max_nesting), LONG2FIX(state->max_nesting));
rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth));
rb_hash_aset(result, ID2SYM(i_buffer_initial_length), LONG2FIX(state->buffer_initial_length));
return result;
}
|