syntax = "proto3";

package cosmos.orm.v1alpha1;

import "google/protobuf/descriptor.proto";

extend google.protobuf.MessageOptions {
  // module_schema is used to define the ORM schema for an app module.
  // All module config messages that use module_schema must also declare
  // themselves as app module config messages using the cosmos.app.v1.is_module
  // option.
  ModuleSchemaDescriptor module_schema = 104503792;
}

// ModuleSchemaDescriptor describe's a module's ORM schema.
message ModuleSchemaDescriptor {
  repeated FileEntry schema_file = 1;

  // FileEntry describes an ORM file used in a module.
  message FileEntry {
    // id is a prefix that will be varint encoded and prepended to all the
    // table keys specified in the file's tables.
    uint32 id = 1;

    // proto_file_name is the name of a file .proto in that contains
    // table definitions. The .proto file must be in a package that the
    // module has referenced using cosmos.app.v1.ModuleDescriptor.use_package.
    string proto_file_name = 2;

    // storage_type optionally indicates the type of storage this file's
    // tables should used. If it is left unspecified, the default KV-storage
    // of the app will be used.
    StorageType storage_type = 3;
  }

  // prefix is an optional prefix that precedes all keys in this module's
  // store.
  bytes prefix = 2;
}

// StorageType
enum StorageType {
  // STORAGE_TYPE_DEFAULT_UNSPECIFIED indicates the persistent
  // KV-storage where primary key entries are stored in merkle-tree
  // backed commitment storage and indexes and seqs are stored in
  // fast index storage. Note that the Cosmos SDK before store/v2alpha1
  // does not support this.
  STORAGE_TYPE_DEFAULT_UNSPECIFIED = 0;

  // STORAGE_TYPE_MEMORY indicates in-memory storage that will be
  // reloaded every time an app restarts. Tables with this type of storage
  // will by default be ignored when importing and exporting a module's
  // state from JSON.
  STORAGE_TYPE_MEMORY = 1;

  // STORAGE_TYPE_TRANSIENT indicates transient storage that is reset
  // at the end of every block. Tables with this type of storage
  // will by default be ignored when importing and exporting a module's
  // state from JSON.
  STORAGE_TYPE_TRANSIENT = 2;

  // STORAGE_TYPE_INDEX indicates persistent storage which is not backed
  // by a merkle-tree and won't affect the app hash. Note that the Cosmos SDK
  // before store/v2alpha1 does not support this.
  STORAGE_TYPE_INDEX = 3;

  // STORAGE_TYPE_INDEX indicates persistent storage which is backed by
  // a merkle-tree. With this type of storage, both primary and index keys
  // will affect the app hash and this is generally less efficient
  // than using STORAGE_TYPE_DEFAULT_UNSPECIFIED which separates index
  // keys into index storage. Note that modules built with the
  // Cosmos SDK before store/v2alpha1 must specify STORAGE_TYPE_COMMITMENT
  // instead of STORAGE_TYPE_DEFAULT_UNSPECIFIED or STORAGE_TYPE_INDEX
  // because this is the only type of persistent storage available.
  STORAGE_TYPE_COMMITMENT = 4;
}