package walker

import (
	"fmt"
	"os"
	"plugin"
	"time"
)

// LoadPlugin loads the file path and returns a Fuzzer
func LoadPlugin(path string) (Fuzzer, error) {
	p, err := plugin.Open(path)
	if err != nil {
		return nil, err
	}
	sym, err := p.Lookup("MyFuzzerFunc")
	if err != nil {
		return nil, err
	}
	mff, ok := sym.(Fuzzer)
	if !ok {
		return nil, fmt.Errorf("plugin at %q did not provide a FuzzFunc named MyFuzzerFunc", path)
	}
	return mff, nil
}

// Fuzzer is a struct that produces a FuzzFunc
type Fuzzer interface {
	Name() string
	Func() FuzzFunc
}

// FuzzFunc is like filepath.WalkerFunc, but for poking at `path`
type FuzzFunc func(path string, info os.FileInfo, timeout time.Duration) error
