Files
streamsql/functions/base.go
T
2025-08-07 19:20:14 +08:00

79 lines
1.9 KiB
Go

package functions
import (
"fmt"
)
// BaseFunction provides basic function implementation with common functionality
type BaseFunction struct {
name string
fnType FunctionType
category string
description string
minArgs int
maxArgs int // -1 means unlimited
aliases []string // function aliases
}
// NewBaseFunction creates a new base function
func NewBaseFunction(name string, fnType FunctionType, category, description string, minArgs, maxArgs int) *BaseFunction {
return &BaseFunction{
name: name,
fnType: fnType,
category: category,
description: description,
minArgs: minArgs,
maxArgs: maxArgs,
aliases: []string{},
}
}
// NewBaseFunctionWithAliases creates base function with aliases
func NewBaseFunctionWithAliases(name string, fnType FunctionType, category, description string, minArgs, maxArgs int, aliases []string) *BaseFunction {
return &BaseFunction{
name: name,
fnType: fnType,
category: category,
description: description,
minArgs: minArgs,
maxArgs: maxArgs,
aliases: aliases,
}
}
func (bf *BaseFunction) GetName() string {
return bf.name
}
func (bf *BaseFunction) GetType() FunctionType {
return bf.fnType
}
func (bf *BaseFunction) GetCategory() string {
return bf.category
}
func (bf *BaseFunction) GetDescription() string {
return bf.description
}
// GetAliases returns function alias list
func (bf *BaseFunction) GetAliases() []string {
return bf.aliases
}
// ValidateArgCount validates the number of arguments
func (bf *BaseFunction) ValidateArgCount(args []interface{}) error {
argCount := len(args)
if argCount < bf.minArgs {
return fmt.Errorf("function %s requires at least %d arguments, got %d", bf.name, bf.minArgs, argCount)
}
if bf.maxArgs != -1 && argCount > bf.maxArgs {
return fmt.Errorf("function %s accepts at most %d arguments, got %d", bf.name, bf.maxArgs, argCount)
}
return nil
}