module Google::Cloud::Core::GRPCUtils

def self.hash_to_struct hash

Other tags:
    Private: - Convert a Hash to a Google::Protobuf::Struct.
def self.hash_to_struct hash
  # TODO: ArgumentError if hash is not a Hash
  Google::Protobuf::Struct.new fields:
    Hash[hash.map { |k, v| [String(k), object_to_value(v)] }]
end

def self.map_to_hash map

Other tags:
    Private: - Convert a Google::Protobuf::Map to a Hash
def self.map_to_hash map
  if map.respond_to? :to_h
    map.to_h
  else
    # Enumerable doesn't have to_h on ruby 2.0...
    Hash[map.to_a]
  end
end

def self.object_to_value obj

Other tags:
    Private: - Convert an Object to a Google::Protobuf::Value.
def self.object_to_value obj
  case obj
  when String then Google::Protobuf::Value.new string_value: obj
  when Array then Google::Protobuf::ListValue.new(values:
    obj.map { |o| object_to_value(o) })
  when Hash then Google::Protobuf::Value.new struct_value:
    hash_to_struct(obj)
  when Numeric then Google::Protobuf::Value.new number_value: obj
  when TrueClass then Google::Protobuf::Value.new bool_value: true
  when FalseClass then Google::Protobuf::Value.new bool_value: false
  when NilClass then Google::Protobuf::Value.new null_value: :NULL_VALUE
  else
    # We could raise ArgumentError here, or we could convert to a string
    Google::Protobuf::Value.new string_value: obj.to_s
  end
end

def self.struct_to_hash struct

Other tags:
    Private: - Convert a Google::Protobuf::Struct to a Hash.
def self.struct_to_hash struct
  # TODO: ArgumentError if struct is not a Google::Protobuf::Struct
  Hash[struct.fields.map { |k, v| [k, value_to_object(v)] }]
end

def self.value_to_object value

Other tags:
    Private: - Convert a Google::Protobuf::Value to an Object.
def self.value_to_object value
  # TODO: ArgumentError if struct is not a Google::Protobuf::Value
  if value.null_value
    nil
  elsif value.number_value
    value.number_value
  elsif value.struct_value
    struct_to_hash value.struct_value
  elsif value.list_value
    value.list_value.values.map { |v| value_to_object(v) }
  elsif !value.bool_value.nil? # Make sure its a bool, not nil
    value.bool_value
  else
    nil # just in case
  end
end