mirror of
https://github.com/ruby/ruby.git
synced 2025-08-25 22:14:37 +02:00

While less nice, this open the door to eluding the State object
allocation when possible.
5c0d428d4c
105 lines
3.2 KiB
Ruby
105 lines
3.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module JSON
|
|
module Ext
|
|
module Generator
|
|
class State
|
|
# call-seq: new(opts = {})
|
|
#
|
|
# 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.
|
|
# * *ascii_only*: true if only ASCII characters should be generated. This
|
|
# option defaults to false.
|
|
# * *buffer_initial_length*: sets the initial length of the generator's
|
|
# internal buffer.
|
|
def initialize(opts = nil)
|
|
if opts && !opts.empty?
|
|
configure(opts)
|
|
end
|
|
end
|
|
|
|
# call-seq: configure(opts)
|
|
#
|
|
# Configure this State instance with the Hash _opts_, and return
|
|
# itself.
|
|
def configure(opts)
|
|
unless opts.is_a?(Hash)
|
|
if opts.respond_to?(:to_hash)
|
|
opts = opts.to_hash
|
|
elsif opts.respond_to?(:to_h)
|
|
opts = opts.to_h
|
|
else
|
|
raise TypeError, "can't convert #{opts.class} into Hash"
|
|
end
|
|
end
|
|
_configure(opts)
|
|
end
|
|
|
|
alias_method :merge, :configure
|
|
|
|
# call-seq: to_h
|
|
#
|
|
# Returns the configuration instance variables as a hash, that can be
|
|
# passed to the configure method.
|
|
def to_h
|
|
result = {
|
|
indent: indent,
|
|
space: space,
|
|
space_before: space_before,
|
|
object_nl: object_nl,
|
|
array_nl: array_nl,
|
|
allow_nan: allow_nan?,
|
|
ascii_only: ascii_only?,
|
|
max_nesting: max_nesting,
|
|
script_safe: script_safe?,
|
|
strict: strict?,
|
|
depth: depth,
|
|
buffer_initial_length: buffer_initial_length,
|
|
}
|
|
|
|
instance_variables.each do |iv|
|
|
iv = iv.to_s[1..-1]
|
|
result[iv.to_sym] = self[iv]
|
|
end
|
|
|
|
result
|
|
end
|
|
|
|
alias_method :to_hash, :to_h
|
|
|
|
# call-seq: [](name)
|
|
#
|
|
# Returns the value returned by method +name+.
|
|
def [](name)
|
|
if respond_to?(name)
|
|
__send__(name)
|
|
else
|
|
instance_variable_get("@#{name}") if
|
|
instance_variables.include?("@#{name}".to_sym) # avoid warning
|
|
end
|
|
end
|
|
|
|
# call-seq: []=(name, value)
|
|
#
|
|
# Sets the attribute name to value.
|
|
def []=(name, value)
|
|
if respond_to?(name_writer = "#{name}=")
|
|
__send__ name_writer, value
|
|
else
|
|
instance_variable_set "@#{name}", value
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|