github.com/defanghe/fabric@v2.1.1+incompatible/common/tools/protolator/testprotos/sample.go (about) 1 /* 2 Copyright IBM Corp. 2017 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package testprotos 18 19 import ( 20 "fmt" 21 22 "github.com/golang/protobuf/proto" 23 ) 24 25 func (som *StaticallyOpaqueMsg) StaticallyOpaqueFields() []string { 26 return []string{"plain_opaque_field"} 27 } 28 29 func (som *StaticallyOpaqueMsg) StaticallyOpaqueFieldProto(name string) (proto.Message, error) { 30 if name != som.StaticallyOpaqueFields()[0] { 31 return nil, fmt.Errorf("not a statically opaque field: %s", name) 32 } 33 34 return &SimpleMsg{}, nil 35 } 36 37 func (som *StaticallyOpaqueMsg) StaticallyOpaqueMapFields() []string { 38 return []string{"map_opaque_field"} 39 } 40 41 func (som *StaticallyOpaqueMsg) StaticallyOpaqueMapFieldProto(name string, key string) (proto.Message, error) { 42 if name != som.StaticallyOpaqueMapFields()[0] { 43 return nil, fmt.Errorf("not a statically opaque field: %s", name) 44 } 45 46 return &SimpleMsg{}, nil 47 } 48 49 func (som *StaticallyOpaqueMsg) StaticallyOpaqueSliceFields() []string { 50 return []string{"slice_opaque_field"} 51 } 52 53 func (som *StaticallyOpaqueMsg) StaticallyOpaqueSliceFieldProto(name string, index int) (proto.Message, error) { 54 if name != som.StaticallyOpaqueSliceFields()[0] { 55 return nil, fmt.Errorf("not a statically opaque field: %s", name) 56 } 57 58 return &SimpleMsg{}, nil 59 } 60 61 func typeSwitch(typeName string) (proto.Message, error) { 62 switch typeName { 63 case "SimpleMsg": 64 return &SimpleMsg{}, nil 65 case "NestedMsg": 66 return &NestedMsg{}, nil 67 case "StaticallyOpaqueMsg": 68 return &StaticallyOpaqueMsg{}, nil 69 case "VariablyOpaqueMsg": 70 return &VariablyOpaqueMsg{}, nil 71 default: 72 return nil, fmt.Errorf("unknown message type: %s", typeName) 73 } 74 } 75 76 func (vom *VariablyOpaqueMsg) VariablyOpaqueFields() []string { 77 return []string{"plain_opaque_field"} 78 } 79 80 func (vom *VariablyOpaqueMsg) VariablyOpaqueFieldProto(name string) (proto.Message, error) { 81 if name != vom.VariablyOpaqueFields()[0] { 82 return nil, fmt.Errorf("not a statically opaque field: %s", name) 83 } 84 85 return typeSwitch(vom.OpaqueType) 86 } 87 88 func (vom *VariablyOpaqueMsg) VariablyOpaqueMapFields() []string { 89 return []string{"map_opaque_field"} 90 } 91 92 func (vom *VariablyOpaqueMsg) VariablyOpaqueMapFieldProto(name string, key string) (proto.Message, error) { 93 if name != vom.VariablyOpaqueMapFields()[0] { 94 return nil, fmt.Errorf("not a statically opaque field: %s", name) 95 } 96 97 return typeSwitch(vom.OpaqueType) 98 } 99 100 func (vom *VariablyOpaqueMsg) VariablyOpaqueSliceFields() []string { 101 return []string{"slice_opaque_field"} 102 } 103 104 func (vom *VariablyOpaqueMsg) VariablyOpaqueSliceFieldProto(name string, index int) (proto.Message, error) { 105 if name != vom.VariablyOpaqueSliceFields()[0] { 106 return nil, fmt.Errorf("not a statically opaque field: %s", name) 107 } 108 109 return typeSwitch(vom.OpaqueType) 110 } 111 112 func (cm *ContextlessMsg) VariablyOpaqueFields() []string { 113 return []string{"opaque_field"} 114 } 115 116 type DynamicMessageWrapper struct { 117 *ContextlessMsg 118 typeName string 119 } 120 121 func (dmw *DynamicMessageWrapper) VariablyOpaqueFieldProto(name string) (proto.Message, error) { 122 if name != dmw.ContextlessMsg.VariablyOpaqueFields()[0] { 123 return nil, fmt.Errorf("not a statically opaque field: %s", name) 124 } 125 126 return typeSwitch(dmw.typeName) 127 } 128 129 func (dmw *DynamicMessageWrapper) Underlying() proto.Message { 130 return dmw.ContextlessMsg 131 } 132 133 func wrapContextless(underlying proto.Message, typeName string) (*DynamicMessageWrapper, error) { 134 cm, ok := underlying.(*ContextlessMsg) 135 if !ok { 136 return nil, fmt.Errorf("unknown dynamic message to wrap (%T) requires *ContextlessMsg", underlying) 137 } 138 139 return &DynamicMessageWrapper{ 140 ContextlessMsg: cm, 141 typeName: typeName, 142 }, nil 143 } 144 145 func (vom *DynamicMsg) DynamicFields() []string { 146 return []string{"plain_dynamic_field"} 147 } 148 149 func (vom *DynamicMsg) DynamicFieldProto(name string, underlying proto.Message) (proto.Message, error) { 150 if name != vom.DynamicFields()[0] { 151 return nil, fmt.Errorf("not a dynamic field: %s", name) 152 } 153 154 return wrapContextless(underlying, vom.DynamicType) 155 } 156 157 func (vom *DynamicMsg) DynamicMapFields() []string { 158 return []string{"map_dynamic_field"} 159 } 160 161 func (vom *DynamicMsg) DynamicMapFieldProto(name string, key string, underlying proto.Message) (proto.Message, error) { 162 if name != vom.DynamicMapFields()[0] { 163 return nil, fmt.Errorf("not a dynamic map field: %s", name) 164 } 165 166 return wrapContextless(underlying, vom.DynamicType) 167 } 168 169 func (vom *DynamicMsg) DynamicSliceFields() []string { 170 return []string{"slice_dynamic_field"} 171 } 172 173 func (vom *DynamicMsg) DynamicSliceFieldProto(name string, index int, underlying proto.Message) (proto.Message, error) { 174 if name != vom.DynamicSliceFields()[0] { 175 return nil, fmt.Errorf("not a dynamic slice field: %s", name) 176 } 177 178 return wrapContextless(underlying, vom.DynamicType) 179 } 180 181 func (udf *UnmarshalableDeepFields) StaticallyOpaqueFields() []string { 182 return []string{"plain_opaque_field"} 183 } 184 185 func (udf *UnmarshalableDeepFields) StaticallyOpaqueFieldProto(name string) (proto.Message, error) { 186 return nil, fmt.Errorf("intentional error") 187 } 188 189 func (udf *UnmarshalableDeepFields) StaticallyOpaqueMapFields() []string { 190 return []string{"map_opaque_field"} 191 } 192 193 func (udf *UnmarshalableDeepFields) StaticallyOpaqueMapFieldProto(name, key string) (proto.Message, error) { 194 return nil, fmt.Errorf("intentional error") 195 } 196 197 func (udf *UnmarshalableDeepFields) StaticallyOpaqueSliceFields() []string { 198 return []string{"slice_opaque_field"} 199 } 200 201 func (udf *UnmarshalableDeepFields) StaticallyOpaqueSliceFieldProto(name string, index int) (proto.Message, error) { 202 return nil, fmt.Errorf("intentional error") 203 }