syntax = "proto3";

package go.micro.registry;

service Registry {
	rpc GetService(GetRequest) returns (GetResponse) {};
	rpc Register(Service) returns (EmptyResponse) {};
	rpc Deregister(Service) returns (EmptyResponse) {};
	rpc ListServices(ListRequest) returns (ListResponse) {};
	rpc Watch(WatchRequest) returns (stream Result) {};
}

// Service represents a go-micro service
message Service {
	string name = 1;
	string version = 2;
	map<string,string> metadata = 3;
	repeated Endpoint endpoints = 4;
	repeated Node nodes = 5;
}

// Node represents the node the service is on
message Node {
	string id = 1;
	string address = 2;
	int64 port = 3;
	map<string,string> metadata = 4;
}

// Endpoint is a endpoint provided by a service
message Endpoint {
	string name = 1;
	Value request = 2;
	Value response = 3;
	map<string, string> metadata = 4;
}

// Value is an opaque value for a request or response
message Value {
	string name = 1;
	string type = 2;
	repeated Value values = 3;
}

// Result is returns by the watcher
message Result {
	string action = 1; // create, update, delete
	Service service = 2;
	int64 timestamp = 3; // unix timestamp
}

message EmptyResponse {}

message GetRequest {
	string service = 1;
}

message GetResponse {
	repeated Service services = 1;
}

message ListRequest {
	// TODO: filtering
}

message ListResponse {
	repeated Service services = 1;
}

message WatchRequest {
	// service is optional
	string service = 1;
}