-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunits.go
104 lines (91 loc) · 2.54 KB
/
units.go
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
95
96
97
98
99
100
101
102
103
104
package main
import "strings"
type Unit int
const (
// Special tokens
GRAM Unit = iota
CUP
KILOGRAM
LITER
MILLILITER
MILLIGRAM
MICROGRAM
IU
KILOCALORIE
KILOJOULE
OUNCE
PINT
POUND
TABLESPOON
TEASPOON
COUNT
)
type UnitModel struct {
id Unit
factor float64
name string
abbr string
synonyms []string
}
var unitMap = map[Unit]*UnitModel{
GRAM: &UnitModel{GRAM, 1.0, "gram", "g", []string{"grams"}},
KILOGRAM: &UnitModel{KILOGRAM, 1000.0, "kilogram", "kg", []string{"kilograms"}},
MILLIGRAM: &UnitModel{MILLIGRAM, 0.001, "milligram", "mg", []string{"milligrams"}},
MICROGRAM: &UnitModel{MICROGRAM, 0.000001, "microgram", "µg", []string{"micrograms"}},
CUP: &UnitModel{CUP, 250.0, "cup", "cup", []string{"cups", "c"}},
LITER: &UnitModel{LITER, 1000.0, "liter", "L", []string{"liters", "l", "litre", "litres"}},
MILLILITER: &UnitModel{MILLILITER, 1.0, "milliliter", "mL", []string{"milliliters", "ml"}},
OUNCE: &UnitModel{OUNCE, 28.3495, "ounce", "oz", []string{"ounces"}},
PINT: &UnitModel{PINT, 473.176, "pint", "pt", []string{"pints"}},
POUND: &UnitModel{POUND, 453.592, "pound", "lb", []string{"pounds"}},
TABLESPOON: &UnitModel{TABLESPOON, 15.0, "tablespoon", "tbsp", []string{"tablespoons", "T", "tb", "tbl"}},
TEASPOON: &UnitModel{TEASPOON, 5.0, "teaspoon", "tsp", []string{"teaspoons", "t", "tsp"}},
IU: &UnitModel{IU, 0.0, "IU", "IU", []string{"iu", "internation-units"}},
KILOCALORIE: &UnitModel{KILOCALORIE, 0.0, "kilocalorie", "kcal", []string{"kilocalories"}},
KILOJOULE: &UnitModel{KILOJOULE, 0.0, "kilojoule", "kJ", []string{"kilojoules"}},
COUNT: &UnitModel{COUNT, 0.0, "<>", "<>", []string{}},
}
func (u Unit) String() string {
return unitMap[u].abbr
}
var synonym2Model map[string]*UnitModel
func loadSynonym2Model() {
synonym2Model = make(map[string]*UnitModel)
for _, model := range unitMap {
for _, synonym := range model.synonyms {
synonym2Model[synonym] = model
}
synonym2Model[model.name] = model
synonym2Model[model.abbr] = model
}
}
func getUnitModel(w string) *UnitModel {
if synonym2Model == nil {
loadSynonym2Model()
}
model, ok := synonym2Model[w]
if !ok {
model, ok = synonym2Model[strings.ToLower(w)]
}
if !ok {
return nil
} else {
return model
}
}
func getUnitName(w string) string {
model := getUnitModel(w)
if model != nil {
return model.name
} else {
return ""
}
}
func getUnitAbbr(w string) string {
model := getUnitModel(w)
if model != nil {
return model.abbr
} else {
return ""
}
}