aergoio/aergo

View on GitHub
cmd/brick/exec/getstateAccount.go

Summary

Maintainability
A
0 mins
Test Coverage
package exec

import (
    "fmt"

    "github.com/aergoio/aergo/v2/cmd/brick/context"
    "github.com/aergoio/aergo/v2/contract/vm_dummy"
    "github.com/aergoio/aergo/v2/types"
)

func init() {
    registerExec(&getStateAccount{})
}

type getStateAccount struct{}

func (c *getStateAccount) Command() string {
    return "getstate"
}

func (c *getStateAccount) Syntax() string {
    return fmt.Sprintf("%s", context.AccountSymbol)
}

func (c *getStateAccount) Usage() string {
    return fmt.Sprintf("getstate <account_name> `[expected_balance]`")
}

func (c *getStateAccount) Describe() string {
    return "get the current state of an account"
}

func (c *getStateAccount) Validate(args string) error {
    if context.Get() == nil {
        return fmt.Errorf("load chain first")
    }

    _, _, err := c.parse(args)

    return err
}

func (c *getStateAccount) parse(args string) (string, string, error) {
    splitArgs := context.SplitSpaceAndAccent(args, false)
    if len(splitArgs) < 1 {
        return "", "", fmt.Errorf("missing arguments. usage: %s", c.Usage())
    }

    expectedResult := ""
    if len(splitArgs) == 2 {
        expectedResult = splitArgs[1].Text
    } else if len(splitArgs) > 2 {
        return "", "", fmt.Errorf("too many arguments. usage: %s", c.Usage())
    }

    return splitArgs[0].Text, expectedResult, nil
}

func (c *getStateAccount) Run(args string) (string, uint64, []*types.Event, error) {
    accountName, expectedResult, _ := c.parse(args)

    state, err := context.Get().GetAccountState(accountName)

    if err != nil {
        return "", 0, nil, err
    }
    if expectedResult == "" {
        return fmt.Sprintf("%s = %s", vm_dummy.StrToAddress(accountName), state.GetBalanceBigInt().String()), 0, nil, nil
    } else {
        strRet := state.GetBalanceBigInt().String()
        if expectedResult == strRet {
            return "state compare successfully", 0, nil, nil
        } else {
            return "", 0, nil, fmt.Errorf("state compare failed. Expected: %s, Actual: %s", expectedResult, strRet)
        }
    }
}