package api

import (
	"errors"
	"reflect"

	"github.com/filecoin-project/go-jsonrpc"
)

const (
	EOutOfGas = iota + jsonrpc.FirstUserCode
	EActorNotFound
)

type ErrOutOfGas struct{}

func (e *ErrOutOfGas) Error() string {
	return "call ran out of gas"
}

type ErrActorNotFound struct{}

func (e *ErrActorNotFound) Error() string {
	return "actor not found"
}

var RPCErrors = jsonrpc.NewErrors()

func ErrorIsIn(err error, errorTypes []error) bool {
	for _, etype := range errorTypes {
		tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface()
		if errors.As(err, tmp) {
			return true
		}
	}
	return false
}

func init() {
	RPCErrors.Register(EOutOfGas, new(*ErrOutOfGas))
	RPCErrors.Register(EActorNotFound, new(*ErrActorNotFound))
}