/*
 * -------------------------------------------------------------------
 * lasp.proto: Protocol buffers for Lasp
 * -------------------------------------------------------------------
 *
 * NOTE: IMPORTANT
 * Any change to the definitions in this file REQUIRES recompiling the erlang
 * protobuffer source code using the rebar3 gpb plugin. Also, be sure to commit
 * all the changed source files along with the modified version of this file!
 */
syntax = "proto3";

message req {
  oneof u {
    opget get = 1;
    opupdate put = 2;
  }
}

message opget {
  required string key = 1;
  required string type = 2;
}

message opupdate {
  required opget k = 1;
  required entry e = 2;
  required string actor = 3;
}

message entry {
  oneof u {
    int64  int = 1;
    string str = 2;
    string atm = 3;
    list   list = 4;
    pair    ii = 5;
    triple  iii = 6;
    quad    iv = 7;
  }
}

// for encoding multiple operations in a single entry
// useful for adding multiple values to sets and maps
message list {
  repeated entry elems = 1;
}

// for set operations (e.g. {add, Value})
message pair {
  required entry a = 1;
  required entry b = 2;
}

// for set operations (e.g. {set, TimeStamp, Value})
message triple {
  required entry a = 1;
  required entry b = 2;
  required entry c = 3;
}

// for map operations (e.g. {apply, Key, KeyType, Op})
message quad {
  required entry a = 1;
  required entry b = 2;
  required entry c = 3;
  required entry d = 4;
}

// CRDT state messages

message reqresp {
  oneof v {
    string error = 1;
    valcounter ctr = 2;
    valset set = 3;
    valmap map = 4;
    valreg reg = 5;
    bool success = 6; // responding to update operations
  }
}

message valcounter {
  required int64 val = 1;
}

message valset {
  repeated string elems = 1;
}

message valmap {
  repeated mapentry entries = 1;
}

message valreg {
  required string val = 1;
}

message mapentry {
  required string key = 1;
  required string ktype = 2;
  required mapfield val = 3;
}

message mapfield {
  oneof v {
    valcounter ctr = 1;
    valset set = 2;
    valmap map = 3;
    valreg reg = 4;
  }
}
