summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2014-11-22 15:20:17 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2014-11-22 15:20:17 -0800
commitfd2e17e64d6eded4b96fe09bfe376c401f720682 (patch)
tree58ce17c6106e2b547e7106bd0099733d6d8c1b07 /lib
parent9ad03a7b89c9fad16f677879da9d91275e997cfb (diff)
downloadffi-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.rb87
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