-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodel.go
131 lines (116 loc) · 2.55 KB
/
model.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package main
import (
"fmt"
"encoding/json"
"bufio"
"os"
"strconv"
"bytes"
"io/ioutil"
"strings"
)
type RoundType string
const (
RoundTypeFixed RoundType = "Fixed"
RoundTypeBestTogether RoundType = "BestTogether"
)
type Basic struct {
FileName string
LongName string
AmountPerRound float64
Currency string
Rounds []RoundType
}
type Player struct {
Name string
Club string `json:",omitempty`
}
type Players map[int] Player
type Tournament struct {
Basic Basic
Players Players
}
func load_tournament(filename string) (*Tournament,error) {
if strings.Contains(filename, not_allowed_in_name()) {
return nil, fmt.Errorf(gettext("Nedovolené znaky v názve turnaja"))
}
f, err := os.Open("data/" + filename + ".json")
if err != nil {
return nil, err
}
defer f.Close()
reader := bufio.NewReader(f)
decoder := json.NewDecoder(reader)
var t *Tournament = NewTournament(filename)
if err := decoder.Decode(t); err != nil {
return nil, err
}
return t, nil
}
func NewTournament(filename string) *Tournament {
var t Tournament = Tournament{
Basic: Basic{
FileName: filename,
Rounds: []RoundType {RoundTypeFixed, RoundTypeFixed, RoundTypeFixed, RoundTypeBestTogether, RoundTypeBestTogether},
},
Players: make(Players),
}
return &t
}
func (players *Players)UnmarshalJSON(b []byte) error {
var tmp map[string]Player
if err := json.Unmarshal(b, &tmp); err!=nil {
return err
}
for str,player := range(tmp) {
n, err := strconv.Atoi(str)
if err != nil {
return err
}
if val,ok :=(*players)[n]; ok {
return fmt.Errorf(gettext(`Kľúč "%s" bol použitý viac krát`), val)
}
(*players)[n]=player
}
return nil
}
func (self Player)empty() bool {
return self.Name=="" && self.Club==""
}
func (self Players)MarshalJSON() ([]byte, error) {
if len(self) == 0 {
return []byte("{}"), nil
}
var start rune = '{'
var b bytes.Buffer
for i:=0; i<len(self); i++ {
txt,err := json.Marshal((self)[i])
if err!=nil {
return nil,err
}
b.WriteString(fmt.Sprintf(`%c"%d":%s`, start, i, txt))
start=','
}
b.WriteRune('}')
return b.Bytes(), nil
}
func getTournaments() ([]*Tournament, error) {
result := make([]*Tournament, 0)
fileinfos, err := ioutil.ReadDir("data")
if err!=nil {
return nil, err
}
for _,f := range fileinfos {
filename:=f.Name()
if (f.Mode()&os.ModeType==0) && strings.HasSuffix(filename, ".json") {
t,err := load_tournament(filename[:len(filename)-len(".json")])
if err==nil {
result=append(result, t)
}
}
}
return result, nil
}
func not_allowed_in_name() string {
return `."/\:'`;
}