/
normalRun.go
57 lines (49 loc) · 1.64 KB
/
normalRun.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package fj
import (
"fmt"
"os"
"path/filepath"
)
// normalRun は指定された設定とシードに基づいてコマンドを実行する
// normal モード用
func normalRun(cnf *Config, seed int) ([]byte, string, error) {
cmd := LanguageSets[cnf.Language].ExeCmd
if cmd == "" {
return nil, "", NewStackTraceError(fmt.Sprintf("error: LanguageSets[%s].ExecCmd must not be empty", cnf.Language))
}
inputfile := filepath.Join(cnf.InfilePath, fmt.Sprintf("%04d.txt", seed))
outputfile := filepath.Join(cnf.OutfilePath, fmt.Sprintf("%04d.txt", seed))
if _, err := os.Stat(inputfile); err != nil {
return nil, "", err
}
if err := checkOutputFolder(cnf.OutfilePath); err != nil {
return nil, "", err
}
// コマンドを作成
cmd += " " + setArgs(cnf.Args) // カスタム引数を追加
cmdStr := fmt.Sprintf("%s < %s > %s", cmd, inputfile, outputfile)
cmdStrings := createCommand(cmdStr)
out, result, err := runCommandWithTimeout(cmdStrings, int(cnf.TimeLimitMS))
if err != nil {
//log.Println("Error: ", err, "\nout:", string(out))
return out, result, fmt.Errorf("cmd.Run() for command [%q] failed with: %v out:%s", cmdStrings, err.Error(), out)
}
return out, result, nil
}
// checkOutputFolder は出力フォルダが存在するか確認し、存在しない場合は作成する
func checkOutputFolder(dir string) error {
stat, err := os.Stat(dir)
if err != nil {
if os.IsNotExist(err) {
err = os.MkdirAll(dir, 0777)
if err != nil {
return fmt.Errorf("failed to create output folder: %w", err)
}
} else {
return err
}
} else if !stat.IsDir() {
return fmt.Errorf("path is not directory: %s", dir)
}
return nil
}