package frostfsid import ( "fmt" frostfsidclient "git.frostfs.info/TrueCloudLab/frostfs-contract/frostfsid/client" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" ) const ( methodGetSubject = "getSubject" methodGetSubjectExtended = "getSubjectExtended" ) func (c *Client) GetSubject(addr util.Uint160) (*frostfsidclient.Subject, error) { prm := client.TestInvokePrm{} prm.SetMethod(methodGetSubject) prm.SetArgs(addr) res, err := c.client.TestInvoke(prm) if err != nil { return nil, fmt.Errorf("could not perform test invocation (%s): %w", methodGetSubject, err) } structArr, err := checkStackItem(res) if err != nil { return nil, fmt.Errorf("invalid test invocation result (%s): %w", methodGetSubjectExtended, err) } subj, err := frostfsidclient.ParseSubject(structArr) if err != nil { return nil, fmt.Errorf("could not parse test invocation result (%s): %w", methodGetSubject, err) } return subj, nil } func (c *Client) GetSubjectExtended(addr util.Uint160) (*frostfsidclient.SubjectExtended, error) { prm := client.TestInvokePrm{} prm.SetMethod(methodGetSubjectExtended) prm.SetArgs(addr) res, err := c.client.TestInvoke(prm) if err != nil { return nil, fmt.Errorf("could not perform test invocation (%s): %w", methodGetSubjectExtended, err) } structArr, err := checkStackItem(res) if err != nil { return nil, fmt.Errorf("invalid test invocation result (%s): %w", methodGetSubjectExtended, err) } subj, err := frostfsidclient.ParseSubjectExtended(structArr) if err != nil { return nil, fmt.Errorf("could not parse test invocation result (%s): %w", methodGetSubject, err) } return subj, nil } func checkStackItem(res []stackitem.Item) (structArr []stackitem.Item, err error) { if ln := len(res); ln != 1 { return nil, fmt.Errorf("unexpected stack item count (%s): %d", methodGetSubject, ln) } structArr, err = client.ArrayFromStackItem(res[0]) if err != nil { return nil, fmt.Errorf("could not get item array of container (%s): %w", methodGetSubject, err) } return }