mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
139 lines
3.5 KiB
Go
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
|
|
}
|