package main import ( "encoding/json" "io" "log" "os" "text/template" ) const templateSkillDesc = `// Code generated by d2data. DO NOT EDIT. // source: cmd/d2data/d2data/skilldesc.json package skill var Desc = map[ID]Description{ {{- range $key, $value := . }} {{ $key }}: {Page: {{ $value.SkillPage }}, Row: {{ $value.SkillRow }}, Column: {{ $value.SkillColumn }}, ListRow: {{ $value.ListRow }}, IconCel: {{ $value.IconCel }} }, {{- end }} }` const templateSkills = `// Code generated by d2data. DO NOT EDIT. // source: cmd/d2data/d2data/skills.json package skill var Skills = map[ID]Skill{ {{- range $key, $value := . }} {{ $key }}: {Name: "{{ $value.Name }}", ID: {{ $key }}, LeftSkill: {{ if eq $value.Leftskill 1 }}true{{ else }}false{{ end }}, RightSkill: {{ if eq $value.Rightskill 1 }}true{{ else }}false{{ end }} }, {{- end }} }` type skillDesc struct { Skilldesc string `json:"skilldesc"` SkillPage int `json:"SkillPage"` SkillRow int `json:"SkillRow"` SkillColumn int `json:"SkillColumn"` ListRow int `json:"ListRow"` IconCel int `json:"IconCel"` StrName string `json:"str name"` StrShort string `json:"str short"` StrLong string `json:"str long"` StrAlt string `json:"str alt"` } type Skill struct { Leftskill int `json:"leftskill"` Rightskill int `json:"rightskill"` Name string `json:"skill"` } // Generate static code from https://github.com/blizzhackers/d2data data files. func main() { err := generateFromFile(templateSkillDesc, "cmd/d2data/d2data/skilldesc.json", "pkg/data/skill/skilldesc.go", &map[string]skillDesc{}) if err != nil { log.Fatal(err) } err = generateFromFile(templateSkills, "cmd/d2data/d2data/skills.json", "pkg/data/skill/skills.go", &map[string]Skill{}) if err != nil { log.Fatal(err) } } func generateFromFile(templateName, filePath, outPath string, unmarshallStruct interface{}) error { jsonFile, err := os.Open(filePath) if err != nil { return err } defer jsonFile.Close() byteValue, _ := io.ReadAll(jsonFile) err = json.Unmarshal(byteValue, &unmarshallStruct) if err != nil { return err } t := template.Must(template.New("tpl").Parse(templateName)) file, err := os.Create(outPath) if err != nil { return err } defer file.Close() return t.Execute(file, unmarshallStruct) }