support -h
parent
9af98c5924
commit
2ef4799a94
58
config.go
58
config.go
|
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
@ -29,20 +30,29 @@ type Data struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func newConfig() (Config, error) {
|
func newConfig() (Config, error) {
|
||||||
var result Config
|
dataPoints := envOr("DATA_POINTS", `[[1, 1], [2, 2], [2, 2]]`)
|
||||||
result.Data.Points = [][]float64{
|
dataLabels := envOr("DATA_LABELS", ``)
|
||||||
[]float64{1, 1},
|
dataWeightFloor := envOr("DATA_WEIGHT_FLOOR", `12`)
|
||||||
[]float64{2, 2},
|
dataWeightRange := envOr("DATA_WEIGHT_RANGE", `20`)
|
||||||
[]float64{2, 2},
|
dataTitle := envOr("DATA_TITLE", ``)
|
||||||
}
|
dataSubtitle := envOr("DATA_SUBTITLE", ``)
|
||||||
result.Data.Weight.Floor = 12
|
output := envOr("OUTPUT", `file:///tmp/f`)
|
||||||
result.Data.Weight.Range = 20
|
|
||||||
result.Output = url.URL{Scheme: "file", Path: "/tmp/f"}
|
|
||||||
result.Data.Title = os.Getenv("TITLE")
|
|
||||||
result.Data.Subtitle = os.Getenv("SUBTITLE")
|
|
||||||
|
|
||||||
if js := os.Getenv("POINTS_JSON"); js == "" {
|
fs := flag.NewFlagSet("cmd", flag.ContinueOnError)
|
||||||
} else if err := json.Unmarshal([]byte(js), &result.Data.Points); err != nil {
|
fs.StringVar(&dataPoints, "data-points", dataPoints, `JSON [[x, y, z, ...]]`)
|
||||||
|
fs.StringVar(&dataLabels, "data-labels", dataLabels, `(optional) JSON ["foo", "bar", "baz"]`)
|
||||||
|
fs.StringVar(&dataWeightFloor, "data-weight-floor", dataWeightFloor, `int min point size`)
|
||||||
|
fs.StringVar(&dataWeightRange, "data-weight-range", dataWeightRange, `int max point scale up`)
|
||||||
|
fs.StringVar(&dataTitle, "data-title", dataTitle, `chart title`)
|
||||||
|
fs.StringVar(&dataSubtitle, "data-subtitle", dataSubtitle, `chart subtitle`)
|
||||||
|
fs.StringVar(&output, "output", output, `scheme://location`)
|
||||||
|
if err := fs.Parse(os.Args[1:]); err != nil {
|
||||||
|
return Config{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result Config
|
||||||
|
|
||||||
|
if err := json.Unmarshal([]byte(dataPoints), &result.Data.Points); err != nil {
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,31 +67,28 @@ func newConfig() (Config, error) {
|
||||||
result.Data.Labels[i] = fmt.Sprintf("%c", byte(int('A')+i))
|
result.Data.Labels[i] = fmt.Sprintf("%c", byte(int('A')+i))
|
||||||
}
|
}
|
||||||
|
|
||||||
if js := os.Getenv("LABELS_JSON"); js == "" {
|
if dataLabels == "" {
|
||||||
} else if err := json.Unmarshal([]byte(js), &result.Data.Labels); err != nil {
|
} else if err := json.Unmarshal([]byte(dataLabels), &result.Data.Labels); err != nil {
|
||||||
return result, err
|
return result, err
|
||||||
} else if len(result.Data.Labels) < len(result.Data.Points[0]) {
|
} else if len(result.Data.Labels) < len(result.Data.Points[0]) {
|
||||||
return result, fmt.Errorf("expected at least %d labels but got %d", len(result.Data.Points[0]), len(result.Data.Labels))
|
return result, fmt.Errorf("expected at least %d labels but got %d", len(result.Data.Points[0]), len(result.Data.Labels))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if js := os.Getenv("WEIGHT_RANGE"); js == "" {
|
if err := json.Unmarshal([]byte(dataWeightRange), &result.Data.Weight.Range); err != nil {
|
||||||
} else if err := json.Unmarshal([]byte(js), &result.Data.Weight.Range); err != nil {
|
|
||||||
return result, err
|
return result, err
|
||||||
} else if result.Data.Weight.Range < 0 {
|
} else if result.Data.Weight.Range < 0 {
|
||||||
return result, fmt.Errorf("found negative weight range %d", result.Data.Weight.Range)
|
return result, fmt.Errorf("found negative weight range %d", result.Data.Weight.Range)
|
||||||
}
|
}
|
||||||
|
|
||||||
if js := os.Getenv("WEIGHT_FLOOR"); js == "" {
|
if err := json.Unmarshal([]byte(dataWeightFloor), &result.Data.Weight.Floor); err != nil {
|
||||||
} else if err := json.Unmarshal([]byte(js), &result.Data.Weight.Floor); err != nil {
|
|
||||||
return result, err
|
return result, err
|
||||||
} else if result.Data.Weight.Floor < 0 {
|
} else if result.Data.Weight.Floor < 0 {
|
||||||
return result, fmt.Errorf("found negative weight floor %d", result.Data.Weight.Floor)
|
return result, fmt.Errorf("found negative weight floor %d", result.Data.Weight.Floor)
|
||||||
}
|
}
|
||||||
|
|
||||||
if s := os.Getenv("OUTPUT"); s == "" {
|
if u, err := url.Parse(output); err != nil {
|
||||||
} else if u, err := url.Parse(s); err != nil {
|
return result, fmt.Errorf("failed to parse $OUTPUT (%s): %w", output, err)
|
||||||
return result, fmt.Errorf("failed to parse $OUTPUT (%s): %w", s, err)
|
|
||||||
} else {
|
} else {
|
||||||
result.Output = *u
|
result.Output = *u
|
||||||
}
|
}
|
||||||
|
|
@ -89,6 +96,13 @@ func newConfig() (Config, error) {
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func envOr(k, v string) string {
|
||||||
|
if s := os.Getenv(k); s != "" {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
func (d Data) AsScatterData() (string, []float64, string, []opts.ScatterData, error) {
|
func (d Data) AsScatterData() (string, []float64, string, []opts.ScatterData, error) {
|
||||||
if !(2 <= len(d.Labels) && len(d.Labels) <= 3) {
|
if !(2 <= len(d.Labels) && len(d.Labels) <= 3) {
|
||||||
return "", nil, "", nil, fmt.Errorf("cannot map %d dimensions to [2,3]", len(d.Labels))
|
return "", nil, "", nil, fmt.Errorf("cannot map %d dimensions to [2,3]", len(d.Labels))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue