syntax = "proto3";

package xos;

import "google/protobuf/empty.proto";
import "annotations.proto";

message Xproto {
    string filename = 1;
    string contents = 2;
}

message DeclFile {
    string filename = 1;
    string contents = 2;
};

message AtticFile {
    string filename = 1;
    string contents = 2;
};

message APIConvenienceFile {
    string filename = 1;
    string contents = 2;
};

message LoadModelsRequest {
    string name = 1;
    string version = 2;
    repeated Xproto xprotos = 3;
    repeated DeclFile decls = 4;
    repeated AtticFile attics = 5;
    repeated APIConvenienceFile convenience_methods = 6;
};

message ListConvenienceMethodsReply {
    repeated APIConvenienceFile convenience_methods = 1;
}

message LoadModelsReply {
    enum LoadModelsStatus {
        SUCCESS = 0;
        ERROR = 1;
    }
    LoadModelsStatus status = 1;
};

message UnloadModelsRequest {
    string name = 1;
    string version = 2;
};

message ServiceModelStatus {
    string name = 1;
    string version = 2;
    string state = 3;
};

message LoadStatusReply {
    int32 model_status = 1;
    string model_output = 2;
    repeated ServiceModelStatus services = 3;
}

service dynamicload {
  rpc LoadModels(LoadModelsRequest) returns (LoadModelsReply) {
        option (googleapi.http) = {
            post: "/xosapi/v1/dynamicload/load_models"
            body: "*"
        };
  }
  rpc UnloadModels(UnloadModelsRequest) returns (LoadModelsReply) {
        option (googleapi.http) = {
            post: "/xosapi/v1/dynamicload/unload_models"
            body: "*"
        };
  }
  rpc GetLoadStatus(google.protobuf.Empty) returns (LoadStatusReply) {
        option (googleapi.http) = {
            get: "/xosapi/v1/dynamicload/load_status"
        };
  }
  rpc GetConvenienceMethods(google.protobuf.Empty) returns (ListConvenienceMethodsReply) {
        option (googleapi.http) = {
            // NOTE do we need to expose this via rest? maybe for debug...
            get: "/xosapi/v1/dynamicload/convenience_methods"
        };
  }
};
