-
Notifications
You must be signed in to change notification settings - Fork 0
/
gameinfo.go
123 lines (110 loc) · 2.44 KB
/
gameinfo.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
package sgf
import (
"strings"
"encoding/json"
"github.com/dhodges/sgfinfo/util"
)
type GameInfo map[string]string
func (gi GameInfo) String() string {
str := ""
for _, k := range util.KeysFromMap(gi) {
str += k + "[" + gi[k] + "]"
}
return ";" + str
}
func (gi GameInfo) ToJson() ([]byte, error) {
json_map := gi.clone()
for _, k := range util.KeysFromMap(gi) {
key := property2key(k)
if key != "" {
json_map[key] = json_map[k]
delete(json_map, k)
}
}
return json.Marshal(json_map)
}
func (gi GameInfo) FromJson(json_str string) (GameInfo, error) {
json_map, err := util.MapFromJson(json_str)
if err != nil {
return nil, err
}
gameInfo := make(GameInfo)
for k, _ := range json_map {
key := key2property(k)
if key != "" {
gameInfo[strings.ToUpper(key)] = json_map[k]
} else {
gameInfo[strings.ToUpper(k)] = json_map[k]
}
}
return gameInfo, nil
}
func (gi GameInfo) clone() map[string]string {
duplicate := make(map[string]string)
for k, v := range gi {
duplicate[k] = v
}
return duplicate
}
func property2key(propname string) string {
return propsToKeys[strings.ToUpper(propname)]
}
var propsToKeys = map[string]string{
"AN": "Annotator",
"PB": "PlayerBlackName",
"BR": "PlayerBlackRank",
"BT": "PlayerBlackTeam",
"SZ": "Boardsize",
"CA": "Charset",
"C": "Comment",
"CP": "Copyright",
"DT": "Date",
"EV": "Event",
"GC": "GameComment",
"GN": "GameName",
"HA": "Handicap",
"KM": "Komi",
"ON": "Opening",
"OT": "Overtime",
"PC": "Place",
"RE": "Result",
"RO": "Round",
"RU": "Rules",
"SO": "Source",
"TM": "TimeLimits",
"US": "User",
"PW": "PlayerWhiteName",
"WR": "PlayerWhiteRank",
"WT": "PlayerWhiteTeam",
}
func key2property(key string) string {
return keysToProps[strings.ToLower(key)]
}
var keysToProps = map[string]string{
"annotator": "AN",
"boardsize": "SZ",
"charset": "CA",
"comment": "C",
"copyright": "CP",
"date": "DT",
"event": "EV",
"gamecomment": "GC",
"gamename": "GN",
"handicap": "HA",
"komi": "KM",
"opening": "ON",
"overtime": "OT",
"place": "PC",
"result": "RE",
"round": "RO",
"rules": "RU",
"source": "SO",
"timelimits": "TM",
"user": "US",
"playerblackname": "PB",
"playerblackrank": "BR",
"playerblackteam": "BT",
"playerwhitename": "PW",
"playerwhiterank": "WR",
"playerwhiteteam": "WT",
}