fabric-samples/commercial-paper/organization/digibank/contract-go/ledger-api/statelist.go
Andrew Hurt 5b93dd0cc0 [FAB-17140] Add go commercial paper contract (#102)
Signed-off-by: Andrew Hurt <andrew.hurt1@ibm.com>
2020-01-24 14:12:30 +00:00

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)
}