From 2ef4799a944c03a250aa023cbfca35917170988a Mon Sep 17 00:00:00 2001 From: bel Date: Wed, 14 Feb 2024 09:10:58 -0700 Subject: [PATCH] support -h --- config.go | 58 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/config.go b/config.go index e01e6e6..7af55a6 100644 --- a/config.go +++ b/config.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "flag" "fmt" "log" "net/url" @@ -29,20 +30,29 @@ type Data struct { } func newConfig() (Config, error) { - var result Config - result.Data.Points = [][]float64{ - []float64{1, 1}, - []float64{2, 2}, - []float64{2, 2}, - } - result.Data.Weight.Floor = 12 - 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") + dataPoints := envOr("DATA_POINTS", `[[1, 1], [2, 2], [2, 2]]`) + dataLabels := envOr("DATA_LABELS", ``) + dataWeightFloor := envOr("DATA_WEIGHT_FLOOR", `12`) + dataWeightRange := envOr("DATA_WEIGHT_RANGE", `20`) + dataTitle := envOr("DATA_TITLE", ``) + dataSubtitle := envOr("DATA_SUBTITLE", ``) + output := envOr("OUTPUT", `file:///tmp/f`) - if js := os.Getenv("POINTS_JSON"); js == "" { - } else if err := json.Unmarshal([]byte(js), &result.Data.Points); err != nil { + fs := flag.NewFlagSet("cmd", flag.ContinueOnError) + 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 } @@ -57,31 +67,28 @@ func newConfig() (Config, error) { result.Data.Labels[i] = fmt.Sprintf("%c", byte(int('A')+i)) } - if js := os.Getenv("LABELS_JSON"); js == "" { - } else if err := json.Unmarshal([]byte(js), &result.Data.Labels); err != nil { + if dataLabels == "" { + } else if err := json.Unmarshal([]byte(dataLabels), &result.Data.Labels); err != nil { return result, err } 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)) } } - if js := os.Getenv("WEIGHT_RANGE"); js == "" { - } else if err := json.Unmarshal([]byte(js), &result.Data.Weight.Range); err != nil { + if err := json.Unmarshal([]byte(dataWeightRange), &result.Data.Weight.Range); err != nil { return result, err } else if result.Data.Weight.Range < 0 { return result, fmt.Errorf("found negative weight range %d", result.Data.Weight.Range) } - if js := os.Getenv("WEIGHT_FLOOR"); js == "" { - } else if err := json.Unmarshal([]byte(js), &result.Data.Weight.Floor); err != nil { + if err := json.Unmarshal([]byte(dataWeightFloor), &result.Data.Weight.Floor); err != nil { return result, err } else if result.Data.Weight.Floor < 0 { return result, fmt.Errorf("found negative weight floor %d", result.Data.Weight.Floor) } - if s := os.Getenv("OUTPUT"); s == "" { - } else if u, err := url.Parse(s); err != nil { - return result, fmt.Errorf("failed to parse $OUTPUT (%s): %w", s, err) + if u, err := url.Parse(output); err != nil { + return result, fmt.Errorf("failed to parse $OUTPUT (%s): %w", output, err) } else { result.Output = *u } @@ -89,6 +96,13 @@ func newConfig() (Config, error) { 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) { if !(2 <= len(d.Labels) && len(d.Labels) <= 3) { return "", nil, "", nil, fmt.Errorf("cannot map %d dimensions to [2,3]", len(d.Labels))