mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
/*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package ledgerapi
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
|
)
|
|
|
|
// StateListInterface functions that a state list
|
|
// should have
|
|
type StateListInterface interface {
|
|
AddState(StateInterface) error
|
|
GetState(string, StateInterface) error
|
|
UpdateState(StateInterface) error
|
|
}
|
|
|
|
// StateList useful for managing putting data in and out
|
|
// of the ledger. Implementation of StateListInterface
|
|
type StateList struct {
|
|
Ctx contractapi.TransactionContextInterface
|
|
Name string
|
|
Deserialize func([]byte, StateInterface) error
|
|
}
|
|
|
|
// AddState puts state into world state
|
|
func (sl *StateList) AddState(state StateInterface) error {
|
|
key, _ := sl.Ctx.GetStub().CreateCompositeKey(sl.Name, state.GetSplitKey())
|
|
data, err := state.Serialize()
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return sl.Ctx.GetStub().PutState(key, data)
|
|
}
|
|
|
|
// GetState returns state from world state. Unmarshalls the JSON
|
|
// into passed state. Key is the split key value used in Add/Update
|
|
// joined using a colon
|
|
func (sl *StateList) GetState(key string, state StateInterface) error {
|
|
ledgerKey, _ := sl.Ctx.GetStub().CreateCompositeKey(sl.Name, SplitKey(key))
|
|
data, err := sl.Ctx.GetStub().GetState(ledgerKey)
|
|
|
|
if err != nil {
|
|
return err
|
|
} else if data == nil {
|
|
return fmt.Errorf("No state found for %s", key)
|
|
}
|
|
|
|
return sl.Deserialize(data, state)
|
|
}
|
|
|
|
// UpdateState puts state into world state. Same as AddState but
|
|
// separate as semantically different
|
|
func (sl *StateList) UpdateState(state StateInterface) error {
|
|
return sl.AddState(state)
|
|
}
|