Compare commits

...

34 commits

Author SHA1 Message Date
bece933718 chore(NOTICKET): Adds Dockerfile 2025-03-05 23:37:42 +01:00
fd320d9ec3 chore(): Migrates from the deprecated ioutil 2024-12-17 21:58:48 +01:00
6dbc5784df Add renovate.json 2024-01-14 20:48:48 +00:00
8c2797cc82 chore(): Adds checksum to the releases for verification 2023-07-02 22:12:14 +02:00
e3817dfa47 chore(): Adds gitea release API key 2023-07-02 21:50:02 +02:00
96f4ca7e0b chore(): Rearranging the pipeline to build a release properly 2023-07-02 21:45:22 +02:00
9939b75bdf chore(): Adds a pipeline based on tagging 2023-07-02 21:37:43 +02:00
00d1ef76f3 chore(): Tests building package in parallel 2023-07-02 21:27:25 +02:00
9e8a2a392f chore(): Adds pipeline dependency 2023-07-02 21:15:27 +02:00
b52312f876 chore(): Reconfigure pipeline 2023-07-02 21:14:30 +02:00
ae9cb43294 chore(): Adds go.mod file 2023-07-02 21:05:46 +02:00
27d3667372 chore(): Adds test pipeline 2023-07-02 21:03:33 +02:00
4ef54af009 Migrating to the new kingpin Envar() interface 2020-05-06 19:46:10 +02:00
f1ab9a64fb Fixing transparency default value in README 2020-03-07 08:21:24 +01:00
24f8a92ab4 Version bump to 0.1.3 2020-03-06 20:53:45 +01:00
7eae3e5464 [BUGFIX] Windows terminals that don't set TERM now properly set
--no-colors by default
2020-03-06 20:52:48 +01:00
ba165eb68c [BUGFIX] Transparency of 0 as default is stupid, let's fix it. 2020-03-06 20:15:46 +01:00
7c5bf90ced Version bump to 0.1.2 2020-03-01 11:09:36 +01:00
06ebdfb55b Fixing unittest after the bugfix 2020-03-01 11:08:50 +01:00
34fd79b312 [BUGFIX] Removing extra quotation added on --format
* Turns out the quotation is a part of "?format=" so it got removed
* Added a nice bonus of replacing spaces in --format with their proper
URL value
2020-03-01 11:07:18 +01:00
52f25ed46d Version bump to 0.1.1 2020-03-01 02:14:14 +01:00
0c94a216d9 Adding unittest 2020-03-01 02:13:37 +01:00
bd2dd75169 [BUGFIX] Transparency is now properly set
* Bugfix brought about by writing the unittest
* Headers are now set, to allow user override values (unittest)
* Changes to code to allow unittest
2020-03-01 02:11:58 +01:00
8c1fb7f177 Version bump to 0.1.0 2020-02-29 12:52:38 +01:00
49b983b5fb [BUGFIX] Sometimes not listening to the linter is the best idea you do 2020-02-29 12:50:37 +01:00
939ec82312 Documentation update 2020-02-29 12:37:17 +01:00
826d262d42 [Breaking Change] Another overhaul of the code
This was made possible by the previous overhaul and cleanup

* Code now uses strings.Builder instead of slices
* Fixed --add-frame flag to only work for PNG
* Moved --format to only work as ?format=
* Added --free-style to replace previous --format functionality
* Added explicit --download flag to download instead of print
* Added explicit --file-name flag to specify a file name to use
* Renamed --extra-information to --export-mode
* Updated the --export-mode with more useful information
2020-02-29 12:17:14 +01:00
d43443f885 Massive rehauling of the code.
* Moved the code away from all the if statements and switches
* Built a better foundation to build upon for future expension
* BUGFIX: Now if windows users want to download a PNG it can be in color
2020-02-29 10:34:00 +01:00
8d086fe7d4 Bumping version to 0.0.5 2020-02-27 00:17:49 +01:00
cea7b560d0 Welcome the --one-liner flag, terminal multiplexer lovers
* Adding a new --one-liner flag that will return the weather on one line
* Updating README with usage and tmux configuration example
2020-02-27 00:15:41 +01:00
2990b13f78 Minor fixup to the README 2020-02-26 20:20:49 +01:00
93a0465234 Version bump to 0.0.4 2020-02-26 20:11:37 +01:00
d256e127cf Feature enhancement: Adding -f/--format
* Adding the --format flag to leave it to the users to format their
queries
* Adding an --extra-information flag to print out some advanced
information
* Variable name change to make it more accurate, it's an affix
2020-02-26 20:07:27 +01:00
202fc60d38 Making use of environment variables and a better README 2020-02-26 19:18:19 +01:00
7 changed files with 796 additions and 240 deletions

183
.drone.yml Normal file
View 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
View 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"]

View file

@ -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
View file

@ -0,0 +1,3 @@
module go-cmw
go 1.20

412
main.go
View file

@ -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(&params)
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
View 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
View file

@ -0,0 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}