github.com/kaituanwang/hyperledger@v2.0.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 }