-
Notifications
You must be signed in to change notification settings - Fork 8.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FAB-4103] Proto translator variably opaque comp
The proto translation framework introduced in FAB-4100 needs to be applied to messages with opaque fields. This is one of the key goals of proto translation, which prevents the protos as defined from being human readable. This CR adds a variably opaque proto msg handler to the proto translation framework. Documented further in api.go, but variably opaque fields differ from statically opaque ones, in that variably oapque fields may depend upon the contents of the proto being populated to determine type information at runtime and will be evaluated after the static ones. Change-Id: Iacbba1316f8e82dee68695aa98bf4c30a1a139da Signed-off-by: Jason Yellick <jyellick@us.ibm.com>
- Loading branch information
Jason Yellick
committed
May 26, 2017
1 parent
7fd6a90
commit 7b5b661
Showing
7 changed files
with
432 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
/* | ||
Copyright IBM Corp. 2017 All Rights Reserved. | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
*/ | ||
|
||
package protolator | ||
|
||
import ( | ||
"reflect" | ||
|
||
"github.com/golang/protobuf/proto" | ||
) | ||
|
||
type variablyOpaqueFieldFactory struct{} | ||
|
||
func (soff variablyOpaqueFieldFactory) Handles(msg proto.Message, fieldName string, fieldType reflect.Type, fieldValue reflect.Value) bool { | ||
opaqueProto, ok := msg.(VariablyOpaqueFieldProto) | ||
if !ok { | ||
return false | ||
} | ||
|
||
return stringInSlice(fieldName, opaqueProto.VariablyOpaqueFields()) | ||
} | ||
|
||
func (soff variablyOpaqueFieldFactory) NewProtoField(msg proto.Message, fieldName string, fieldType reflect.Type, fieldValue reflect.Value) (protoField, error) { | ||
opaqueProto := msg.(VariablyOpaqueFieldProto) // Type checked in Handles | ||
|
||
return &plainField{ | ||
baseField: baseField{ | ||
msg: msg, | ||
name: fieldName, | ||
fType: mapStringInterfaceType, | ||
vType: bytesType, | ||
value: fieldValue, | ||
}, | ||
populateFrom: func(v interface{}, dT reflect.Type) (reflect.Value, error) { | ||
return opaqueFrom(func() (proto.Message, error) { return opaqueProto.VariablyOpaqueFieldProto(fieldName) }, v, dT) | ||
}, | ||
populateTo: func(v reflect.Value) (interface{}, error) { | ||
return opaqueTo(func() (proto.Message, error) { return opaqueProto.VariablyOpaqueFieldProto(fieldName) }, v) | ||
}, | ||
}, nil | ||
} | ||
|
||
type variablyOpaqueMapFieldFactory struct{} | ||
|
||
func (soff variablyOpaqueMapFieldFactory) Handles(msg proto.Message, fieldName string, fieldType reflect.Type, fieldValue reflect.Value) bool { | ||
opaqueProto, ok := msg.(VariablyOpaqueMapFieldProto) | ||
if !ok { | ||
return false | ||
} | ||
|
||
return stringInSlice(fieldName, opaqueProto.VariablyOpaqueMapFields()) | ||
} | ||
|
||
func (soff variablyOpaqueMapFieldFactory) NewProtoField(msg proto.Message, fieldName string, fieldType reflect.Type, fieldValue reflect.Value) (protoField, error) { | ||
opaqueProto := msg.(VariablyOpaqueMapFieldProto) // Type checked in Handles | ||
|
||
return &mapField{ | ||
baseField: baseField{ | ||
msg: msg, | ||
name: fieldName, | ||
fType: mapStringInterfaceType, | ||
vType: fieldType, | ||
value: fieldValue, | ||
}, | ||
populateFrom: func(key string, v interface{}, dT reflect.Type) (reflect.Value, error) { | ||
return opaqueFrom(func() (proto.Message, error) { | ||
return opaqueProto.VariablyOpaqueMapFieldProto(fieldName, key) | ||
}, v, dT) | ||
}, | ||
populateTo: func(key string, v reflect.Value) (interface{}, error) { | ||
return opaqueTo(func() (proto.Message, error) { | ||
return opaqueProto.VariablyOpaqueMapFieldProto(fieldName, key) | ||
}, v) | ||
}, | ||
}, nil | ||
} | ||
|
||
type variablyOpaqueSliceFieldFactory struct{} | ||
|
||
func (soff variablyOpaqueSliceFieldFactory) Handles(msg proto.Message, fieldName string, fieldType reflect.Type, fieldValue reflect.Value) bool { | ||
opaqueProto, ok := msg.(VariablyOpaqueSliceFieldProto) | ||
if !ok { | ||
return false | ||
} | ||
|
||
return stringInSlice(fieldName, opaqueProto.VariablyOpaqueSliceFields()) | ||
} | ||
|
||
func (soff variablyOpaqueSliceFieldFactory) NewProtoField(msg proto.Message, fieldName string, fieldType reflect.Type, fieldValue reflect.Value) (protoField, error) { | ||
opaqueProto := msg.(VariablyOpaqueSliceFieldProto) // Type checked in Handles | ||
|
||
return &sliceField{ | ||
baseField: baseField{ | ||
msg: msg, | ||
name: fieldName, | ||
fType: mapStringInterfaceType, | ||
vType: fieldType, | ||
value: fieldValue, | ||
}, | ||
populateFrom: func(index int, v interface{}, dT reflect.Type) (reflect.Value, error) { | ||
return opaqueFrom(func() (proto.Message, error) { | ||
return opaqueProto.VariablyOpaqueSliceFieldProto(fieldName, index) | ||
}, v, dT) | ||
}, | ||
populateTo: func(index int, v reflect.Value) (interface{}, error) { | ||
return opaqueTo(func() (proto.Message, error) { | ||
return opaqueProto.VariablyOpaqueSliceFieldProto(fieldName, index) | ||
}, v) | ||
}, | ||
}, nil | ||
} |
Oops, something went wrong.