diff --git a/flags.go b/flags.go new file mode 100644 index 0000000..c510bde --- /dev/null +++ b/flags.go @@ -0,0 +1,72 @@ +package event + +import ( + "errors" + "flag" + "fmt" + "strconv" + "strings" +) + +var ( + eventTargetURL *string + eventHeaders *string + eventSecondsPerWrite *float64 + eventRateClasses *string + eventTotalPerSecond *float64 + + ErrInvalidFlags = errors.New("invalid flags") + ErrInvalidHeader = fmt.Errorf("%w: invalid --event-headers (missing =)", ErrInvalidFlags) + ErrInvalidRateClass = fmt.Errorf("%w: invalid --event-rate-classes (missing =)", ErrInvalidFlags) +) + +func RegisterFlags() { + eventTargetURL = flag.String("event-target-url", "", "URL to send events to") + eventHeaders = flag.String("event-headers", "", "key=value|key=value|... headers to include with events") + eventSecondsPerWrite = flag.Float64("event-seconds-per-write", 5.0, "write events to target every N seconds") + eventRateClasses = flag.String("event-rate-classes", "", "key=value=rate|key=value=rate|...") + eventTotalPerSecond = flag.Float64("event-total-per-second", 0.2, "write on average N total events per second") +} + +func (c *Client) HandleFlags() error { + if *eventTargetURL == "" { + return nil + } + + headers := map[string]string{} + + for _, pair := range strings.Split(*eventHeaders, "|") { + parts := strings.SplitN(pair, "=", 2) + if len(parts) != 2 { + return ErrInvalidHeader + } + + headers[parts[0]] = parts[1] + } + + target := c.AddTarget( + *eventTargetURL, + headers, + *eventSecondsPerWrite, + ) + + for _, rc := range strings.Split(*eventRateClasses, "|") { + parts := strings.SplitN(rc, "=", 3) + if len(parts) != 3 { + return ErrInvalidRateClass + } + + rate, err := strconv.ParseFloat(parts[3], 64) + if err != nil { + return fmt.Errorf("%w %w", ErrInvalidRateClass, err) + } + + target.AddRateClass(rate, parts[0], parts[1]) + } + + target.AddRateClass( + *eventTotalPerSecond, + ) + + return nil +}