// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.

// expr-function.go
package expr

// ---- Functor interface
type Functor interface {
	Typer
	Invoke(ctx ExprContext, name string, args []any) (result any, err error)
	SetFunc(info ExprFunc)
	GetFunc() ExprFunc
	GetParams() []ExprFuncParam
	GetDefinitionContext() ExprContext
}

// ---- Function Param Info
type ExprFuncParam interface {
	Name() string
	Type() string
	IsDefault() bool
	IsOptional() bool
	IsRepeat() bool
	DefaultValue() any
}

// ---- Function Info
type ExprFunc interface {
	Formatter
	Name() string
	MinArgs() int
	MaxArgs() int
	Functor() Functor
	Params() []ExprFuncParam
	ReturnType() string
	PrepareCall(parentCtx ExprContext, name string, varParams *[]any) (ctx ExprContext, err error)
	AllocContext(parentCtx ExprContext) (ctx ExprContext)
}