shao há 3 dias atrás
pai
commit
41a79e86f3

+ 41 - 0
dr_protocol_idl.proto

@@ -4,6 +4,8 @@ option go_package = "dr_protocol_pb/";
 
 package dr.protocol;
 
+import "google/protobuf/struct.proto"; // 导入用于处理 JSON 的 struct.proto
+
 message EmptyRequest {}
 
 service Basic {
@@ -21,6 +23,7 @@ service Protocol {
   rpc GetPatientType (PatientTypeRequest) returns (PatientTypeReply) {}
   rpc GetBodyPart (BodyPartRequest) returns (BodyPartReply) {}
   rpc GetProcedure (ProcedureRequest) returns (ProcedureReply) {}
+  rpc GetView (ViewRequest) returns (ViewReply) {}
 }
 
 message PatientTypeRequest {
@@ -102,4 +105,42 @@ message Procedure {
 
 message ProcedureReply {
   repeated Procedure procedure_list = 1;
+}
+
+message ViewRequest {
+  optional string patient_type = 1;
+  optional string body_part_id = 2;
+  optional string procedure_id = 3;
+  optional string modality = 4;
+  optional bool is_enabled = 5;
+  optional bool is_pre_install = 6;
+}
+
+message View {
+  string internal_id = 1;
+  string view_id = 2;
+  string view_name = 3;
+  string view_name_local = 4;
+  string view_other_name = 5;
+  string view_description = 6;
+  string view_position = 7;
+  string application = 8;
+  string anatomic_region = 9;
+  string patient_type_id = 10;
+  string body_part_id = 11;
+  string view_icon_name = 12;
+  string view_big_icon_name = 13;
+  string view_coach_name = 14;
+  string modality = 15;
+  google.protobuf.Struct config_object = 16;
+  string tech_template = 17;
+  string img_proc_template = 18;
+  int32 sort = 19;
+  bool is_enabled = 20;
+  string product = 21;
+  bool is_pre_install = 22;
+}
+
+message ViewReply {
+  repeated View view_list = 1;
 }

+ 414 - 19
dr_protocol_pb/dr_protocol_idl.pb.go

@@ -9,6 +9,7 @@ package dr_protocol_pb
 import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	structpb "google.golang.org/protobuf/types/known/structpb"
 	reflect "reflect"
 	sync "sync"
 	unsafe "unsafe"
@@ -873,11 +874,351 @@ func (x *ProcedureReply) GetProcedureList() []*Procedure {
 	return nil
 }
 
+type ViewRequest struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	PatientType   *string                `protobuf:"bytes,1,opt,name=patient_type,json=patientType,proto3,oneof" json:"patient_type,omitempty"`
+	BodyPartId    *string                `protobuf:"bytes,2,opt,name=body_part_id,json=bodyPartId,proto3,oneof" json:"body_part_id,omitempty"`
+	ProcedureId   *string                `protobuf:"bytes,3,opt,name=procedure_id,json=procedureId,proto3,oneof" json:"procedure_id,omitempty"`
+	Modality      *string                `protobuf:"bytes,4,opt,name=modality,proto3,oneof" json:"modality,omitempty"`
+	IsEnabled     *bool                  `protobuf:"varint,5,opt,name=is_enabled,json=isEnabled,proto3,oneof" json:"is_enabled,omitempty"`
+	IsPreInstall  *bool                  `protobuf:"varint,6,opt,name=is_pre_install,json=isPreInstall,proto3,oneof" json:"is_pre_install,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ViewRequest) Reset() {
+	*x = ViewRequest{}
+	mi := &file_dr_protocol_idl_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ViewRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ViewRequest) ProtoMessage() {}
+
+func (x *ViewRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_dr_protocol_idl_proto_msgTypes[11]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ViewRequest.ProtoReflect.Descriptor instead.
+func (*ViewRequest) Descriptor() ([]byte, []int) {
+	return file_dr_protocol_idl_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *ViewRequest) GetPatientType() string {
+	if x != nil && x.PatientType != nil {
+		return *x.PatientType
+	}
+	return ""
+}
+
+func (x *ViewRequest) GetBodyPartId() string {
+	if x != nil && x.BodyPartId != nil {
+		return *x.BodyPartId
+	}
+	return ""
+}
+
+func (x *ViewRequest) GetProcedureId() string {
+	if x != nil && x.ProcedureId != nil {
+		return *x.ProcedureId
+	}
+	return ""
+}
+
+func (x *ViewRequest) GetModality() string {
+	if x != nil && x.Modality != nil {
+		return *x.Modality
+	}
+	return ""
+}
+
+func (x *ViewRequest) GetIsEnabled() bool {
+	if x != nil && x.IsEnabled != nil {
+		return *x.IsEnabled
+	}
+	return false
+}
+
+func (x *ViewRequest) GetIsPreInstall() bool {
+	if x != nil && x.IsPreInstall != nil {
+		return *x.IsPreInstall
+	}
+	return false
+}
+
+type View struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	InternalId      string                 `protobuf:"bytes,1,opt,name=internal_id,json=internalId,proto3" json:"internal_id,omitempty"`
+	ViewId          string                 `protobuf:"bytes,2,opt,name=view_id,json=viewId,proto3" json:"view_id,omitempty"`
+	ViewName        string                 `protobuf:"bytes,3,opt,name=view_name,json=viewName,proto3" json:"view_name,omitempty"`
+	ViewNameLocal   string                 `protobuf:"bytes,4,opt,name=view_name_local,json=viewNameLocal,proto3" json:"view_name_local,omitempty"`
+	ViewOtherName   string                 `protobuf:"bytes,5,opt,name=view_other_name,json=viewOtherName,proto3" json:"view_other_name,omitempty"`
+	ViewDescription string                 `protobuf:"bytes,6,opt,name=view_description,json=viewDescription,proto3" json:"view_description,omitempty"`
+	ViewPosition    string                 `protobuf:"bytes,7,opt,name=view_position,json=viewPosition,proto3" json:"view_position,omitempty"`
+	Application     string                 `protobuf:"bytes,8,opt,name=application,proto3" json:"application,omitempty"`
+	AnatomicRegion  string                 `protobuf:"bytes,9,opt,name=anatomic_region,json=anatomicRegion,proto3" json:"anatomic_region,omitempty"`
+	PatientTypeId   string                 `protobuf:"bytes,10,opt,name=patient_type_id,json=patientTypeId,proto3" json:"patient_type_id,omitempty"`
+	BodyPartId      string                 `protobuf:"bytes,11,opt,name=body_part_id,json=bodyPartId,proto3" json:"body_part_id,omitempty"`
+	ViewIconName    string                 `protobuf:"bytes,12,opt,name=view_icon_name,json=viewIconName,proto3" json:"view_icon_name,omitempty"`
+	ViewBigIconName string                 `protobuf:"bytes,13,opt,name=view_big_icon_name,json=viewBigIconName,proto3" json:"view_big_icon_name,omitempty"`
+	ViewCoachName   string                 `protobuf:"bytes,14,opt,name=view_coach_name,json=viewCoachName,proto3" json:"view_coach_name,omitempty"`
+	Modality        string                 `protobuf:"bytes,15,opt,name=modality,proto3" json:"modality,omitempty"`
+	ConfigObject    *structpb.Struct       `protobuf:"bytes,16,opt,name=config_object,json=configObject,proto3" json:"config_object,omitempty"`
+	TechTemplate    string                 `protobuf:"bytes,17,opt,name=tech_template,json=techTemplate,proto3" json:"tech_template,omitempty"`
+	ImgProcTemplate string                 `protobuf:"bytes,18,opt,name=img_proc_template,json=imgProcTemplate,proto3" json:"img_proc_template,omitempty"`
+	Sort            int32                  `protobuf:"varint,19,opt,name=sort,proto3" json:"sort,omitempty"`
+	IsEnabled       bool                   `protobuf:"varint,20,opt,name=is_enabled,json=isEnabled,proto3" json:"is_enabled,omitempty"`
+	Product         string                 `protobuf:"bytes,21,opt,name=product,proto3" json:"product,omitempty"`
+	IsPreInstall    bool                   `protobuf:"varint,22,opt,name=is_pre_install,json=isPreInstall,proto3" json:"is_pre_install,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *View) Reset() {
+	*x = View{}
+	mi := &file_dr_protocol_idl_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *View) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*View) ProtoMessage() {}
+
+func (x *View) ProtoReflect() protoreflect.Message {
+	mi := &file_dr_protocol_idl_proto_msgTypes[12]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use View.ProtoReflect.Descriptor instead.
+func (*View) Descriptor() ([]byte, []int) {
+	return file_dr_protocol_idl_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *View) GetInternalId() string {
+	if x != nil {
+		return x.InternalId
+	}
+	return ""
+}
+
+func (x *View) GetViewId() string {
+	if x != nil {
+		return x.ViewId
+	}
+	return ""
+}
+
+func (x *View) GetViewName() string {
+	if x != nil {
+		return x.ViewName
+	}
+	return ""
+}
+
+func (x *View) GetViewNameLocal() string {
+	if x != nil {
+		return x.ViewNameLocal
+	}
+	return ""
+}
+
+func (x *View) GetViewOtherName() string {
+	if x != nil {
+		return x.ViewOtherName
+	}
+	return ""
+}
+
+func (x *View) GetViewDescription() string {
+	if x != nil {
+		return x.ViewDescription
+	}
+	return ""
+}
+
+func (x *View) GetViewPosition() string {
+	if x != nil {
+		return x.ViewPosition
+	}
+	return ""
+}
+
+func (x *View) GetApplication() string {
+	if x != nil {
+		return x.Application
+	}
+	return ""
+}
+
+func (x *View) GetAnatomicRegion() string {
+	if x != nil {
+		return x.AnatomicRegion
+	}
+	return ""
+}
+
+func (x *View) GetPatientTypeId() string {
+	if x != nil {
+		return x.PatientTypeId
+	}
+	return ""
+}
+
+func (x *View) GetBodyPartId() string {
+	if x != nil {
+		return x.BodyPartId
+	}
+	return ""
+}
+
+func (x *View) GetViewIconName() string {
+	if x != nil {
+		return x.ViewIconName
+	}
+	return ""
+}
+
+func (x *View) GetViewBigIconName() string {
+	if x != nil {
+		return x.ViewBigIconName
+	}
+	return ""
+}
+
+func (x *View) GetViewCoachName() string {
+	if x != nil {
+		return x.ViewCoachName
+	}
+	return ""
+}
+
+func (x *View) GetModality() string {
+	if x != nil {
+		return x.Modality
+	}
+	return ""
+}
+
+func (x *View) GetConfigObject() *structpb.Struct {
+	if x != nil {
+		return x.ConfigObject
+	}
+	return nil
+}
+
+func (x *View) GetTechTemplate() string {
+	if x != nil {
+		return x.TechTemplate
+	}
+	return ""
+}
+
+func (x *View) GetImgProcTemplate() string {
+	if x != nil {
+		return x.ImgProcTemplate
+	}
+	return ""
+}
+
+func (x *View) GetSort() int32 {
+	if x != nil {
+		return x.Sort
+	}
+	return 0
+}
+
+func (x *View) GetIsEnabled() bool {
+	if x != nil {
+		return x.IsEnabled
+	}
+	return false
+}
+
+func (x *View) GetProduct() string {
+	if x != nil {
+		return x.Product
+	}
+	return ""
+}
+
+func (x *View) GetIsPreInstall() bool {
+	if x != nil {
+		return x.IsPreInstall
+	}
+	return false
+}
+
+type ViewReply struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	ViewList      []*View                `protobuf:"bytes,1,rep,name=view_list,json=viewList,proto3" json:"view_list,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *ViewReply) Reset() {
+	*x = ViewReply{}
+	mi := &file_dr_protocol_idl_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ViewReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ViewReply) ProtoMessage() {}
+
+func (x *ViewReply) ProtoReflect() protoreflect.Message {
+	mi := &file_dr_protocol_idl_proto_msgTypes[13]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ViewReply.ProtoReflect.Descriptor instead.
+func (*ViewReply) Descriptor() ([]byte, []int) {
+	return file_dr_protocol_idl_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *ViewReply) GetViewList() []*View {
+	if x != nil {
+		return x.ViewList
+	}
+	return nil
+}
+
 var File_dr_protocol_idl_proto protoreflect.FileDescriptor
 
 const file_dr_protocol_idl_proto_rawDesc = "" +
 	"\n" +
-	"\x15dr_protocol_idl.proto\x12\vdr.protocol\"\x0e\n" +
+	"\x15dr_protocol_idl.proto\x12\vdr.protocol\x1a\x1cgoogle/protobuf/struct.proto\"\x0e\n" +
 	"\fEmptyRequest\"o\n" +
 	"\x11SoftwareInfoReply\x12\x16\n" +
 	"\x06module\x18\x01 \x01(\tR\x06module\x12\x12\n" +
@@ -968,13 +1309,58 @@ const file_dr_protocol_idl_proto_rawDesc = "" +
 	"\aproduct\x18\x12 \x01(\tR\aproduct\x12$\n" +
 	"\x0eis_pre_install\x18\x13 \x01(\bR\fisPreInstall\"O\n" +
 	"\x0eProcedureReply\x12=\n" +
-	"\x0eprocedure_list\x18\x01 \x03(\v2\x16.dr.protocol.ProcedureR\rprocedureList2T\n" +
+	"\x0eprocedure_list\x18\x01 \x03(\v2\x16.dr.protocol.ProcedureR\rprocedureList\"\xd6\x02\n" +
+	"\vViewRequest\x12&\n" +
+	"\fpatient_type\x18\x01 \x01(\tH\x00R\vpatientType\x88\x01\x01\x12%\n" +
+	"\fbody_part_id\x18\x02 \x01(\tH\x01R\n" +
+	"bodyPartId\x88\x01\x01\x12&\n" +
+	"\fprocedure_id\x18\x03 \x01(\tH\x02R\vprocedureId\x88\x01\x01\x12\x1f\n" +
+	"\bmodality\x18\x04 \x01(\tH\x03R\bmodality\x88\x01\x01\x12\"\n" +
+	"\n" +
+	"is_enabled\x18\x05 \x01(\bH\x04R\tisEnabled\x88\x01\x01\x12)\n" +
+	"\x0eis_pre_install\x18\x06 \x01(\bH\x05R\fisPreInstall\x88\x01\x01B\x0f\n" +
+	"\r_patient_typeB\x0f\n" +
+	"\r_body_part_idB\x0f\n" +
+	"\r_procedure_idB\v\n" +
+	"\t_modalityB\r\n" +
+	"\v_is_enabledB\x11\n" +
+	"\x0f_is_pre_install\"\xab\x06\n" +
+	"\x04View\x12\x1f\n" +
+	"\vinternal_id\x18\x01 \x01(\tR\n" +
+	"internalId\x12\x17\n" +
+	"\aview_id\x18\x02 \x01(\tR\x06viewId\x12\x1b\n" +
+	"\tview_name\x18\x03 \x01(\tR\bviewName\x12&\n" +
+	"\x0fview_name_local\x18\x04 \x01(\tR\rviewNameLocal\x12&\n" +
+	"\x0fview_other_name\x18\x05 \x01(\tR\rviewOtherName\x12)\n" +
+	"\x10view_description\x18\x06 \x01(\tR\x0fviewDescription\x12#\n" +
+	"\rview_position\x18\a \x01(\tR\fviewPosition\x12 \n" +
+	"\vapplication\x18\b \x01(\tR\vapplication\x12'\n" +
+	"\x0fanatomic_region\x18\t \x01(\tR\x0eanatomicRegion\x12&\n" +
+	"\x0fpatient_type_id\x18\n" +
+	" \x01(\tR\rpatientTypeId\x12 \n" +
+	"\fbody_part_id\x18\v \x01(\tR\n" +
+	"bodyPartId\x12$\n" +
+	"\x0eview_icon_name\x18\f \x01(\tR\fviewIconName\x12+\n" +
+	"\x12view_big_icon_name\x18\r \x01(\tR\x0fviewBigIconName\x12&\n" +
+	"\x0fview_coach_name\x18\x0e \x01(\tR\rviewCoachName\x12\x1a\n" +
+	"\bmodality\x18\x0f \x01(\tR\bmodality\x12<\n" +
+	"\rconfig_object\x18\x10 \x01(\v2\x17.google.protobuf.StructR\fconfigObject\x12#\n" +
+	"\rtech_template\x18\x11 \x01(\tR\ftechTemplate\x12*\n" +
+	"\x11img_proc_template\x18\x12 \x01(\tR\x0fimgProcTemplate\x12\x12\n" +
+	"\x04sort\x18\x13 \x01(\x05R\x04sort\x12\x1d\n" +
+	"\n" +
+	"is_enabled\x18\x14 \x01(\bR\tisEnabled\x12\x18\n" +
+	"\aproduct\x18\x15 \x01(\tR\aproduct\x12$\n" +
+	"\x0eis_pre_install\x18\x16 \x01(\bR\fisPreInstall\";\n" +
+	"\tViewReply\x12.\n" +
+	"\tview_list\x18\x01 \x03(\v2\x11.dr.protocol.ViewR\bviewList2T\n" +
 	"\x05Basic\x12K\n" +
-	"\fSoftwareInfo\x12\x19.dr.protocol.EmptyRequest\x1a\x1e.dr.protocol.SoftwareInfoReply\"\x002\xf7\x01\n" +
+	"\fSoftwareInfo\x12\x19.dr.protocol.EmptyRequest\x1a\x1e.dr.protocol.SoftwareInfoReply\"\x002\xb6\x02\n" +
 	"\bProtocol\x12R\n" +
 	"\x0eGetPatientType\x12\x1f.dr.protocol.PatientTypeRequest\x1a\x1d.dr.protocol.PatientTypeReply\"\x00\x12I\n" +
 	"\vGetBodyPart\x12\x1c.dr.protocol.BodyPartRequest\x1a\x1a.dr.protocol.BodyPartReply\"\x00\x12L\n" +
-	"\fGetProcedure\x12\x1d.dr.protocol.ProcedureRequest\x1a\x1b.dr.protocol.ProcedureReply\"\x00B\x11Z\x0fdr_protocol_pb/b\x06proto3"
+	"\fGetProcedure\x12\x1d.dr.protocol.ProcedureRequest\x1a\x1b.dr.protocol.ProcedureReply\"\x00\x12=\n" +
+	"\aGetView\x12\x18.dr.protocol.ViewRequest\x1a\x16.dr.protocol.ViewReply\"\x00B\x11Z\x0fdr_protocol_pb/b\x06proto3"
 
 var (
 	file_dr_protocol_idl_proto_rawDescOnce sync.Once
@@ -988,7 +1374,7 @@ func file_dr_protocol_idl_proto_rawDescGZIP() []byte {
 	return file_dr_protocol_idl_proto_rawDescData
 }
 
-var file_dr_protocol_idl_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
+var file_dr_protocol_idl_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
 var file_dr_protocol_idl_proto_goTypes = []any{
 	(*EmptyRequest)(nil),       // 0: dr.protocol.EmptyRequest
 	(*SoftwareInfoReply)(nil),  // 1: dr.protocol.SoftwareInfoReply
@@ -1001,24 +1387,32 @@ var file_dr_protocol_idl_proto_goTypes = []any{
 	(*ProcedureRequest)(nil),   // 8: dr.protocol.ProcedureRequest
 	(*Procedure)(nil),          // 9: dr.protocol.Procedure
 	(*ProcedureReply)(nil),     // 10: dr.protocol.ProcedureReply
+	(*ViewRequest)(nil),        // 11: dr.protocol.ViewRequest
+	(*View)(nil),               // 12: dr.protocol.View
+	(*ViewReply)(nil),          // 13: dr.protocol.ViewReply
+	(*structpb.Struct)(nil),    // 14: google.protobuf.Struct
 }
 var file_dr_protocol_idl_proto_depIdxs = []int32{
 	3,  // 0: dr.protocol.PatientTypeReply.patient_type_list:type_name -> dr.protocol.PatientType
 	6,  // 1: dr.protocol.BodyPartReply.body_part_list:type_name -> dr.protocol.BodyPart
 	9,  // 2: dr.protocol.ProcedureReply.procedure_list:type_name -> dr.protocol.Procedure
-	0,  // 3: dr.protocol.Basic.SoftwareInfo:input_type -> dr.protocol.EmptyRequest
-	2,  // 4: dr.protocol.Protocol.GetPatientType:input_type -> dr.protocol.PatientTypeRequest
-	5,  // 5: dr.protocol.Protocol.GetBodyPart:input_type -> dr.protocol.BodyPartRequest
-	8,  // 6: dr.protocol.Protocol.GetProcedure:input_type -> dr.protocol.ProcedureRequest
-	1,  // 7: dr.protocol.Basic.SoftwareInfo:output_type -> dr.protocol.SoftwareInfoReply
-	4,  // 8: dr.protocol.Protocol.GetPatientType:output_type -> dr.protocol.PatientTypeReply
-	7,  // 9: dr.protocol.Protocol.GetBodyPart:output_type -> dr.protocol.BodyPartReply
-	10, // 10: dr.protocol.Protocol.GetProcedure:output_type -> dr.protocol.ProcedureReply
-	7,  // [7:11] is the sub-list for method output_type
-	3,  // [3:7] is the sub-list for method input_type
-	3,  // [3:3] is the sub-list for extension type_name
-	3,  // [3:3] is the sub-list for extension extendee
-	0,  // [0:3] is the sub-list for field type_name
+	14, // 3: dr.protocol.View.config_object:type_name -> google.protobuf.Struct
+	12, // 4: dr.protocol.ViewReply.view_list:type_name -> dr.protocol.View
+	0,  // 5: dr.protocol.Basic.SoftwareInfo:input_type -> dr.protocol.EmptyRequest
+	2,  // 6: dr.protocol.Protocol.GetPatientType:input_type -> dr.protocol.PatientTypeRequest
+	5,  // 7: dr.protocol.Protocol.GetBodyPart:input_type -> dr.protocol.BodyPartRequest
+	8,  // 8: dr.protocol.Protocol.GetProcedure:input_type -> dr.protocol.ProcedureRequest
+	11, // 9: dr.protocol.Protocol.GetView:input_type -> dr.protocol.ViewRequest
+	1,  // 10: dr.protocol.Basic.SoftwareInfo:output_type -> dr.protocol.SoftwareInfoReply
+	4,  // 11: dr.protocol.Protocol.GetPatientType:output_type -> dr.protocol.PatientTypeReply
+	7,  // 12: dr.protocol.Protocol.GetBodyPart:output_type -> dr.protocol.BodyPartReply
+	10, // 13: dr.protocol.Protocol.GetProcedure:output_type -> dr.protocol.ProcedureReply
+	13, // 14: dr.protocol.Protocol.GetView:output_type -> dr.protocol.ViewReply
+	10, // [10:15] is the sub-list for method output_type
+	5,  // [5:10] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
 }
 
 func init() { file_dr_protocol_idl_proto_init() }
@@ -1029,13 +1423,14 @@ func file_dr_protocol_idl_proto_init() {
 	file_dr_protocol_idl_proto_msgTypes[2].OneofWrappers = []any{}
 	file_dr_protocol_idl_proto_msgTypes[5].OneofWrappers = []any{}
 	file_dr_protocol_idl_proto_msgTypes[8].OneofWrappers = []any{}
+	file_dr_protocol_idl_proto_msgTypes[11].OneofWrappers = []any{}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: unsafe.Slice(unsafe.StringData(file_dr_protocol_idl_proto_rawDesc), len(file_dr_protocol_idl_proto_rawDesc)),
 			NumEnums:      0,
-			NumMessages:   11,
+			NumMessages:   14,
 			NumExtensions: 0,
 			NumServices:   2,
 		},

+ 38 - 0
dr_protocol_pb/dr_protocol_idl_grpc.pb.go

@@ -124,6 +124,7 @@ const (
 	Protocol_GetPatientType_FullMethodName = "/dr.protocol.Protocol/GetPatientType"
 	Protocol_GetBodyPart_FullMethodName    = "/dr.protocol.Protocol/GetBodyPart"
 	Protocol_GetProcedure_FullMethodName   = "/dr.protocol.Protocol/GetProcedure"
+	Protocol_GetView_FullMethodName        = "/dr.protocol.Protocol/GetView"
 )
 
 // ProtocolClient is the client API for Protocol service.
@@ -133,6 +134,7 @@ type ProtocolClient interface {
 	GetPatientType(ctx context.Context, in *PatientTypeRequest, opts ...grpc.CallOption) (*PatientTypeReply, error)
 	GetBodyPart(ctx context.Context, in *BodyPartRequest, opts ...grpc.CallOption) (*BodyPartReply, error)
 	GetProcedure(ctx context.Context, in *ProcedureRequest, opts ...grpc.CallOption) (*ProcedureReply, error)
+	GetView(ctx context.Context, in *ViewRequest, opts ...grpc.CallOption) (*ViewReply, error)
 }
 
 type protocolClient struct {
@@ -173,6 +175,16 @@ func (c *protocolClient) GetProcedure(ctx context.Context, in *ProcedureRequest,
 	return out, nil
 }
 
+func (c *protocolClient) GetView(ctx context.Context, in *ViewRequest, opts ...grpc.CallOption) (*ViewReply, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(ViewReply)
+	err := c.cc.Invoke(ctx, Protocol_GetView_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // ProtocolServer is the server API for Protocol service.
 // All implementations must embed UnimplementedProtocolServer
 // for forward compatibility.
@@ -180,6 +192,7 @@ type ProtocolServer interface {
 	GetPatientType(context.Context, *PatientTypeRequest) (*PatientTypeReply, error)
 	GetBodyPart(context.Context, *BodyPartRequest) (*BodyPartReply, error)
 	GetProcedure(context.Context, *ProcedureRequest) (*ProcedureReply, error)
+	GetView(context.Context, *ViewRequest) (*ViewReply, error)
 	mustEmbedUnimplementedProtocolServer()
 }
 
@@ -199,6 +212,9 @@ func (UnimplementedProtocolServer) GetBodyPart(context.Context, *BodyPartRequest
 func (UnimplementedProtocolServer) GetProcedure(context.Context, *ProcedureRequest) (*ProcedureReply, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetProcedure not implemented")
 }
+func (UnimplementedProtocolServer) GetView(context.Context, *ViewRequest) (*ViewReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetView not implemented")
+}
 func (UnimplementedProtocolServer) mustEmbedUnimplementedProtocolServer() {}
 func (UnimplementedProtocolServer) testEmbeddedByValue()                  {}
 
@@ -274,6 +290,24 @@ func _Protocol_GetProcedure_Handler(srv interface{}, ctx context.Context, dec fu
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Protocol_GetView_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ViewRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(ProtocolServer).GetView(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: Protocol_GetView_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(ProtocolServer).GetView(ctx, req.(*ViewRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // Protocol_ServiceDesc is the grpc.ServiceDesc for Protocol service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -293,6 +327,10 @@ var Protocol_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "GetProcedure",
 			Handler:    _Protocol_GetProcedure_Handler,
 		},
+		{
+			MethodName: "GetView",
+			Handler:    _Protocol_GetView_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "dr_protocol_idl.proto",