class Scale::Types::MetadataV5ModuleStorage

Public Class Methods

decode(scale_bytes) click to toggle source
# File lib/metadata/metadata_v5.rb, line 86
def self.decode(scale_bytes)
  name = String.decode(scale_bytes).value
  modifier_enum = {
    "type" => "enum",
    "value_list" => ["Optional", "Default"]
  }
  modifier = Scale::Types.get(modifier_enum).decode(scale_bytes).value
  result = {
    name: name,
    modifier: modifier
  }

  storage_function_type_enum = {
    "type" => "enum",
    "value_list" => %w[Plain Map DoubleMap]
  }
  storage_function_type = Scale::Types.get(storage_function_type_enum).decode(scale_bytes).value
  if storage_function_type == "Plain"
    result[:type] = {
      Plain: String.decode(scale_bytes).value
    }
  elsif storage_function_type == "Map"
    result[:type] = {
      Map: {
        hasher: StorageHasher.decode(scale_bytes).value,
        key: String.decode(scale_bytes).value,
        value: String.decode(scale_bytes).value,
        linked: Bool.decode(scale_bytes).value
      }
    }
  elsif storage_function_type == "DoubleMap"
    result[:type] = {
      DoubleMap: {
        hasher: StorageHasher.decode(scale_bytes).value,
        key1: String.decode(scale_bytes).value,
        key2: String.decode(scale_bytes).value,
        value: String.decode(scale_bytes).value,
        key2Hasher: StorageHasher.decode(scale_bytes).value
      }
    }
  end

  result[:fallback] = Hex.decode(scale_bytes).value
  result[:documentation] = Scale::Types.get("Vec<String>").decode(scale_bytes).value.map(&:value)

  MetadataV5ModuleStorage.new(result)
end