github.com/yimialmonte/fabric@v2.1.1+incompatible/common/tools/protolator/protoext/ledger/rwsetext/rwset.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package rwsetext
     8  
     9  import (
    10  	"fmt"
    11  
    12  	"github.com/golang/protobuf/proto"
    13  	"github.com/hyperledger/fabric-protos-go/ledger/rwset"
    14  	"github.com/hyperledger/fabric-protos-go/ledger/rwset/kvrwset"
    15  )
    16  
    17  type TxReadWriteSet struct{ *rwset.TxReadWriteSet }
    18  
    19  func (txrws *TxReadWriteSet) Underlying() proto.Message {
    20  	return txrws.TxReadWriteSet
    21  }
    22  
    23  func (txrws *TxReadWriteSet) DynamicSliceFields() []string {
    24  	if txrws.DataModel != rwset.TxReadWriteSet_KV {
    25  		// We only know how to handle TxReadWriteSet_KV types
    26  		return []string{}
    27  	}
    28  
    29  	return []string{"ns_rwset"}
    30  }
    31  
    32  func (txrws *TxReadWriteSet) DynamicSliceFieldProto(name string, index int, base proto.Message) (proto.Message, error) {
    33  	if name != txrws.DynamicSliceFields()[0] {
    34  		return nil, fmt.Errorf("Not a dynamic field: %s", name)
    35  	}
    36  
    37  	nsrw, ok := base.(*rwset.NsReadWriteSet)
    38  	if !ok {
    39  		return nil, fmt.Errorf("TxReadWriteSet must embed a NsReadWriteSet its dynamic field")
    40  	}
    41  
    42  	return &DynamicNsReadWriteSet{
    43  		NsReadWriteSet: nsrw,
    44  		DataModel:      txrws.DataModel,
    45  	}, nil
    46  }
    47  
    48  type DynamicNsReadWriteSet struct {
    49  	*rwset.NsReadWriteSet
    50  	DataModel rwset.TxReadWriteSet_DataModel
    51  }
    52  
    53  func (dnrws *DynamicNsReadWriteSet) Underlying() proto.Message {
    54  	return dnrws.NsReadWriteSet
    55  }
    56  
    57  func (dnrws *DynamicNsReadWriteSet) StaticallyOpaqueFields() []string {
    58  	return []string{"rwset"}
    59  }
    60  
    61  func (dnrws *DynamicNsReadWriteSet) StaticallyOpaqueFieldProto(name string) (proto.Message, error) {
    62  	switch name {
    63  	case "rwset":
    64  		switch dnrws.DataModel {
    65  		case rwset.TxReadWriteSet_KV:
    66  			return &kvrwset.KVRWSet{}, nil
    67  		default:
    68  			return nil, fmt.Errorf("unknown data model type: %v", dnrws.DataModel)
    69  		}
    70  	default:
    71  		return nil, fmt.Errorf("not a marshaled field: %s", name)
    72  	}
    73  }
    74  
    75  func (dnrws *DynamicNsReadWriteSet) DynamicSliceFields() []string {
    76  	if dnrws.DataModel != rwset.TxReadWriteSet_KV {
    77  		// We only know how to handle TxReadWriteSet_KV types
    78  		return []string{}
    79  	}
    80  
    81  	return []string{"collection_hashed_rwset"}
    82  }
    83  
    84  func (dnrws *DynamicNsReadWriteSet) DynamicSliceFieldProto(name string, index int, base proto.Message) (proto.Message, error) {
    85  	if name != dnrws.DynamicSliceFields()[0] {
    86  		return nil, fmt.Errorf("Not a dynamic field: %s", name)
    87  	}
    88  
    89  	chrws, ok := base.(*rwset.CollectionHashedReadWriteSet)
    90  	if !ok {
    91  		return nil, fmt.Errorf("NsReadWriteSet must embed a *CollectionHashedReadWriteSet its dynamic field")
    92  	}
    93  
    94  	return &DynamicCollectionHashedReadWriteSet{
    95  		CollectionHashedReadWriteSet: chrws,
    96  		DataModel:                    dnrws.DataModel,
    97  	}, nil
    98  }
    99  
   100  type DynamicCollectionHashedReadWriteSet struct {
   101  	*rwset.CollectionHashedReadWriteSet
   102  	DataModel rwset.TxReadWriteSet_DataModel
   103  }
   104  
   105  func (dchrws *DynamicCollectionHashedReadWriteSet) Underlying() proto.Message {
   106  	return dchrws.CollectionHashedReadWriteSet
   107  }
   108  
   109  func (dchrws *DynamicCollectionHashedReadWriteSet) StaticallyOpaqueFields() []string {
   110  	return []string{"rwset"}
   111  }
   112  
   113  func (dchrws *DynamicCollectionHashedReadWriteSet) StaticallyOpaqueFieldProto(name string) (proto.Message, error) {
   114  	switch name {
   115  	case "rwset":
   116  		switch dchrws.DataModel {
   117  		case rwset.TxReadWriteSet_KV:
   118  			return &kvrwset.HashedRWSet{}, nil
   119  		default:
   120  			return nil, fmt.Errorf("unknown data model type: %v", dchrws.DataModel)
   121  		}
   122  	default:
   123  		return nil, fmt.Errorf("not a marshaled field: %s", name)
   124  	}
   125  }