diff --git a/config/config.go b/config/config.go index c5f71bc..f435985 100644 --- a/config/config.go +++ b/config/config.go @@ -6,6 +6,7 @@ import ( "os" "time" + . "github.com/aykhans/dodo/types" "github.com/aykhans/dodo/utils" "github.com/jedib0t/go-pretty/v6/table" ) @@ -92,12 +93,12 @@ func (config *RequestConfig) GetMaxConns(minConns uint) uint { } type Config struct { - Method string `json:"method" validate:"http_method"` // custom validations: http_method - URL string `json:"url" validate:"http_url,required"` - Timeout uint32 `json:"timeout" validate:"gte=1,lte=100000"` - DodosCount uint `json:"dodos_count" validate:"gte=1"` - RequestCount uint `json:"request_count" validation_name:"request-count" validate:"gte=1"` - NoProxyCheck utils.Option[bool] `json:"no_proxy_check"` + Method string `json:"method" validate:"http_method"` // custom validations: http_method + URL string `json:"url" validate:"http_url,required"` + Timeout uint32 `json:"timeout" validate:"gte=1,lte=100000"` + DodosCount uint `json:"dodos_count" validate:"gte=1"` + RequestCount uint `json:"request_count" validation_name:"request-count" validate:"gte=1"` + NoProxyCheck Option[bool] `json:"no_proxy_check"` } func NewConfig( @@ -105,10 +106,10 @@ func NewConfig( timeout uint32, dodosCount uint, requestCount uint, - noProxyCheck utils.Option[bool], + noProxyCheck Option[bool], ) *Config { if noProxyCheck == nil { - noProxyCheck = utils.NewNoneOption[bool]() + noProxyCheck = NewNoneOption[bool]() } return &Config{ @@ -155,7 +156,7 @@ func (config *Config) SetDefaults() { config.RequestCount = DefaultRequestCount } if config.NoProxyCheck.IsNone() { - config.NoProxyCheck = utils.NewOption(false) + config.NoProxyCheck = NewOption(false) } } diff --git a/readers/cli.go b/readers/cli.go index b16b556..6ed52a4 100644 --- a/readers/cli.go +++ b/readers/cli.go @@ -5,6 +5,7 @@ import ( "github.com/aykhans/dodo/config" "github.com/aykhans/dodo/custom_errors" + . "github.com/aykhans/dodo/types" "github.com/aykhans/dodo/utils" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -61,7 +62,7 @@ func CLIConfigReader() (*config.CLIConfig, error) { case "timeout": cliConfig.Timeout = timeout case "no-proxy-check": - cliConfig.NoProxyCheck = utils.NewOption(noProxyCheck) + cliConfig.NoProxyCheck = NewOption(noProxyCheck) } }) if returnNil { diff --git a/types/durations.go b/types/durations.go new file mode 100644 index 0000000..18fcf9c --- /dev/null +++ b/types/durations.go @@ -0,0 +1,41 @@ +package types + +import ( + "sort" + "time" +) + +type Durations []time.Duration + +func (d Durations) Sort(ascending ...bool) { + // If ascending is provided and is false, sort in descending order + if len(ascending) > 0 && ascending[0] == false { + sort.Slice(d, func(i, j int) bool { + return d[i] > d[j] + }) + } else { // Otherwise, sort in ascending order + sort.Slice(d, func(i, j int) bool { + return d[i] < d[j] + }) + } +} + +func (d Durations) First() *time.Duration { + return &d[0] +} + +func (d Durations) Last() *time.Duration { + return &d[len(d)-1] +} + +func (d Durations) Sum() time.Duration { + sum := time.Duration(0) + for _, duration := range d { + sum += duration + } + return sum +} + +func (d Durations) Avg() time.Duration { + return d.Sum() / time.Duration(len(d)) +} diff --git a/utils/types.go b/types/option.go similarity index 99% rename from utils/types.go rename to types/option.go index 92f65b9..55dc6ee 100644 --- a/utils/types.go +++ b/types/option.go @@ -1,4 +1,4 @@ -package utils +package types import ( "encoding/json"