Add stringMethodOptionsExtension
This helper function can be used on service methods to read options, which extend method options by a string. e.g. It is possible to read "Some string" for a custom `my_method_option.bar` message option extension. See: https://developers.google.com/protocol-buffers/docs/proto#customoptions on how to define a custom extension and referencing is by a fieldID. ``` service MyService { rpc MyMethod(RequestType) returns(ResponseType) { option (my_method_option.bar) = "Some string"; } } ``` If `my_method_option.bar` was defined for `fieldID: 50000` one can reference it using protoc-gen-template like: ``` {{- stringMethodOptionsExtension 50000 .method }} ```
This commit is contained in:
		| @@ -127,6 +127,7 @@ var ProtoHelpersFuncMap = template.FuncMap{ | ||||
| 	"trailingComment":              trailingComment, | ||||
| 	"leadingDetachedComments":      leadingDetachedComments, | ||||
| 	"stringFieldExtension":         stringFieldExtension, | ||||
| 	"stringMethodOptionsExtension": stringMethodOptionsExtension, | ||||
| 	"boolFieldExtension":           boolFieldExtension, | ||||
| 	"isFieldMap":                   isFieldMap, | ||||
| 	"fieldMapKeyType":              fieldMapKeyType, | ||||
| @@ -234,6 +235,46 @@ func leadingDetachedComments(i interface{}) []string { | ||||
| 	return loc.GetLeadingDetachedComments() | ||||
| } | ||||
|  | ||||
| // stringMethodOptionsExtension extracts method options of a string type. | ||||
| // To define your own extensions see: | ||||
| // https://developers.google.com/protocol-buffers/docs/proto#customoptions | ||||
| // Typically the fieldID of private extensions should be in the range: | ||||
| // 50000-99999 | ||||
| func stringMethodOptionsExtension(fieldID int32, f *descriptor.MethodDescriptorProto) string { | ||||
| 	if f == nil { | ||||
| 		return "" | ||||
| 	} | ||||
| 	if f.Options == nil { | ||||
| 		return "" | ||||
| 	} | ||||
| 	var extendedType *descriptor.MethodOptions | ||||
| 	var extensionType *string | ||||
|  | ||||
| 	eds := proto.RegisteredExtensions(f.Options) | ||||
| 	if eds[fieldID] == nil { | ||||
| 		ed := &proto.ExtensionDesc{ | ||||
| 			ExtendedType:  extendedType, | ||||
| 			ExtensionType: extensionType, | ||||
| 			Field:         fieldID, | ||||
| 			Tag:           fmt.Sprintf("bytes,%d", fieldID), | ||||
| 		} | ||||
| 		proto.RegisterExtension(ed) | ||||
| 		eds = proto.RegisteredExtensions(f.Options) | ||||
| 	} | ||||
|  | ||||
| 	ext, err := proto.GetExtension(f.Options, eds[fieldID]) | ||||
| 	if err != nil { | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	str, ok := ext.(*string) | ||||
| 	if !ok { | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	return *str | ||||
| } | ||||
|  | ||||
| func stringFieldExtension(fieldID int32, f *descriptor.FieldDescriptorProto) string { | ||||
| 	if f == nil { | ||||
| 		return "" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user