dorfylegends/backend/df/parse.go

90 lines
1.7 KiB
Go
Raw Normal View History

2022-04-13 15:01:20 +03:00
package df
import (
"encoding/xml"
"fmt"
"legendsbrowser/util"
"os"
)
// type DfWorld struct{}
2022-04-14 16:49:09 +03:00
// func parseDfWorld(d *xml.Decoder, start *xml.StartElement) (*DfWorld, error) { return nil, nil }
func (e *HistoricalEvent) Name() string { return "" }
func (e *HistoricalEventCollection) Name() string { return "" }
2022-04-13 15:01:20 +03:00
func Parse(file string) (*DfWorld, error) {
xmlFile, err := os.Open(file)
if err != nil {
fmt.Println(err)
}
fmt.Println("Successfully Opened", file)
defer xmlFile.Close()
converter := util.NewConvertReader(xmlFile)
d := xml.NewDecoder(converter)
for {
tok, err := d.Token()
if err != nil {
return nil, err
}
switch t := tok.(type) {
case xml.StartElement:
if t.Name.Local == "df_world" {
2022-04-14 16:49:09 +03:00
return parseDfWorld(d, &t)
2022-04-13 15:01:20 +03:00
}
}
}
// return nil, errors.New("Fehler!")
}
type Identifiable interface {
Id() int
}
type Parsable interface {
Parse(d *xml.Decoder, start *xml.StartElement) error
}
type IdentifiableParsable interface {
Identifiable
Parsable
}
2022-04-14 16:49:09 +03:00
func parseArray[T any](d *xml.Decoder, dest *[]T, creator func(*xml.Decoder, *xml.StartElement) (T, error)) {
2022-04-13 15:01:20 +03:00
for {
tok, err := d.Token()
if err != nil {
return // nil, err
}
switch t := tok.(type) {
case xml.StartElement:
2022-04-14 16:49:09 +03:00
x, _ := creator(d, &t)
2022-04-13 15:01:20 +03:00
*dest = append(*dest, x)
case xml.EndElement:
return
}
}
}
2022-04-14 16:49:09 +03:00
func parseMap[T Identifiable](d *xml.Decoder, dest *map[int]T, creator func(*xml.Decoder, *xml.StartElement) (T, error)) {
2022-04-13 15:01:20 +03:00
for {
tok, err := d.Token()
if err != nil {
return // nil, err
}
switch t := tok.(type) {
case xml.StartElement:
2022-04-14 16:49:09 +03:00
x, _ := creator(d, &t)
2022-04-13 15:01:20 +03:00
(*dest)[x.Id()] = x
case xml.EndElement:
return
}
}
}