go-judge/worker/model.go
2021-06-05 20:24:08 -07:00

97 lines
1.9 KiB
Go

package worker
import (
"fmt"
"time"
"github.com/criyle/go-judge/envexec"
)
// Cmd defines command and limits to start a program using in envexec
type Cmd struct {
Args []string
Env []string
Files []CmdFile
TTY bool
CPULimit time.Duration
ClockLimit time.Duration
MemoryLimit envexec.Size
StackLimit envexec.Size
ProcLimit uint64
CPURateLimit float64
StrictMemoryLimit bool
CopyIn map[string]CmdFile
CopyOut []envexec.CmdCopyOutFile
CopyOutCached []envexec.CmdCopyOutFile
CopyOutMax uint64
CopyOutDir string
}
// PipeIndex defines indexing for a pipe fd
type PipeIndex struct {
Index int
Fd int
}
// PipeMap defines in / out pipe for multiple program
type PipeMap struct {
In PipeIndex
Out PipeIndex
}
// Request defines single worker request
type Request struct {
RequestID string
Cmd []Cmd
PipeMapping []PipeMap
}
// Result defines single command response
type Result struct {
Status envexec.Status
ExitStatus int
Error string
Time time.Duration
RunTime time.Duration
Memory envexec.Size
Files map[string][]byte
FileIDs map[string]string
}
// Response defines worker response for single request
type Response struct {
RequestID string
Results []Result
Error error
}
func (r Result) String() string {
type Result struct {
Status envexec.Status
ExitStatus int
Error string
Time time.Duration
RunTime time.Duration
Memory envexec.Size
Files map[string]string
FileIDs map[string]string
}
d := Result{
Status: r.Status,
ExitStatus: r.ExitStatus,
Error: r.Error,
Time: r.Time,
RunTime: r.RunTime,
Memory: r.Memory,
Files: make(map[string]string),
FileIDs: r.FileIDs,
}
for k, v := range r.Files {
d.Files[k] = fmt.Sprintf("(len:%d)", len(v))
}
return fmt.Sprintf("%+v", d)
}