Module: Kaitai::Struct::Visualizer

Defined in:
lib/kaitai/struct/visualizer/version.rb,
lib/kaitai/struct/visualizer/obj_to_h.rb,
lib/kaitai/struct/visualizer/hex_viewer.rb,
lib/kaitai/struct/visualizer/visualizer.rb,
lib/kaitai/struct/visualizer/ksy_compiler.rb,
lib/kaitai/struct/visualizer/ks_error_matcher.rb,
lib/kaitai/struct/visualizer/parser.rb,
lib/kaitai/struct/visualizer/tree.rb,
lib/kaitai/struct/visualizer/node.rb

Defined Under Namespace

Classes: HexViewer, KSErrorMatcher, KSYCompiler, Node, Parser, Tree, Visualizer

Constant Summary collapse

VERSION =
'0.11'

Class Method Summary collapse

Class Method Details

.obj_to_h(obj) ⇒ Object

Recursively convert object received from Kaitai Struct to a hash. Used by ksdump to prepare data for JSON/XML/YAML output.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/kaitai/struct/visualizer/obj_to_h.rb', line 6

def self.obj_to_h(obj)
  if (obj == true) || (obj == false) || obj.is_a?(Numeric) || obj.nil?
    obj
  elsif obj.is_a?(Symbol)
    obj.to_s
  elsif obj.is_a?(String)
    if obj.encoding == Encoding::ASCII_8BIT
      r = +''
      obj.each_byte { |x| r << format('%02X ', x) }
      r.chop!
      r
    else
      obj.encode('UTF-8')
    end
  elsif obj.is_a?(Array)
    obj.map { |x| obj_to_h(x) }
  else
    return "OPAQUE (#{obj.class})" unless obj.is_a?(Kaitai::Struct::Struct)

    root = {}

    prop_meths = obj.public_methods(false)
    prop_meths.sort.each do |meth|
      k = meth.to_s
      next if (k.start_with?('_') && !k.start_with?('_unnamed')) || meth == :to_s

      el = obj.send(meth)
      v = obj_to_h(el)
      root[k] = v unless v.nil?
    end

    root
  end
end