module Cucumber::Messages::Message::Serialization

def prepare_value(value, camelize:, reject_nil_values:)

def prepare_value(value, camelize:, reject_nil_values:)
  return value.to_h(camelize: camelize, reject_nil_values: reject_nil_values) if value.is_a?(Cucumber::Messages::Message)
  return value.map { |v| prepare_value(v, camelize: camelize, reject_nil_values: reject_nil_values) } if value.is_a?(Array)
  value
end

def to_h(camelize: false, reject_nil_values: false)

def to_h(camelize: false, reject_nil_values: false)
  resulting_hash = self.instance_variables.map do |variable_name|
    h_key = variable_name[1..-1]
    h_key = Cucumber::Messages::Message.camelize(h_key) if camelize
    h_value = prepare_value(
      self.instance_variable_get(variable_name),
      camelize: camelize,
      reject_nil_values: reject_nil_values
    )
    [ h_key.to_sym, h_value ]
  end.to_h
  resulting_hash.reject! { |_, value| value.nil? } if reject_nil_values
  resulting_hash
end

def to_json

def to_json
  to_h(camelize: true, reject_nil_values: true).to_json
end