frostfs-node/pkg/morph/client/reputation/get.go

109 lines
2.9 KiB
Go

package reputation
import (
"fmt"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/reputation"
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
)
type (
// GetPrm groups the arguments of "get reputation value" test invocation.
GetPrm struct {
epoch uint64
peerID reputation.PeerID
}
// GetByIDPrm groups the arguments of "get reputation value by
// reputation id" test invocation.
GetByIDPrm struct {
id ID
}
)
// SetEpoch sets epoch of expected reputation value.
func (g *GetPrm) SetEpoch(v uint64) {
g.epoch = v
}
// SetPeerID sets peer id of expected reputation value.
func (g *GetPrm) SetPeerID(v reputation.PeerID) {
g.peerID = v
}
// SetID sets id of expected reputation value in reputation contract.
func (g *GetByIDPrm) SetID(v ID) {
g.id = v
}
// Get invokes the call of "get reputation value" method of reputation contract.
func (c *Client) Get(p GetPrm) ([]reputation.GlobalTrust, error) {
invokePrm := client.TestInvokePrm{}
invokePrm.SetMethod(getMethod)
invokePrm.SetArgs(p.epoch, p.peerID.PublicKey())
res, err := c.client.TestInvoke(invokePrm)
if err != nil {
return nil, fmt.Errorf("could not perform test invocation (%s): %w", getMethod, err)
}
return parseReputations(res, getMethod)
}
// GetByID invokes the call of "get reputation value by reputation id" method
// of reputation contract.
func (c *Client) GetByID(p GetByIDPrm) ([]reputation.GlobalTrust, error) {
invokePrm := client.TestInvokePrm{}
invokePrm.SetMethod(getByIDMethod)
invokePrm.SetArgs([]byte(p.id))
prms, err := c.client.TestInvoke(invokePrm)
if err != nil {
return nil, fmt.Errorf("could not perform test invocation (%s): %w", getByIDMethod, err)
}
return parseReputations(prms, getByIDMethod)
}
func parseGetResult(rawReputations [][]byte, method string) ([]reputation.GlobalTrust, error) {
reputations := make([]reputation.GlobalTrust, 0, len(rawReputations))
for i := range rawReputations {
r := reputation.GlobalTrust{}
err := r.Unmarshal(rawReputations[i])
if err != nil {
return nil, fmt.Errorf("can't unmarshal global trust value (%s): %w", method, err)
}
reputations = append(reputations, r)
}
return reputations, nil
}
func parseReputations(items []stackitem.Item, method string) ([]reputation.GlobalTrust, error) {
if ln := len(items); ln != 1 {
return nil, fmt.Errorf("unexpected stack item count (%s): %d", method, ln)
}
items, err := client.ArrayFromStackItem(items[0])
if err != nil {
return nil, fmt.Errorf("could not get stack item array from stack item (%s): %w", method, err)
}
res := make([][]byte, 0, len(items))
for i := range items {
rawReputation, err := client.BytesFromStackItem(items[i])
if err != nil {
return nil, fmt.Errorf("could not get byte array from stack item (%s): %w", method, err)
}
res = append(res, rawReputation)
}
return parseGetResult(res, method)
}