package runner import ( "git.0x7f.app/WOJ/woj-server/internal/e" "git.0x7f.app/WOJ/woj-server/internal/misc/config" "git.0x7f.app/WOJ/woj-server/internal/misc/log" "git.0x7f.app/WOJ/woj-server/pkg/pool" "git.0x7f.app/WOJ/woj-server/pkg/utils" "github.com/samber/do" "go.uber.org/zap" "runtime" ) var _ Service = (*service)(nil) type Service interface { // EnsureDeps build docker images EnsureDeps(force bool) e.Status // NewProblem = Download + Parse + Prebuild NewProblem(version uint, url string, force bool) (Config, e.Status) // Compile compile user submission Compile(version uint, user string, lang string) (JudgeStatus, e.Status) // RunAndJudge execute user program RunAndJudge(version uint, user string, lang string) (JudgeStatus, int32, e.Status) // ParseConfig parse config file ParseConfig(version uint, skipCheck bool) (Config, error) // ProblemExists check if problem exists ProblemExists(version uint) bool HealthCheck() error Shutdown() error } func NewService(i *do.Injector) (Service, error) { concurrency := utils.If(runtime.NumCPU() > 1, runtime.NumCPU()-1, 1) srv := &service{ log: do.MustInvoke[log.Service](i).GetLogger("runner"), pool: pool.NewTaskPool(concurrency, concurrency), verbose: do.MustInvoke[config.Service](i).GetConfig().Development, } srv.pool.Start() return srv, nil } type service struct { log *zap.Logger pool *pool.TaskPool verbose bool } func (s *service) HealthCheck() error { return nil } func (s *service) Shutdown() error { s.pool.Stop() return nil }