package plugin

import (
	"fmt"
	"plugin"

	"github.com/joint-online-judge/JOJ3/internal/stage"
)

func (*Plugin) Run(results []stage.ExecutorResult, confAny any) (
	[]stage.ParserResult, bool, error,
) {
	conf, err := stage.DecodeConf[Conf](confAny)
	if err != nil {
		return nil, true, err
	}
	plug, err := plugin.Open(conf.ModPath)
	if err != nil {
		return nil, true, err
	}
	symParser, err := plug.Lookup(conf.SymName)
	if err != nil {
		return nil, true, err
	}
	var parser stage.Parser
	parser, ok := symParser.(stage.Parser)
	if !ok {
		return nil, true, fmt.Errorf("unexpected type from module symbol")
	}
	return parser.Run(results, confAny)
}