58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
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
|
|
}
|