package process import ( "errors" "fmt" ) type RegisterNewProc[T Proc] func() (T, error) var ( ErrNoProcFound = errors.New("cannot locate procType") ErrNoProcess = errors.New("process not running") ErrNoCallStart = errors.New("process ared runnning, dont call Start") ErrAppendProcess = errors.New("cannot append to makeProcs register") makeProcs = make(map[string]RegisterNewProc[Proc]) ) // RegisterProcess new proc func RegisterProcess[T Proc](makeProc RegisterNewProc[T], names ...string) error { if makeProcs == nil { return ErrAppendProcess } for _, name := range names { makeProcs[name] = func() (proc Proc, err error) { defer func() { if err2, ok := recover().(error); ok && err != nil { err = fmt.Errorf("return new process: %w", err2) } }() return makeProc() } } return nil } // Return new process struct func GetNewProc(typeName string) (Proc, error) { if newProc, ok := makeProcs[typeName]; ok { return newProc() } return nil, ErrNoProcFound } // Make new process and start command func ReturnNewProcess(typeName string, options *Exec) (Proc, error) { if newProc, ok := makeProcs[typeName]; ok { proc, err := newProc() if err != nil { return nil, err } err = proc.Start(options) return proc, err } return nil, ErrNoProcFound }