package html import ( "context" "github.com/MontFerret/ferret/pkg/runtime/core" "github.com/MontFerret/ferret/pkg/runtime/values" ) // Select selects a value from an underlying select element. // @param source (Document | Element) - Event target. // @param valueOrSelector (String | Array) - Selector or a an array of strings as a value. // @param value (Array) - Returns an array of selected values. func Select(_ context.Context, args ...core.Value) (core.Value, error) { err := core.ValidateArgs(args, 2, 4) if err != nil { return values.None, err } arg1 := args[0] err = core.ValidateType(arg1, core.HTMLDocumentType, core.HTMLElementType) if err != nil { return values.False, err } switch args[0].(type) { case values.DHTMLDocument: doc, ok := arg1.(values.DHTMLDocument) if !ok { return values.False, core.Errors(core.ErrInvalidType, ErrNotDynamic) } // selector arg2 := args[1] err = core.ValidateType(arg2, core.StringType) if err != nil { return values.False, err } arg3 := args[2] err = core.ValidateType(arg3, core.ArrayType) if err != nil { return values.False, err } return doc.SelectBySelector(arg2.(values.String), arg3.(*values.Array)) case values.DHTMLNode: el, ok := arg1.(values.DHTMLNode) if !ok { return values.False, core.Errors(core.ErrInvalidType, ErrNotDynamic) } arg2 := args[1] err = core.ValidateType(arg2, core.ArrayType) if err != nil { return values.False, err } return el.Select(arg2.(*values.Array)) default: return values.False, core.Errors(core.ErrInvalidArgument) } }