github.com/yimialmonte/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  }