/
qrcli.go
140 lines (116 loc) · 3.04 KB
/
qrcli.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"flag"
"fmt"
"image/png"
"io/ioutil"
"log"
"os"
"github.com/boombuler/barcode"
"github.com/boombuler/barcode/qr"
)
const (
version = "0.1.0"
)
func printUsage() {
fmt.Fprintf(os.Stderr,
"usage: qrcli [flags] [text]\n"+
" qrcli -out qr.png \"http://golang.org/\"\n")
flag.PrintDefaults()
os.Exit(0)
}
func printVersion() {
fmt.Fprintf(os.Stdout, "qrcli v%s\n", version)
os.Exit(0)
}
func handleLevelFlag(lvl string) qr.ErrorCorrectionLevel {
switch lvl {
case "M":
return qr.M
case "Q":
return qr.Q
case "H":
return qr.H
}
return qr.L
}
func main() {
var (
// global
showHelp = flag.Bool("help", false, "Show usage help")
showVersion = flag.Bool("version", false, "Show version")
inputFile = flag.String("file", "", "Input file")
outputFile = flag.String("out", "", "Output file")
level = flag.String("level", "L", "Error correction level (L|M|Q|H)")
size = flag.Int("size", 250, "Output image size")
// wifi
wifiAuth = flag.String("wifi-auth", "WPA", "Wifi authentication (WPA|WEP|nopass)")
wifiSSID = flag.String("wifi-ssid", "", "Wifi SSID")
wifiPassword = flag.String("wifi-pw", "", "Wifi password")
wifiHidden = flag.Bool("wifi-hidden", false, "Wifi hidden (true|false)")
// geo
geoLat = flag.String("geo-lat", "", "Geo deg N latitude")
geoLong = flag.String("geo-long", "", "Geo deg W longitude")
geoElev = flag.String("geo-elev", "", "Geo elevation")
// Google play
play = flag.String("googleplay", "", "Google Play uri, e.g. \"org.example.app\"")
)
flag.Parse()
if *showVersion {
printVersion()
}
if (flag.NArg() == 0 && *inputFile == "" && *wifiSSID == "" && *geoLat == "" && *play == "") || *showHelp {
printUsage()
}
var text string
args := flag.Args()
switch {
case *wifiSSID != "":
text = handleWifi(*wifiAuth, *wifiSSID, *wifiPassword, *wifiHidden)
case *geoLat != "":
text = handleGeo(*geoLat, *geoLong, *geoElev)
case *play != "":
text = handlePlay(*play)
case *inputFile != "":
text = handleInput(*inputFile)
case args[0] != "":
text = args[0]
}
qrcode, err := qr.Encode(text, handleLevelFlag(*level), qr.Auto)
if err != nil {
log.Fatal(err)
}
qrcode, err = barcode.Scale(qrcode, *size, *size)
if err != nil {
log.Fatal(err)
}
var f *os.File
if *outputFile != "" {
f, err = os.Create(*outputFile)
if err != nil {
log.Fatal(err)
}
} else {
f = os.Stdout
}
defer f.Close()
if err := png.Encode(f, qrcode); err != nil {
log.Fatal(err)
}
}
func handleInput(inputFile string) string {
dat, err := ioutil.ReadFile(inputFile)
if err != nil {
log.Fatal(err)
}
return string(dat)
}
func handlePlay(play string) string {
return fmt.Sprintf("market://details?id=%s", play)
}
func handleGeo(geoLat, geoLong, geoElev string) string {
return fmt.Sprintf("geo:%s,%s,%s", geoLat, geoLong, geoElev)
}
func handleWifi(wifiType string, wifiSSID string, wifiPassword string, wifiHidden bool) string {
return fmt.Sprintf("WIFI:T:%s;S:%s;P:%s;H:%t;", wifiType, wifiSSID, wifiPassword, wifiHidden)
}