package data import ( "bufio" "bytes" "io" "io/ioutil" "strconv" ) var hashComment = []byte("#") type CompassPoints struct { N int NE int E int SE int S int SW int W int NW int } type Range struct { Start int End int } func fileToScanner(filename string) (*bufio.Scanner, error) { data, err := ioutil.ReadFile(filename) if err != nil { return nil, err } return bufio.NewScanner(bytes.NewReader(data)), nil } func consumeString(scanner *bufio.Scanner) (string, error) { for scanner.Scan() { line := scanner.Bytes() if len(line) == 0 || line[0] == hashComment[0] { // Most .dat files use # for comments continue } comment := bytes.Index(line, hashComment) if comment > 0 { line = line[0:comment] } return string(bytes.TrimRight(line, "\r\n\t ")), nil } err := scanner.Err() if err == nil { return "", io.EOF } return "", err } func consumeInt(scanner *bufio.Scanner) (int, error) { str, err := consumeString(scanner) if err != nil { return 0, err } return strconv.Atoi(str) } func consumeIntPtr(to *int, scanner *bufio.Scanner) error { val, err := consumeInt(scanner) if err != nil { return err } *to = val return nil } func consumeIntPtrs(scanner *bufio.Scanner, ptrs ...*int) error { for _, ptr := range ptrs { if err := consumeIntPtr(ptr, scanner); err != nil { return err } } return nil } func consumeRange(scanner *bufio.Scanner) (Range, error) { var out Range err := consumeIntPtrs(scanner, &out.Start, &out.End) return out, err } func consumeCompassPoints(scanner *bufio.Scanner) (CompassPoints, error) { var out CompassPoints err := consumeIntPtrs( scanner, &out.N, &out.NE, &out.E, &out.SE, &out.S, &out.SW, &out.W, &out.NW, ) return out, err }