diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2014-11-22 15:20:17 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2014-11-22 15:20:17 -0800 |
commit | fd2e17e64d6eded4b96fe09bfe376c401f720682 (patch) | |
tree | 58ce17c6106e2b547e7106bd0099733d6d8c1b07 /lib | |
parent | 9ad03a7b89c9fad16f677879da9d91275e997cfb (diff) | |
download | ffi-yajl-fd2e17e64d6eded4b96fe09bfe376c401f720682.tar.gz |
support calling #to_s on all types for keys
compatibility with JSON gem and yajl-ruby
closes #14
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ffi_yajl/ffi/encoder.rb | 87 |
1 files changed, 61 insertions, 26 deletions
diff --git a/lib/ffi_yajl/ffi/encoder.rb b/lib/ffi_yajl/ffi/encoder.rb index 8177f5f..add35f6 100644 --- a/lib/ffi_yajl/ffi/encoder.rb +++ b/lib/ffi_yajl/ffi/encoder.rb @@ -46,56 +46,91 @@ end class Hash def ffi_yajl(yajl_gen, state) - if ( status = FFI_Yajl.yajl_gen_map_open(yajl_gen) ) != 0 - FFI_Yajl::Encoder.raise_error_for_status(status) - end - self.each do |key, value| - # Perf Fix: mutate state hash rather than creating new copy - state[:processing_key] = true - key.ffi_yajl(yajl_gen, state) - state[:processing_key] = false - value.ffi_yajl(yajl_gen, state) - end - if ( status = FFI_Yajl.yajl_gen_map_close(yajl_gen) ) != 0 - FFI_Yajl::Encoder.raise_error_for_status(status) + if state[:processing_key] + str = self.to_s + if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end + else + if ( status = FFI_Yajl.yajl_gen_map_open(yajl_gen) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end + self.each do |key, value| + # Perf Fix: mutate state hash rather than creating new copy + state[:processing_key] = true + key.ffi_yajl(yajl_gen, state) + state[:processing_key] = false + value.ffi_yajl(yajl_gen, state) + end + if ( status = FFI_Yajl.yajl_gen_map_close(yajl_gen) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end end end end class Array def ffi_yajl(yajl_gen, state) - if ( status = FFI_Yajl.yajl_gen_array_open(yajl_gen) ) != 0 - FFI_Yajl::Encoder.raise_error_for_status(status) - end - self.each do |value| - value.ffi_yajl(yajl_gen, state) - end - if ( status = FFI_Yajl.yajl_gen_array_close(yajl_gen) ) != 0 - FFI_Yajl::Encoder.raise_error_for_status(status) + if state[:processing_key] + str = self.to_s + if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end + else + if ( status = FFI_Yajl.yajl_gen_array_open(yajl_gen) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end + self.each do |value| + value.ffi_yajl(yajl_gen, state) + end + if ( status = FFI_Yajl.yajl_gen_array_close(yajl_gen) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end end end end class NilClass def ffi_yajl(yajl_gen, state) - if ( status = FFI_Yajl.yajl_gen_null(yajl_gen) ) != 0 - FFI_Yajl::Encoder.raise_error_for_status(status) + if state[:processing_key] + str = self.to_s + if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end + else + if ( status = FFI_Yajl.yajl_gen_null(yajl_gen) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end end end end class TrueClass def ffi_yajl(yajl_gen, state) - if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 1) ) != 0 - FFI_Yajl::Encoder.raise_error_for_status(status) + if state[:processing_key] + str = self.to_s + if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end + else + if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 1) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end end end end class FalseClass def ffi_yajl(yajl_gen, state) - if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 0) ) != 0 - FFI_Yajl::Encoder.raise_error_for_status(status) + if state[:processing_key] + str = self.to_s + if ( status = FFI_Yajl.yajl_gen_string(yajl_gen, str, str.bytesize) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end + else + if ( status = FFI_Yajl.yajl_gen_bool(yajl_gen, 0) ) != 0 + FFI_Yajl::Encoder.raise_error_for_status(status) + end end end end |