-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata.go
85 lines (67 loc) · 1.48 KB
/
data.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package kpp
import (
"errors"
"io"
"io/fs"
"path"
)
type TestData struct {
fs fs.FS
group *TestGroup
name string
inputSize, answerSize int64
illusExt string
}
func (d TestData) Name() string {
return d.name
}
func (d TestData) Group() string {
return d.group.Path()
}
func (d TestData) Input() (io.ReadCloser, error) {
return d.fs.Open(path.Join("data", d.group.Path(), d.name+".in"))
}
func (d TestData) InputSize() int64 {
return d.inputSize
}
func (d TestData) Answer() (io.ReadCloser, error) {
return d.fs.Open(path.Join("data", d.group.Path(), d.name+".ans"))
}
func (d TestData) AnswerSize() int64 {
return d.answerSize
}
func (d TestData) readText(name string) (string, error) {
f, err := d.fs.Open(path.Join("data", d.group.Path(), name))
if errors.Is(err, fs.ErrNotExist) {
return "", nil
}
if err != nil {
return "", err
}
defer f.Close()
b, err := io.ReadAll(f)
return string(b), nil
}
func (d TestData) Hint() (string, error) {
return d.readText(d.name + ".hint")
}
func (d TestData) Description() (string, error) {
return d.readText(d.name + ".desc")
}
func (d TestData) Illustration() (io.ReadCloser, string, error) {
if d.illusExt == "" {
return nil, "", nil
}
f, err := d.fs.Open(path.Join("data", d.group.Path(), d.name+"."+d.illusExt))
return f, d.illusExt, err
}
type TestGroup struct {
parent *TestGroup
name string
}
func (g TestGroup) Path() string {
if g.parent == nil {
return g.name
}
return path.Join(g.parent.Path(), g.name)
}