This repository has been archived by the owner on Jul 2, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
converters.go
104 lines (88 loc) · 2.13 KB
/
converters.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 commands
import (
"fmt"
"strconv"
"github.com/ghodss/yaml"
)
var (
prettyBases = map[int]string{
2: "Binary",
8: "Octal",
10: "Decimal",
16: "Hexadecimal",
}
Converters = func() []Command {
var converters []Command
// YAML <> JSON
converters = append(converters, yamlToJson{
base: NewBase("YAML -> JSON", "Convert YAML to JSON"),
})
converters = append(converters, jsonToYaml{
base: NewBase("JSON -> YAML", "Convert JSON to YAML"),
})
// Number Base Converters
bases := []int{2, 8, 10, 16}
for _, from := range bases {
for _, to := range bases {
if from != to {
converters = append(converters, numberBaseConverter{
base: NewBase(fmt.Sprintf("%s -> %s", toPrettyBase(from), toPrettyBase(to)), ""),
fromBase: from,
toBase: to,
})
}
}
}
return converters
}
)
type jsonToYaml struct {
base
}
func (c jsonToYaml) Exec(rawJSON string) (string, error) {
yaml, err := yaml.JSONToYAML([]byte(rawJSON))
if err != nil {
return "", err
}
return string(yaml), nil
}
type yamlToJson struct {
base
}
func (c yamlToJson) Exec(rawYAML string) (string, error) {
json, err := yaml.YAMLToJSON([]byte(rawYAML))
if err != nil {
return "", err
}
return prettyJson(string(json))
}
type numberBaseConverter struct {
base
fromBase int
toBase int
}
func (c numberBaseConverter) Exec(rawDecimal string) (string, error) {
return convertNumberBase(rawDecimal, c.fromBase, c.toBase)
}
func (c numberBaseConverter) DisplayInput(input string) string {
return displayBasedNumber(input, c.fromBase)
}
func (c numberBaseConverter) DisplayOutput(input string) string {
return displayBasedNumber(input, c.toBase)
}
func convertNumberBase(input string, fromBase int, toBase int) (string, error) {
inputInt, err := strconv.ParseInt(input, fromBase, 64)
if err != nil {
return "", err
}
return strconv.FormatInt(inputInt, toBase), nil
}
func displayBasedNumber(input string, base int) string {
return fmt.Sprintf("%s (base %d)", input, base)
}
func toPrettyBase(base int) string {
if pretty, ok := prettyBases[base]; ok {
return pretty
}
return fmt.Sprintf("Base %d", base)
}