diff --git a/README.md b/README.md index b3dc0ac..4e1c11f 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,9 @@ The cli tool brings the http api to the terminal. | `warp charge-tracker log` | Get the charge tracker log (csv) | | `warp version` | Get the version of the warp cli | +Each command has a help page, which can be accessed with the `-h` or `--help` flag. +The help page prints the usage of the command and the available flags. + ## Configuration The configuration file is located at `~/.warp.yaml`. diff --git a/cmd/chargeTracker.go b/cmd/chargeTracker.go index c1ab298..47c3092 100644 --- a/cmd/chargeTracker.go +++ b/cmd/chargeTracker.go @@ -27,6 +27,9 @@ func ChargeLogCmd() *cobra.Command { chargeLogCmd.Flags().StringP("output", "o", "json", "Output format (json, yaml,csv)") chargeLogCmd.Flags().StringP("file", "f", "", "Output file (default: stdout)") + chargeLogCmd.Flags().StringP("user", "r", "", "Filter by username (case-insensitive)") + chargeLogCmd.Flags().IntP("month", "m", -1, "Filter by month (format: 1...12)") + chargeLogCmd.Flags().IntP("year", "y", -1, "Filter by year (format: YYYY)") return chargeLogCmd diff --git a/pkg/cmd/chargeTracker/chargeLog.go b/pkg/cmd/chargeTracker/chargeLog.go index 96cb8c4..37ed8ef 100644 --- a/pkg/cmd/chargeTracker/chargeLog.go +++ b/pkg/cmd/chargeTracker/chargeLog.go @@ -29,6 +29,19 @@ func ChargeLog(cmd *cobra.Command, args []string) error { requests = append(requests, request, userRequest) + /* + get filter params + */ + userFilter, _ := cmd.Flags().GetString("user") + monthFilter, _ := cmd.Flags().GetInt("month") + yearFilter, _ := cmd.Flags().GetInt("year") + + mFilter := chargeTracker.NewFilter("month", "", monthFilter) + yFilter := chargeTracker.NewFilter("year", "", yearFilter) + uFilter := chargeTracker.NewFilter("user", userFilter, -1) + + filters := chargeTracker.Filters(mFilter, yFilter, uFilter) + if err := tools.LoadGlobalParams(cmd, func(charger, username, password, output string) { for _, req := range requests { req.Warp = charger @@ -52,7 +65,7 @@ func ChargeLog(cmd *cobra.Command, args []string) error { user := users.NewUsersList(userRequest) users, _ := user.Load() - charges, err := chargeLog.Load(users) + charges, err := chargeLog.Load(users, filters) if err != nil { return err } diff --git a/pkg/internal/chargeTracker/chargeLog.go b/pkg/internal/chargeTracker/chargeLog.go index a16d483..88158e2 100644 --- a/pkg/internal/chargeTracker/chargeLog.go +++ b/pkg/internal/chargeTracker/chargeLog.go @@ -15,17 +15,17 @@ func NewChargeLog(request *warp.Request) *ChargeLog { return &ChargeLog{request: request} } -func (cl *ChargeLog) Load(users []*users.User) (*Charges, error) { +func (cl *ChargeLog) Load(users []*users.User, filters []Filter) (*Charges, error) { data, err := cl.request.Get() if err != nil { return nil, err } - return deserialize(data, users) + return deserialize(data, users, filters) } -func deserialize(data []byte, users []*users.User) (*Charges, error) { +func deserialize(data []byte, users []*users.User, filters []Filter) (*Charges, error) { userMapping := make(map[int]string, len(users)) for user := range users { @@ -62,7 +62,17 @@ func deserialize(data []byte, users []*users.User) (*Charges, error) { charge.PowerMeterStart = math.Float32frombits(meterStart) charge.PowerMeterEnd = math.Float32frombits(meterEnd) - charges.Charges = append(charges.Charges, charge) + addDataSet := true + for _, filter := range filters { + if !filter.Filter(charge) { + addDataSet = false + break + } + } + + if addDataSet { + charges.Charges = append(charges.Charges, charge) + } if len(string(buf)) == 0 { break diff --git a/pkg/internal/chargeTracker/entity.go b/pkg/internal/chargeTracker/entity.go index 3d83bb0..b7b2bc4 100644 --- a/pkg/internal/chargeTracker/entity.go +++ b/pkg/internal/chargeTracker/entity.go @@ -21,3 +21,19 @@ type Charges struct { type ChargeLog struct { request *warp.Request } + +type MonthFilter struct { + filterValue int +} + +type YearFilter struct { + filterValue int +} + +type UserFilter struct { + filterValue string +} + +type Filter interface { + Filter(*Charge) bool +} diff --git a/pkg/internal/chargeTracker/filter.go b/pkg/internal/chargeTracker/filter.go new file mode 100644 index 0000000..6dd3d2b --- /dev/null +++ b/pkg/internal/chargeTracker/filter.go @@ -0,0 +1,46 @@ +package chargeTracker + +import ( + "time" +) + +func Filters(filter ...Filter) []Filter { + filters := make([]Filter, 0) + for _, f := range filter { + if f != nil { + filters = append(filters, f) + } + } + return filters +} + +func NewFilter(filterName string, filterValue string, filterNumber int) Filter { + switch filterName { + case "month": + if filterNumber >= 1 && filterNumber <= 12 { + return &MonthFilter{filterValue: filterNumber} + } + case "year": + if filterNumber >= 2000 { + return &YearFilter{filterValue: filterNumber} + } + case "user": + if len(filterValue) > 0 { + return &UserFilter{filterValue: filterValue} + } + } + + return nil +} + +func (mf *MonthFilter) Filter(charge *Charge) bool { + return charge.Time.Month() == time.Month(mf.filterValue) +} + +func (yF *YearFilter) Filter(charge *Charge) bool { + return charge.Time.Year() == yF.filterValue +} + +func (uF *UserFilter) Filter(charge *Charge) bool { + return charge.User == uF.filterValue +}