Skip to content

Commit

Permalink
[NEW] add filter to charge-tracker log
Browse files Browse the repository at this point in the history
  • Loading branch information
HappyTobi committed Mar 22, 2023
1 parent 54a3358 commit a7ac4c2
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 5 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

Expand Down
3 changes: 3 additions & 0 deletions cmd/chargeTracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
15 changes: 14 additions & 1 deletion pkg/cmd/chargeTracker/chargeLog.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
Expand Down
18 changes: 14 additions & 4 deletions pkg/internal/chargeTracker/chargeLog.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down
16 changes: 16 additions & 0 deletions pkg/internal/chargeTracker/entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
46 changes: 46 additions & 0 deletions pkg/internal/chargeTracker/filter.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit a7ac4c2

Please sign in to comment.