Compare commits
34 commits
Author | SHA1 | Date | |
---|---|---|---|
bece933718 | |||
fd320d9ec3 | |||
6dbc5784df | |||
8c2797cc82 | |||
e3817dfa47 | |||
96f4ca7e0b | |||
9939b75bdf | |||
00d1ef76f3 | |||
9e8a2a392f | |||
b52312f876 | |||
ae9cb43294 | |||
27d3667372 | |||
4ef54af009 | |||
f1ab9a64fb | |||
24f8a92ab4 | |||
7eae3e5464 | |||
ba165eb68c | |||
7c5bf90ced | |||
06ebdfb55b | |||
34fd79b312 | |||
52f25ed46d | |||
0c94a216d9 | |||
bd2dd75169 | |||
8c1fb7f177 | |||
49b983b5fb | |||
939ec82312 | |||
826d262d42 | |||
d43443f885 | |||
8d086fe7d4 | |||
cea7b560d0 | |||
2990b13f78 | |||
93a0465234 | |||
d256e127cf | |||
202fc60d38 |
7 changed files with 796 additions and 240 deletions
183
.drone.yml
Normal file
183
.drone.yml
Normal file
|
@ -0,0 +1,183 @@
|
|||
---
|
||||
kind: pipeline
|
||||
name: test
|
||||
|
||||
steps:
|
||||
- name: test-code
|
||||
image: golang
|
||||
commands:
|
||||
- go get
|
||||
- go test
|
||||
|
||||
- name: run-code
|
||||
image: golang
|
||||
commands:
|
||||
- go get
|
||||
- go run .
|
||||
---
|
||||
kind: pipeline
|
||||
name: test-build
|
||||
|
||||
steps:
|
||||
- name: prepare
|
||||
image: golang
|
||||
commands:
|
||||
- go version
|
||||
|
||||
- name: build-linux-amd64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: linux
|
||||
GOARCH: amd64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o cmw-linux-amd64-${DRONE_COMMIT_SHA:0:8}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-darwin-amd64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: darwin
|
||||
GOARCH: amd64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o cmw-darwin-amd64-${DRONE_COMMIT_SHA:0:8}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-windows-amd64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: windows
|
||||
GOARCH: amd64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o cmw-windows-amd64-${DRONE_COMMIT_SHA:0:8}.exe
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-linux-arm64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: linux
|
||||
GOARCH: arm64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o cmw-linux-arm64-${DRONE_COMMIT_SHA:0:8}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-darwin-arm64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: darwin
|
||||
GOARCH: arm64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o cmw-darwin-arm64-${DRONE_COMMIT_SHA:0:8}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
depends_on:
|
||||
- test
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
name: build
|
||||
|
||||
steps:
|
||||
- name: prepare
|
||||
image: golang
|
||||
commands:
|
||||
- mkdir bin/
|
||||
|
||||
- name: build-linux-amd64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: linux
|
||||
GOARCH: amd64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o bin/cmw-linux-amd64-${DRONE_TAG}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-darwin-amd64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: darwin
|
||||
GOARCH: amd64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o bin/cmw-darwin-amd64-${DRONE_TAG}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-windows-amd64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: windows
|
||||
GOARCH: amd64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o bin/cmw-windows-amd64-${DRONE_TAG}.exe
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-linux-arm64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: linux
|
||||
GOARCH: arm64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o bin/cmw-linux-arm64-${DRONE_TAG}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: build-darwin-arm64
|
||||
image: golang
|
||||
environment:
|
||||
GOOS: darwin
|
||||
GOARCH: arm64
|
||||
commands:
|
||||
- go get
|
||||
- go build -o bin/cmw-darwin-arm64-${DRONE_TAG}
|
||||
depends_on:
|
||||
- prepare
|
||||
|
||||
- name: generate-checksum
|
||||
image: golang
|
||||
commands:
|
||||
- cd bin
|
||||
- md5sum * > ../md5sums.txt
|
||||
- sha512sum * > ../sha512sums.txt
|
||||
- cp ../md5sums.txt .
|
||||
- cp ../sha512sums.txt .
|
||||
depends_on:
|
||||
- build-linux-amd64
|
||||
- build-darwin-amd64
|
||||
- build-windows-amd64
|
||||
- build-linux-arm64
|
||||
- build-darwin-arm64
|
||||
|
||||
- name: gitea_release
|
||||
image: plugins/gitea-release
|
||||
settings:
|
||||
title: Release ${DRONE_TAG}
|
||||
note: This is the cmw release of version ${DRONE_TAG}
|
||||
api_key:
|
||||
from_secret:
|
||||
gitea_release
|
||||
base_url: https://scm.project42.io
|
||||
files: bin/*
|
||||
depends_on:
|
||||
- generate-checksum
|
||||
|
||||
depends_on:
|
||||
- test-build
|
||||
|
||||
trigger:
|
||||
event:
|
||||
- tag
|
14
Dockerfile
Normal file
14
Dockerfile
Normal file
|
@ -0,0 +1,14 @@
|
|||
FROM docker.io/library/golang:alpine as builder
|
||||
|
||||
ADD . /cmw
|
||||
|
||||
RUN apk add git && \
|
||||
cd /cmw && \
|
||||
go get -u . && \
|
||||
go build -o cmw
|
||||
|
||||
FROM docker.io/library/alpine:latest
|
||||
|
||||
COPY --from=builder /cmw/cmw /cmw
|
||||
|
||||
ENTRYPOINT ["/cmw"]
|
81
README.md
81
README.md
|
@ -2,6 +2,87 @@
|
|||
|
||||
`go-cmw` is a [cmw](https://gitlab.com/elazkani/cmw) rewrite in [Go](https://golang.org/).
|
||||
|
||||
# Usage
|
||||
|
||||
`go-cmw` features a good command-line interface thanks to `kingpin.v2`.
|
||||
|
||||
```console
|
||||
$ go-cmw --help
|
||||
usage: go-cmw [<flags>]
|
||||
|
||||
A small terminal wrapper around the wttr.in weather endpoint.
|
||||
|
||||
Flags:
|
||||
--help Show context-sensitive help (also try --help-long and --help-man).
|
||||
-L, --location=LOCATION Specify explicite location (--expert-mode)
|
||||
-l, --language=LANGUAGE Specify explicite language (--expert-mode)
|
||||
--v2 Display Data-Rich output
|
||||
-m, --metric Display weather in metric
|
||||
-u, --uscs Display weather in imperial
|
||||
-M, --meter-second Display wind in m/s
|
||||
-z, --zero Display current weather
|
||||
-o, --one Display current weather + 1 day
|
||||
-w, --two Display current weather + 2 days
|
||||
-A, --ignore-user-agent Ignore User-Agent and force ANSI output
|
||||
-F, --follow-link Do not display the 'Follow' line
|
||||
-n, --narrow Display narrow view (only day/night)
|
||||
-q, --quiet Display quiet version (no weather report)
|
||||
-Q, --super-quiet Display super quiet version (no weather report and no city)
|
||||
-N, --no-colors Display no colors (always enabled on windows
|
||||
-P, --png Download a weather PNG image
|
||||
-p, --add-frame Add a frame to the output (PNG only)
|
||||
-t, --transparency=255 Set transparency level (0-255) (PNG only) (--expert-mode)
|
||||
-d, --download Enables download mode (--expert-mode)
|
||||
--file-name="" Name download file (--expert-mode)
|
||||
-O, --one-liner One liner outpet (for the terminal multiplexer lovers out there)
|
||||
--format=FORMAT Specify a format query (e.g. "%l:+%c+%t") (--expert-mode)
|
||||
--free-style=FREE-STYLE Specify a free-style API call (--expert-mode)
|
||||
--expert-mode Print expert mode information
|
||||
--version Show application version.
|
||||
```
|
||||
|
||||
On top of the following command-line flags, `go-cmw` can also take advantage of environment variables `--expert-mode`.
|
||||
|
||||
|
||||
```console
|
||||
$ go-cmw --zero
|
||||
Weather report: Paris
|
||||
|
||||
\ / Clear
|
||||
.-. 1..4 °C
|
||||
― ( ) ― ↗ 11 km/h
|
||||
`-’ 10 km
|
||||
/ \ 0.3 mm
|
||||
```
|
||||
|
||||
`go-cmw` makes it easier to integrate the weather with your favorite terminal multiplexer.
|
||||
|
||||
```console
|
||||
$ go-cmw --one-liner
|
||||
Paris: ☀️ +4°C
|
||||
```
|
||||
|
||||
Example configuration for `tmux`.
|
||||
|
||||
```console
|
||||
# Let us update sensibly every 30 minutes
|
||||
set -g status-interval 1800
|
||||
|
||||
WEATHER='#(go-cmw --one-liner)'
|
||||
set -g status-right '... $WEATHER ...'
|
||||
```
|
||||
# Expert Mode
|
||||
|
||||
The commands labeled `--expert-mode` have special functionality attached to them.
|
||||
Some of them can be used as environment variables while others override `go-cmw`
|
||||
default functionality to provide the user with more flexible interface.
|
||||
|
||||
For more information about commands labeled `--expert-mode`
|
||||
|
||||
```console
|
||||
$ go-cmw --expert-mode
|
||||
```
|
||||
|
||||
# Reason
|
||||
|
||||
This project is a journey of learning Golang.
|
||||
|
|
3
go.mod
Normal file
3
go.mod
Normal file
|
@ -0,0 +1,3 @@
|
|||
module go-cmw
|
||||
|
||||
go 1.20
|
412
main.go
412
main.go
|
@ -3,62 +3,24 @@ package main
|
|||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
||||
)
|
||||
|
||||
// VERSION The version release
|
||||
const VERSION = "0.0.3"
|
||||
const VERSION = "0.1.5"
|
||||
|
||||
// AUTHOR The author name
|
||||
const AUTHOR = "Elia el Lazkani"
|
||||
|
||||
// Create a list of constants to figure out
|
||||
// the command line flags and translate them
|
||||
// into uri flags.
|
||||
const (
|
||||
METRIC = 1 << iota
|
||||
USCS
|
||||
METERSECOND
|
||||
ZERO
|
||||
ONE
|
||||
TWO
|
||||
IGNOREUSERAGENT
|
||||
FOLLOWLINK
|
||||
NARROW
|
||||
QUIET
|
||||
SUPERQUIET
|
||||
NOCOLORS
|
||||
ADDFRAME
|
||||
MIDTRANSPARENCY
|
||||
LOCATION
|
||||
LANGUAGE
|
||||
PNG
|
||||
VTWO
|
||||
)
|
||||
|
||||
// Create a list of constants to define
|
||||
// uri switches by flag.
|
||||
const (
|
||||
MetricSwitch = "m"
|
||||
UscsSwitch = "u"
|
||||
MeterSecondSwitch = "M"
|
||||
ZeroSwitch = "0"
|
||||
OneSwitch = "1"
|
||||
TwoSwitch = "2"
|
||||
IgnoreUserAgentSwitch = "A"
|
||||
FollowLinkSwitch = "F"
|
||||
NarrowSwitch = "n"
|
||||
QuietSwitch = "q"
|
||||
SuperQuietSwitch = "Q"
|
||||
NoColorsSwitch = "T"
|
||||
AddFrameSwitch = "p"
|
||||
MidTransparencySwitch = "T"
|
||||
var (
|
||||
switchesFlags = []string{"m", "u", "M", "0", "1", "2", "A", "F", "n", "q", "Q", "T", "p"}
|
||||
)
|
||||
|
||||
// We create a weather struct with the url
|
||||
|
@ -83,7 +45,7 @@ func (w weather) formatHeader(req *http.Request, headers map[string]string) *htt
|
|||
req.Header.Set("User-Agent", "curl")
|
||||
|
||||
for key, value := range headers {
|
||||
req.Header.Add(key, value)
|
||||
req.Header.Set(key, value)
|
||||
}
|
||||
return req
|
||||
}
|
||||
|
@ -109,21 +71,26 @@ func (w weather) get(req *http.Request, download bool) {
|
|||
|
||||
// `weather` method to print the weather
|
||||
func (w weather) print(resp *http.Response) {
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
log.Fatal("Error reading body. ", err)
|
||||
}
|
||||
fmt.Printf("%s\n", body)
|
||||
fmt.Printf("%s", body)
|
||||
}
|
||||
|
||||
// `weather` method to download the weather
|
||||
func (w weather) download(resp *http.Response) {
|
||||
splitURL := strings.Split(w.url, "/")
|
||||
filename := splitURL[len(splitURL)-1]
|
||||
var fName string
|
||||
if *fileName != "" {
|
||||
fName = *fileName
|
||||
} else {
|
||||
splitURL := strings.Split(w.url, "/")
|
||||
fName = splitURL[len(splitURL)-1]
|
||||
}
|
||||
|
||||
f, err := os.Create(filename)
|
||||
f, err := os.Create(fName)
|
||||
if err != nil {
|
||||
return
|
||||
log.Fatal("Error opening file. ", err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
|
@ -138,252 +105,217 @@ func getWheather(url string, headers map[string]string, download bool) {
|
|||
w.get(req, download)
|
||||
}
|
||||
|
||||
// Define a command parameters struct.
|
||||
// This will hold all the configurations
|
||||
// set by the command line parameters provided.
|
||||
type cmdParams struct {
|
||||
Flags int
|
||||
Transparency int
|
||||
Location string
|
||||
Language string
|
||||
}
|
||||
|
||||
// Create a method to figure out the command parameters
|
||||
// provided and translate them into uri parameters.
|
||||
// This will figure out if we need to download the PNG image
|
||||
// as well.
|
||||
func (cmdP *cmdParams) generateParamFormat() (string, bool, error) {
|
||||
var params []string
|
||||
var prefix []string
|
||||
var download bool
|
||||
prefix = append(prefix, "?")
|
||||
func generateParamFormat(switchesF []*bool, freeStyleF *string, formatF *string, oneLinerF *bool, pngF *bool, addFrameF *bool, transparencyF *int, downloadF *bool) (string, bool, error) {
|
||||
var params strings.Builder
|
||||
var prefix = "?"
|
||||
var downloadMode = *downloadF
|
||||
|
||||
if cmdP.Flags&METRIC == METRIC {
|
||||
params = append(params, MetricSwitch)
|
||||
// If --free-syle is specified, let's not bother and simply return it
|
||||
if *freeStyleF != "" {
|
||||
return *freeStyleF, downloadMode, nil
|
||||
}
|
||||
|
||||
if cmdP.Flags&USCS == USCS {
|
||||
params = append(params, UscsSwitch)
|
||||
// If --format is specified, let's return the format the user wants
|
||||
if *formatF != "" {
|
||||
re := regexp.MustCompile("\\s")
|
||||
var str strings.Builder
|
||||
|
||||
str.WriteString("?format=")
|
||||
str.WriteString(re.ReplaceAllString(*formatF, "%20"))
|
||||
return str.String(), downloadMode, nil
|
||||
}
|
||||
// If --one-liner is specified, we know the format is set so let's return it
|
||||
if *oneLinerF {
|
||||
return "?format=3", downloadMode, nil
|
||||
}
|
||||
|
||||
if cmdP.Flags&METERSECOND == METERSECOND {
|
||||
params = append(params, MeterSecondSwitch)
|
||||
for i, s := range switchesF {
|
||||
if *s {
|
||||
params.WriteString(switchesFlags[i])
|
||||
}
|
||||
}
|
||||
|
||||
if cmdP.Flags&ZERO == ZERO {
|
||||
params = append(params, ZeroSwitch)
|
||||
}
|
||||
if *pngF {
|
||||
prefix = "_"
|
||||
|
||||
if cmdP.Flags&ONE == ONE {
|
||||
params = append(params, OneSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&TWO == TWO {
|
||||
params = append(params, TwoSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&IGNOREUSERAGENT == IGNOREUSERAGENT {
|
||||
params = append(params, IgnoreUserAgentSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&FOLLOWLINK == FOLLOWLINK {
|
||||
params = append(params, FollowLinkSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&NARROW == NARROW {
|
||||
params = append(params, NarrowSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&QUIET == QUIET {
|
||||
params = append(params, QuietSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&SUPERQUIET == SUPERQUIET {
|
||||
params = append(params, SuperQuietSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&NOCOLORS == NOCOLORS {
|
||||
params = append(params, NoColorsSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&ADDFRAME == ADDFRAME {
|
||||
params = append(params, AddFrameSwitch)
|
||||
}
|
||||
|
||||
if cmdP.Flags&PNG == PNG {
|
||||
prefix[0] = "_"
|
||||
|
||||
if cmdP.Flags&MIDTRANSPARENCY == MIDTRANSPARENCY {
|
||||
params = append(params, MidTransparencySwitch)
|
||||
if *addFrameF {
|
||||
params.WriteString(switchesFlags[12])
|
||||
}
|
||||
|
||||
if cmdP.Transparency >= 0 && cmdP.Transparency <= 100 {
|
||||
params = append(params, strings.Join([]string{"_transparency=", string(cmdP.Transparency)}, ""))
|
||||
if *transparencyF >= 0 && *transparencyF <= 255 {
|
||||
params.WriteString("_transparency=")
|
||||
params.WriteString(strconv.Itoa(*transparencyF))
|
||||
}
|
||||
|
||||
params = append(params, ".png")
|
||||
download = true
|
||||
params.WriteString(".png")
|
||||
downloadMode = true
|
||||
}
|
||||
|
||||
params = append(prefix, strings.Join(params, ""))
|
||||
var affix strings.Builder
|
||||
affix.WriteString(prefix)
|
||||
affix.WriteString(params.String())
|
||||
|
||||
return strings.Join(params, ""), download, nil
|
||||
return affix.String(), downloadMode, nil
|
||||
}
|
||||
|
||||
// Defining the command-line interface
|
||||
var (
|
||||
app = kingpin.New("go-cmw", "A small terminal wrapper around the wttr.in weather endpoint.")
|
||||
metric = app.Flag("metric", "Display weather in metric").Short('m').Default("false").Bool()
|
||||
uscs = app.Flag("uscs", "Display weather in imperial").Short('u').Default("false").Bool()
|
||||
meterSecond = app.Flag("meter-second", "Display wind in m/s").Short('M').Default("false").Bool()
|
||||
zero = app.Flag("zero", "Show the weather now").Short('z').Default("false").Bool()
|
||||
one = app.Flag("one", "Show the weather for one day").Short('o').Default("false").Bool()
|
||||
two = app.Flag("two", "Show the weather for two days").Short('w').Default("false").Bool()
|
||||
ignoreUserAgent = app.Flag("ignore-user-agent", "Request ignoring the user agent").Short('A').Default("false").Bool()
|
||||
followLink = app.Flag("follow-link", "Follow link redirect").Short('F').Default("true").Bool()
|
||||
narrow = app.Flag("narrow", "Display weather in narrow view").Short('n').Default("false").Bool()
|
||||
quiet = app.Flag("quiet", "Add the quiet flag").Short('q').Default("false").Bool()
|
||||
superQuiet = app.Flag("super-quiet", "Add the super quiet flag").Short('Q').Default("false").Bool()
|
||||
noColors = app.Flag("no-colors", "Disable displaying colors (always enabled on windows").Short('N').Default("false").Bool()
|
||||
addFrame = app.Flag("add-frame", "Add a frame to the output").Short('p').Default("false").Bool()
|
||||
midTransparency = app.Flag("mid-transparency", "Enable mid-transparency (PNG only)").Short('T').Default("false").Bool()
|
||||
png = app.Flag("png", "Download a weather PNG image").Short('P').Default("false").Bool()
|
||||
v2 = app.Flag("v2", "Use the v2 endpoint").Default("false").Bool()
|
||||
transparency = app.Flag("transparency", "Set transparency level (0-100) (PNG only)").Short('t').Default("0").Int()
|
||||
location = app.Flag("location", "Specify explicite location").Short('L').String()
|
||||
language = app.Flag("language", "Specify explicite language").Short('l').String()
|
||||
app = kingpin.New("go-cmw", "A small terminal wrapper around the wttr.in weather endpoint.")
|
||||
location = app.Flag("location", "Specify explicite location (--expert-mode)").Short('L').Envar("GO_CMW_LOCATION").String()
|
||||
language = app.Flag("language", "Specify explicite language (--expert-mode)").Short('l').Envar("GO_CMW_LANGUAGE").String()
|
||||
v2 = app.Flag("v2", "Display Data-Rich output").Default("false").Bool()
|
||||
switches = []*bool{
|
||||
app.Flag("metric", "Display weather in metric").Short('m').Default("false").Bool(),
|
||||
app.Flag("uscs", "Display weather in imperial").Short('u').Default("false").Bool(),
|
||||
app.Flag("meter-second", "Display wind in m/s").Short('M').Default("false").Bool(),
|
||||
app.Flag("zero", "Display current weather").Short('z').Default("false").Bool(),
|
||||
app.Flag("one", "Display current weather + 1 day").Short('o').Default("false").Bool(),
|
||||
app.Flag("two", "Display current weather + 2 days").Short('w').Default("false").Bool(),
|
||||
app.Flag("ignore-user-agent", "Ignore User-Agent and force ANSI output").Short('A').Default("false").Bool(),
|
||||
app.Flag("follow-link", "Do not display the 'Follow' line").Short('F').Default("true").Bool(),
|
||||
app.Flag("narrow", "Display narrow view (only day/night)").Short('n').Default("false").Bool(),
|
||||
app.Flag("quiet", "Display quiet version (no weather report)").Short('q').Default("false").Bool(),
|
||||
app.Flag("super-quiet", "Display super quiet version (no weather report and no city)").Short('Q').Default("false").Bool(),
|
||||
app.Flag("no-colors", "Display no colors (always enabled on windows").Short('N').Default("false").Bool()}
|
||||
|
||||
png = app.Flag("png", "Download a weather PNG image").Short('P').Default("false").Bool()
|
||||
addFrame = app.Flag("add-frame", "Add a frame to the output (PNG only)").Short('p').Default("false").Bool()
|
||||
transparency = app.Flag("transparency", "Set transparency level (0-255) (PNG only) (--expert-mode)").Envar("GO_CMW_TRANSPARENCY").Short('t').Default("255").Int()
|
||||
download = app.Flag("download", "Enables download mode (--expert-mode)").Short('d').Default("false").Bool()
|
||||
fileName = app.Flag("file-name", "Name download file (--expert-mode)").Envar("GO_CMW_FILE_NAME").Default("").String()
|
||||
oneLiner = app.Flag("one-liner", "One liner outpet (for the terminal multiplexer lovers out there)").Short('O').Default("false").Bool()
|
||||
format = app.Flag("format", "Specify a format query (e.g. \"%l:+%c+%t\") (--expert-mode)").Envar("GO_CMW_FORMAT").String()
|
||||
freeStyle = app.Flag("free-style", "Specify a free-style API call (--expert-mode)").Envar("GO_CMW_FREE_STYLE").String()
|
||||
expertMode = app.Flag("expert-mode", "Print expert mode information").Default("false").Bool()
|
||||
)
|
||||
|
||||
// Special help menu
|
||||
func printExpertMode() {
|
||||
eInfo := `
|
||||
Expert Mode
|
||||
-----------
|
||||
|
||||
All commands flagged with --expert-mode override
|
||||
values/flags added by go-cmw.
|
||||
|
||||
This gives the user full control over
|
||||
the queries requested.
|
||||
|
||||
Environment Variables
|
||||
---------------------
|
||||
|
||||
go-cmw makes use of the following environment
|
||||
variables:
|
||||
|
||||
* GO_CMW_LOCATION for --location
|
||||
* GO_CMW_LANGUAGE for --language
|
||||
* GO_CMW_FORMAT for --format
|
||||
* GO_CMW_FREE_STYLE for --free-style
|
||||
* GO_CMW_FILE_NAME for --file-name
|
||||
* GO_CMW_TRANSPARENCY for --transparency
|
||||
|
||||
Supported Location Types
|
||||
------------------------
|
||||
|
||||
City name: Paris
|
||||
Unicode name: Москва
|
||||
Airport code (3 letters): muc
|
||||
Domain name: @stackoverflow.com
|
||||
Area code: 94107
|
||||
GPS coordinates: -78.46,106.79
|
||||
|
||||
Special Location
|
||||
----------------
|
||||
|
||||
Moon phase (add ,+US or
|
||||
,+France for these cities): moon
|
||||
Moon phase for a date: moon@2016-10-25
|
||||
|
||||
Format Flags (--format)
|
||||
------------
|
||||
|
||||
c Weather condition
|
||||
C Weather condition textual name
|
||||
h Humidity
|
||||
t Temperature
|
||||
w Wind
|
||||
l Location
|
||||
m Moonphase
|
||||
M Moonday
|
||||
p precipitation (mm)
|
||||
o Probability of Precipitation
|
||||
P pressure (hPa)
|
||||
|
||||
Supported languages
|
||||
-------------------
|
||||
|
||||
Supported: af be ca da de el et fr fa hu id it
|
||||
nb nl pl pt-br ro ru tr th uk vi
|
||||
zh-cn zh-tw
|
||||
`
|
||||
|
||||
println(eInfo)
|
||||
}
|
||||
|
||||
// Create a function to parse all the command line parameters
|
||||
// provided and save them in the parameter struct.
|
||||
func flagParser(cmdP *cmdParams) {
|
||||
// provided.
|
||||
func flagParser() {
|
||||
|
||||
app.Version(VERSION)
|
||||
app.Author(AUTHOR)
|
||||
|
||||
kingpin.MustParse(app.Parse(os.Args[1:]))
|
||||
|
||||
// Windows does not have color encoding
|
||||
if *expertMode {
|
||||
printExpertMode()
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
// Windows terminal does not have color encoding
|
||||
// so let's make sure windows users are happy
|
||||
term := os.Getenv("TERM")
|
||||
if term == "" {
|
||||
*noColors = true
|
||||
if os.Getenv("TERM") == "" && !*png && *format == "" && *freeStyle == "" {
|
||||
*switches[11] = true
|
||||
}
|
||||
|
||||
if *metric {
|
||||
cmdP.Flags += METRIC
|
||||
}
|
||||
|
||||
if *uscs {
|
||||
cmdP.Flags += USCS
|
||||
}
|
||||
|
||||
if *meterSecond {
|
||||
cmdP.Flags += METERSECOND
|
||||
}
|
||||
|
||||
if *zero {
|
||||
cmdP.Flags += ZERO
|
||||
}
|
||||
|
||||
if *one {
|
||||
cmdP.Flags += ONE
|
||||
}
|
||||
|
||||
if *two {
|
||||
cmdP.Flags += TWO
|
||||
}
|
||||
|
||||
if *ignoreUserAgent {
|
||||
cmdP.Flags += IGNOREUSERAGENT
|
||||
}
|
||||
|
||||
if *followLink {
|
||||
cmdP.Flags += FOLLOWLINK
|
||||
}
|
||||
|
||||
if *narrow {
|
||||
cmdP.Flags += NARROW
|
||||
}
|
||||
|
||||
if *quiet {
|
||||
cmdP.Flags += QUIET
|
||||
}
|
||||
|
||||
if *superQuiet {
|
||||
cmdP.Flags += SUPERQUIET
|
||||
}
|
||||
|
||||
if *noColors {
|
||||
cmdP.Flags += NOCOLORS
|
||||
}
|
||||
|
||||
if *addFrame {
|
||||
cmdP.Flags += ADDFRAME
|
||||
}
|
||||
|
||||
if *midTransparency {
|
||||
cmdP.Flags += MIDTRANSPARENCY
|
||||
}
|
||||
|
||||
if *transparency >= 0 && *transparency <= 100 {
|
||||
cmdP.Transparency = *transparency
|
||||
}
|
||||
|
||||
if *png {
|
||||
cmdP.Flags += PNG
|
||||
}
|
||||
|
||||
if *v2 {
|
||||
cmdP.Flags += VTWO
|
||||
}
|
||||
|
||||
if *location != "" {
|
||||
cmdP.Flags += LOCATION
|
||||
cmdP.Location = *location
|
||||
}
|
||||
|
||||
if *language != "" {
|
||||
cmdP.Flags += LANGUAGE
|
||||
cmdP.Language = *language
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Create a function to generate the url that we'll be calling shortly.
|
||||
func generateURL(domain string, v2 bool, location string, lang string, format string) ([]string, map[string]string) {
|
||||
var link []string
|
||||
func generateURL(domain string, v2 bool, location string, lang string, affix string) (string, map[string]string) {
|
||||
var link strings.Builder
|
||||
var headers = make(map[string]string)
|
||||
|
||||
link = append(link, "https://")
|
||||
link.WriteString("https://")
|
||||
|
||||
if v2 {
|
||||
link = append(link, "v2.")
|
||||
link.WriteString("v2.")
|
||||
}
|
||||
|
||||
link = append(link, domain, "/")
|
||||
link.WriteString(domain)
|
||||
link.WriteString("/")
|
||||
|
||||
if location != "" {
|
||||
link = append(link, location)
|
||||
link.WriteString(location)
|
||||
}
|
||||
|
||||
if format != "" {
|
||||
link = append(link, format)
|
||||
if affix != "" {
|
||||
link.WriteString(affix)
|
||||
}
|
||||
|
||||
if lang != "" {
|
||||
headers["Accept-Language"] = lang
|
||||
}
|
||||
|
||||
return link, headers
|
||||
return link.String(), headers
|
||||
}
|
||||
|
||||
// This is the main function that glues everything together.
|
||||
func main() {
|
||||
var params cmdParams = cmdParams{}
|
||||
var domain string = "wttr.in"
|
||||
flagParser(¶ms)
|
||||
format, download, _ := params.generateParamFormat()
|
||||
link, headers := generateURL(domain, params.Flags&VTWO == VTWO, params.Location, params.Language, format)
|
||||
getWheather(strings.Join(link, ""), headers, download)
|
||||
flagParser()
|
||||
affix, downloadFile, _ := generateParamFormat(switches, freeStyle, format, oneLiner, png, addFrame, transparency, download)
|
||||
link, headers := generateURL(domain, *v2, *location, *language, affix)
|
||||
getWheather(link, headers, downloadFile)
|
||||
}
|
||||
|
|
340
main_test.go
Normal file
340
main_test.go
Normal file
|
@ -0,0 +1,340 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var url = "https://wttr.in"
|
||||
|
||||
func headerEqual(req *http.Request, headers map[string][]string) bool {
|
||||
for key, value := range req.Header {
|
||||
if !reflect.DeepEqual(value, headers[key]) {
|
||||
fmt.Printf("Failed to get expected headers \"%s\": %s != %s", key, value, headers[key])
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
type newRequestResults struct {
|
||||
headers map[string]string
|
||||
expectedURL string
|
||||
expectedMethod string
|
||||
expectedHeaders map[string][]string
|
||||
expectedProto string
|
||||
}
|
||||
|
||||
var newRequestTestResults = []newRequestResults{
|
||||
{make(map[string]string), url, "GET", map[string][]string{"Content-Type": []string{"text/plain; charset=utf-8"}, "User-Agent": []string{"curl"}}, "HTTP/1.1"},
|
||||
{map[string]string{"Content-Type": "text/html"}, url, "GET", map[string][]string{"Content-Type": []string{"text/html"}, "User-Agent": []string{"curl"}, "Language": []string{"fr"}}, "HTTP/1.1"},
|
||||
{map[string]string{"Language": "fr"}, url, "GET", map[string][]string{"Content-Type": []string{"text/plain; charset=utf-8"}, "User-Agent": []string{"curl"}, "Language": []string{"fr"}}, "HTTP/1.1"},
|
||||
{map[string]string{"Language": "fr", "Location": "Berlin"}, url, "GET", map[string][]string{"Content-Type": []string{"text/plain; charset=utf-8"}, "User-Agent": []string{"curl"}, "Language": []string{"fr"}, "Location": []string{"Berlin"}}, "HTTP/1.1"},
|
||||
}
|
||||
|
||||
func TestNewRequest(t *testing.T) {
|
||||
w := weather{url}
|
||||
for _, requestResult := range newRequestTestResults {
|
||||
req := w.newRequest(requestResult.headers)
|
||||
if req.URL.String() != requestResult.expectedURL {
|
||||
t.Fatalf("Failed to get expected URL: %s != %s", req.URL.String(), requestResult.expectedURL)
|
||||
}
|
||||
if req.Method != requestResult.expectedMethod {
|
||||
t.Fatalf("Failed to get expected method: %s != %s", req.Method, requestResult.expectedMethod)
|
||||
}
|
||||
if req.Proto != requestResult.expectedProto {
|
||||
t.Fatalf("Failed to get expected protocol: %s != %s", req.Proto, requestResult.expectedProto)
|
||||
}
|
||||
|
||||
if !headerEqual(req, requestResult.expectedHeaders) {
|
||||
t.Fatal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFormatHeader(t *testing.T) {
|
||||
w := weather{url}
|
||||
req := httptest.NewRequest("GET", url, nil)
|
||||
|
||||
for _, requestResult := range newRequestTestResults {
|
||||
newReq := w.formatHeader(req, requestResult.headers)
|
||||
|
||||
if !headerEqual(newReq, requestResult.expectedHeaders) {
|
||||
t.Fatal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type generatedParams struct {
|
||||
switches []*bool
|
||||
freeStyle string
|
||||
format string
|
||||
oneLiner bool
|
||||
png bool
|
||||
addFrame bool
|
||||
transparency int
|
||||
download bool
|
||||
expectedAffix string
|
||||
expectedDownload bool
|
||||
}
|
||||
|
||||
var boolTrue = true
|
||||
var boolFalse = false
|
||||
|
||||
var generatedParamsResults = []generatedParams{
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?m", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?u", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?M", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?A", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?F", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?nq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?Q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?T", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mu", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mM", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?m0", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?m1", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?m2", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mA", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mF", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mnq", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?mQ", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?mT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mu", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?uM", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?u0", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?u1", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?u2", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?uA", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?uF", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?unq", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?uQ", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?uT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mM", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?uM", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?M0", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?M1", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?M2", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?MA", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?MF", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Mnq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?MQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?MT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?m0", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?u0", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?M0", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?01", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?02", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0A", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0F", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0nq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?0Q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?0T", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?m1", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?u1", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?M1", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?01", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?12", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1A", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1F", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1nq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?1Q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?1T", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?m2", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?u2", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?M2", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?02", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?12", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2A", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2F", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2nq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?2Q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?2T", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mA", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?uA", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?MA", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0A", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1A", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2A", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?AF", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Anq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?AQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?AT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mF", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?uF", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?MF", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0F", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1F", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2F", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?AF", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Fnq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?FQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?FT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mn", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?un", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Mn", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0n", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1n", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2n", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?An", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Fn", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?nQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?nT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?mq", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?uq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Mq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?0q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?1q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?2q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Aq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse}, "", "", false, false, false, 0, false, "?Fq", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?qQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?qT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?mQ", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?uQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?MQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?0Q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?1Q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?2Q", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?AQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?FQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolTrue, &boolFalse}, "", "", false, false, false, 0, false, "?nqQ", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue}, "", "", false, false, false, 0, false, "?QT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?mT", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?uT", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?MT", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?0T", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?1T", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?2T", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?AT", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?FT", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolTrue}, "", "", false, false, false, 0, false, "?nqT", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue}, "", "", false, false, false, 0, false, "?QT", false},
|
||||
|
||||
// FreeStyle
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", false, false, false, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", false, false, false, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", true, false, false, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", false, true, false, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", false, false, true, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", true, true, false, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", true, false, true, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", true, true, true, 0, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", false, false, false, 100, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "freestyle", "", true, false, false, 100, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "freestyle", "", false, true, false, 100, false, "freestyle", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "freestyle", "", false, false, true, 100, false, "freestyle", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", true, false, true, 100, false, "freestyle", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", true, true, false, 100, false, "freestyle", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "", true, true, true, 100, false, "freestyle", false},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "format", false, false, false, 0, true, "freestyle", true},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "format", false, true, false, 0, true, "freestyle", true},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "format", false, false, true, 0, true, "freestyle", true},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "freestyle", "format", true, false, false, 0, true, "freestyle", true},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "freestyle", "format", true, true, false, 0, true, "freestyle", true},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "freestyle", "format", true, false, true, 0, true, "freestyle", true},
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "freestyle", "format", true, true, true, 0, true, "freestyle", true},
|
||||
|
||||
// Format
|
||||
{[]*bool{&boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "format", false, false, false, 0, false, "?format=format", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "format", true, false, false, 0, false, "?format=format", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "format", false, true, false, 100, false, "?format=format", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "format", false, false, true, 0, false, "?format=format", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "format", true, true, false, 100, false, "?format=format", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "format", true, false, true, 0, false, "?format=format", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "format", true, true, true, 100, false, "?format=format", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "format", false, false, false, 0, true, "?format=format", true},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "format", false, false, false, 100, true, "?format=format", true},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "format", false, false, false, 0, true, "?format=format", true},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", true, false, false, 0, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, true, false, 0, false, "_uM_transparency=0.png", true},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, true, 0, false, "?M0", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", true, true, false, 0, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", true, false, true, 0, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", true, true, true, 0, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 100, false, "?MF", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse}, "", "", true, false, false, 100, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolFalse}, "", "", false, true, false, 100, false, "_MQ_transparency=100.png", true},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolTrue}, "", "", false, false, true, 100, false, "?MT", false},
|
||||
|
||||
{[]*bool{&boolTrue, &boolFalse, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", true, true, false, 100, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolTrue, &boolFalse, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", true, false, true, 100, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", true, true, true, 100, false, "?format=3", false},
|
||||
{[]*bool{&boolFalse, &boolFalse, &boolFalse, &boolTrue, &boolTrue, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse, &boolFalse}, "", "", false, false, false, 0, true, "?01", true},
|
||||
}
|
||||
|
||||
func TestGenerateParamFormat(t *testing.T) {
|
||||
|
||||
for _, p := range generatedParamsResults {
|
||||
f, d, _ := generateParamFormat(p.switches, &p.freeStyle, &p.format, &p.oneLiner, &p.png, &p.addFrame, &p.transparency, &p.download)
|
||||
if f != p.expectedAffix {
|
||||
t.Fatalf("Failed to get expected affix: %s != %s", f, p.expectedAffix)
|
||||
}
|
||||
|
||||
if d != p.expectedDownload {
|
||||
t.Fatalf("Failed to get expected download: %t != %t", d, p.expectedDownload)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type generateURLResults struct {
|
||||
domain string
|
||||
v2 bool
|
||||
location string
|
||||
lang string
|
||||
affix string
|
||||
expectedURL string
|
||||
expectedHeaders map[string]string
|
||||
}
|
||||
|
||||
var domain = "wttr.in"
|
||||
|
||||
var generateURLTestResults = []generateURLResults{
|
||||
{domain, false, "", "", "", "https://wttr.in/", map[string]string{}},
|
||||
{domain, false, "", "de", "", "https://wttr.in/", map[string]string{"Accept-Language": "de"}},
|
||||
{domain, false, "", "de", "?affix", "https://wttr.in/?affix", map[string]string{"Accept-Language": "de"}},
|
||||
{domain, false, "Paris", "", "", "https://wttr.in/Paris", map[string]string{}},
|
||||
{domain, false, "Paris", "de", "", "https://wttr.in/Paris", map[string]string{"Accept-Language": "de"}},
|
||||
{domain, false, "Paris", "de", "?affix", "https://wttr.in/Paris?affix", map[string]string{"Accept-Language": "de"}},
|
||||
{domain, true, "", "", "", "https://v2.wttr.in/", map[string]string{}},
|
||||
{domain, true, "", "de", "", "https://v2.wttr.in/", map[string]string{"Accept-Language": "de"}},
|
||||
{domain, true, "", "de", "?affix", "https://v2.wttr.in/?affix", map[string]string{"Accept-Language": "de"}},
|
||||
{domain, true, "Paris", "", "", "https://v2.wttr.in/Paris", map[string]string{}},
|
||||
{domain, true, "Paris", "de", "", "https://v2.wttr.in/Paris", map[string]string{"Accept-Language": "de"}},
|
||||
{domain, true, "Paris", "de", "?affix", "https://v2.wttr.in/Paris?affix", map[string]string{"Accept-Language": "de"}},
|
||||
}
|
||||
|
||||
func TestGenerateURL(t *testing.T) {
|
||||
|
||||
for _, g := range generateURLTestResults {
|
||||
a, h := generateURL(g.domain, g.v2, g.location, g.lang, g.affix)
|
||||
if a != g.expectedURL {
|
||||
t.Fatalf("Failed to get expected URL: %s != %s", a, g.expectedURL)
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(h, g.expectedHeaders) {
|
||||
t.Fatalf("Failed to get expected headers: %s != %s", h, g.expectedHeaders)
|
||||
}
|
||||
}
|
||||
}
|
3
renovate.json
Normal file
3
renovate.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue