OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / github.com / johngb / langreg / datagen / language / genlang.go
1 package main
2
3 import (
4         "encoding/csv"
5         "errors"
6         "fmt"
7         "io/ioutil"
8         "os"
9 )
10
11 const (
12         langSource     = "datagen/language/language_codes.csv"
13         outputFileName = "language_code_info.go"
14 )
15
16 type lang struct {
17         code    string
18         nameEn  string
19         nameNat string
20 }
21
22 func decodeLang() *[]lang {
23
24         // read the csv file
25         csvfile, err := os.Open(langSource)
26         if err != nil {
27                 fmt.Println(err)
28                 os.Exit(1)
29         }
30         defer csvfile.Close()
31
32         // decode csv file
33         reader := csv.NewReader(csvfile)
34         // there are no empty fields
35         reader.FieldsPerRecord = 3
36
37         rawCSVdata, err := reader.ReadAll()
38         if err != nil {
39                 fmt.Println(err)
40                 os.Exit(1)
41         }
42
43         // move raw CSV data to struct
44         var row lang
45         var rows []lang
46
47         for _, v := range rawCSVdata {
48                 row.code = v[0]
49                 row.nameEn = v[1]
50                 row.nameNat = v[2]
51                 rows = append(rows, row)
52         }
53         return &rows
54 }
55
56 func generateSwitch(d []lang) (string, error) {
57         out := `// generated by "go generate"; DO NOT EDIT
58
59 package langreg
60
61 import (
62   "errors"
63   "fmt"
64 )
65
66 // LangCodeInfo returns the English and native language in its script for a
67 // given string, and an error if any.  If there are more than one official
68 // names for the language (either English or native), they are separated by a
69 // semi-colon (;)
70 // Language codes should always be lowercase, and this is enforced.
71 func LangCodeInfo(s string) (english, native string, err error) {
72
73   // codes have to be two characters long
74   if len(s) != 2 {
75     return "", "",
76       errors.New("ISO 639-1 language codes must be 2 characters long")
77   }
78   `
79
80         c1 := d[0].code[0]
81         out += fmt.Sprintf("\nswitch s[0] {\n\ncase %q:\nswitch s[1]{\n", c1)
82         for _, r := range d {
83                 // check that the code is exactly 2 characters long
84                 if !isCodeValid(r.code) {
85                         return "", fmt.Errorf("The code %q is not 2 characters long", r.code)
86                 }
87                 // new first letter of code
88                 if r.code[0] != c1 {
89                         // new first char
90                         c1 = r.code[0]
91                         out += fmt.Sprintf("}\n\ncase %q:\nswitch s[1]{\n", c1)
92                 }
93                 out += fmt.Sprintf("case %q:\nreturn %q, %q, nil\n", r.code[1], r.nameEn, r.nameNat)
94         }
95
96         out += `}
97         }
98         return "", "",
99                 fmt.Errorf("%q is not a valid ISO-639-1 language code", s)
100 }`
101
102         return out, nil
103 }
104
105 func isCodeValid(s string) bool {
106         if len(s) != 2 {
107                 return false
108         }
109         if s[0] < 'a' || s[0] > 'z' || s[1] < 'a' || s[1] > 'z' {
110                 return false
111         }
112         return true
113 }
114
115 func writeFile(s, fileName string) error {
116
117         b := []byte(s)
118         err := ioutil.WriteFile(fileName, b, 0644)
119         if err != nil {
120                 return errors.New("Couldn't write the file")
121         }
122         return nil
123 }
124
125 func main() {
126         rows := decodeLang()
127         res, _ := generateSwitch(*rows)
128         err := writeFile(res, outputFileName)
129         if err != nil {
130                 fmt.Println(err)
131         } else {
132                 fmt.Println("language_code_info.go generated")
133         }
134 }