File: bankdata_parser.go

package info (click to toggle)
golang-github-mitch000001-go-hbci 0.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 2,468 kB
  • sloc: java: 1,092; makefile: 5
file content (94 lines) | stat: -rw-r--r-- 2,168 bytes parent folder | download
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
package main

import (
	"bytes"
	"flag"
	"go/format"
	"io"
	"log"
	"os"
	"sort"
	"text/template"

	"golang.org/x/text/encoding/charmap"

	"github.com/mitch000001/go-hbci/bankinfo"
	"github.com/pkg/errors"
)

func main() {
	flag.Parse()
	bankdataFiles := flag.Args()
	if len(bankdataFiles) == 0 {
		log.Fatal("No file provided. Exiting...")
		os.Exit(1)
	}

	var bankInfos []bankinfo.BankInfo
	decoder := charmap.ISO8859_1.NewDecoder()
	for _, bankdata := range bankdataFiles {
		file, err := os.Open(bankdata)
		if err != nil {
			log.Fatalf("Cannot open file: %q", bankdata)
			os.Exit(1)
		}
		infos, err := bankinfo.ParseBankInfos(decoder.Reader(file))
		if err != nil {
			log.Fatalf("Parse error: %q", err)
			os.Exit(1)
		}
		bankInfos = append(bankInfos, infos...)
	}
	sort.Sort(bankinfo.SortableBankInfos(bankInfos))
	data, err := writeDataToGoFile(bankInfos)
	if err != nil {
		log.Fatalf("Error while writing generated source: %v", err)
		os.Exit(1)
	}
	goFile, err := os.Create("bankinfo/data.go")
	if err != nil {
		log.Fatalf("Cannot create file: %q", err)
		os.Exit(1)
	}
	_, err = io.Copy(goFile, data)
	if err != nil {
		log.Fatalf("Error while writing file: %q", err)
		os.Exit(1)
	}
	os.Exit(0)
}

func writeDataToGoFile(data []bankinfo.BankInfo) (io.Reader, error) {
	t, err := template.New("bank_data").Parse(dataTemplate)
	if err != nil {
		return nil, errors.WithMessage(err, "error while parsing template")
	}
	var buf bytes.Buffer
	err = t.Execute(&buf, data)
	if err != nil {
		return nil, errors.WithMessage(err, "error while executing template")
	}
	formattedBytes, err := format.Source(buf.Bytes())
	if err != nil {
		return nil, errors.WithMessage(err, "error while formatting source file")
	}
	return bytes.NewReader(formattedBytes), nil
}

const dataTemplate = `// Code generated by cmd/bankdata_parser DO NOT EDIT.

package bankinfo

var data = []BankInfo{
	{{range $element := .}}{
		BankID: "{{.BankID}}",
		BIC: "{{.BIC}}",
		VersionNumber: "{{.VersionNumber}}",
		URL: "{{.URL}}",
		VersionName: "{{.VersionName}}",
		Institute: {{.Institute | printf "%q" }},
		City: "{{.City}}",
		LastChanged: "{{.LastChanged}}",
	},
	{{end}}
}`