// Plugin loading with cgo (uses dlopen to load .so plugins at runtime).
//go:build (linux || darwin || freebsd) && cgo && !noplugin

package loader

import (
	"errors"
	"plugin"

	iplugin "github.com/ipfs/kubo/plugin"
)

func init() {
	loadPluginFunc = unixLoadPlugin
}

func unixLoadPlugin(fi string) ([]iplugin.Plugin, error) {
	pl, err := plugin.Open(fi)
	if err != nil {
		return nil, err
	}
	pls, err := pl.Lookup("Plugins")
	if err != nil {
		return nil, err
	}

	typePls, ok := pls.(*[]iplugin.Plugin)
	if !ok {
		return nil, errors.New("filed 'Plugins' didn't contain correct type")
	}

	return *typePls, nil
}