fabric-samples/commercial-paper/organization/digibank/contract-go/commercial-paper/paper.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

139 lines
3.5 KiB
Go

/*
* SPDX-License-Identifier: Apache-2.0
*/
package commercialpaper
import (
"encoding/json"
"fmt"
ledgerapi "github.com/hyperledger/fabric-samples/commercial-paper/organization/digibank/contract-go/ledger-api"
)
// State enum for commercial paper state property
type State uint
const (
// ISSUED state for when a paper has been issued
ISSUED State = iota + 1
// TRADING state for when a paper is trading
TRADING
// REDEEMED state for when a paper has been redeemed
REDEEMED
)
func (state State) String() string {
names := []string{"ISSUED", "TRADING", "REDEEMED"}
if state < ISSUED || state > REDEEMED {
return "UNKNOWN"
}
return names[state-1]
}
// CreateCommercialPaperKey creates a key for commercial papers
func CreateCommercialPaperKey(issuer string, paperNumber string) string {
return ledgerapi.MakeKey(issuer, paperNumber)
}
// Used for managing the fact status is private but want it in world state
type commercialPaperAlias CommercialPaper
type jsonCommercialPaper struct {
*commercialPaperAlias
State State `json:"currentState"`
Class string `json:"class"`
Key string `json:"key"`
}
// CommercialPaper defines a commercial paper
type CommercialPaper struct {
PaperNumber string `json:"paperNumber"`
Issuer string `json:"issuer"`
IssueDateTime string `json:"issueDateTime"`
FaceValue int `json:"faceValue"`
MaturityDateTime string `json:"maturityDateTime"`
Owner string `json:"owner"`
state State `metadata:"currentState"`
class string `metadata:"class"`
key string `metadata:"key"`
}
// UnmarshalJSON special handler for managing JSON marshalling
func (cp *CommercialPaper) UnmarshalJSON(data []byte) error {
jcp := jsonCommercialPaper{commercialPaperAlias: (*commercialPaperAlias)(cp)}
err := json.Unmarshal(data, &jcp)
if err != nil {
return err
}
cp.state = jcp.State
return nil
}
// MarshalJSON special handler for managing JSON marshalling
func (cp CommercialPaper) MarshalJSON() ([]byte, error) {
jcp := jsonCommercialPaper{commercialPaperAlias: (*commercialPaperAlias)(&cp), State: cp.state, Class: "org.papernet.commercialpaper", Key: ledgerapi.MakeKey(cp.Issuer, cp.PaperNumber)}
return json.Marshal(&jcp)
}
// GetState returns the state
func (cp *CommercialPaper) GetState() State {
return cp.state
}
// SetIssued returns the state to issued
func (cp *CommercialPaper) SetIssued() {
cp.state = ISSUED
}
// SetTrading sets the state to trading
func (cp *CommercialPaper) SetTrading() {
cp.state = TRADING
}
// SetRedeemed sets the state to redeemed
func (cp *CommercialPaper) SetRedeemed() {
cp.state = REDEEMED
}
// IsIssued returns true if state is issued
func (cp *CommercialPaper) IsIssued() bool {
return cp.state == ISSUED
}
// IsTrading returns true if state is trading
func (cp *CommercialPaper) IsTrading() bool {
return cp.state == TRADING
}
// IsRedeemed returns true if state is redeemed
func (cp *CommercialPaper) IsRedeemed() bool {
return cp.state == REDEEMED
}
// GetSplitKey returns values which should be used to form key
func (cp *CommercialPaper) GetSplitKey() []string {
return []string{cp.Issuer, cp.PaperNumber}
}
// Serialize formats the commercial paper as JSON bytes
func (cp *CommercialPaper) Serialize() ([]byte, error) {
return json.Marshal(cp)
}
// Deserialize formats the commercial paper from JSON bytes
func Deserialize(bytes []byte, cp *CommercialPaper) error {
err := json.Unmarshal(bytes, cp)
if err != nil {
return fmt.Errorf("Error deserializing commercial paper. %s", err.Error())
}
return nil
}