diff --git a/cmd/main.go b/cmd/main.go index 6c30d6c..ed8ed0f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -94,6 +94,8 @@ var ( func main() { log.SetOutput(os.Stderr) + log.SetPrefix("NOTE: ") + log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime)) shortUsage := "A tool to filter EC2 Instance Types based on various resource criteria" longUsage := binName + ` is a CLI tool to filter EC2 instance types based on resource criteria. @@ -232,7 +234,7 @@ Full docs can be found at github.com/aws/amazon-` + binName outputFlag := cli.StringMe(flags[output]) outputFn := getOutputFn(outputFlag, selector.InstanceTypesOutputFn(resultsOutputFn)) - instanceTypes, err := instanceSelector.FilterWithOutput(filters, outputFn) + instanceTypes, itemsTruncated, err := instanceSelector.FilterWithOutput(filters, outputFn) if err != nil { fmt.Printf("An error occurred when filtering instance types: %v", err) os.Exit(1) @@ -245,6 +247,10 @@ Full docs can be found at github.com/aws/amazon-` + binName for _, instanceType := range instanceTypes { fmt.Println(instanceType) } + + if itemsTruncated > 0 { + log.Printf("%d entries were truncated, increase --%s to see more", itemsTruncated, maxResults) + } } func getOutputFn(outputFlag *string, currentFn selector.InstanceTypesOutputFn) selector.InstanceTypesOutputFn { diff --git a/pkg/selector/selector.go b/pkg/selector/selector.go index ed73fd8..7b22dea 100644 --- a/pkg/selector/selector.go +++ b/pkg/selector/selector.go @@ -81,7 +81,8 @@ func New(sess *session.Session) *Selector { // matching the criteria within Filters and returns a simple list of instance type strings func (itf Selector) Filter(filters Filters) ([]string, error) { outputFn := InstanceTypesOutputFn(outputs.SimpleInstanceTypeOutput) - return itf.FilterWithOutput(filters, outputFn) + output, _, err := itf.FilterWithOutput(filters, outputFn) + return output, err } // FilterVerbose accepts a Filters struct which is used to select the available instance types @@ -91,31 +92,31 @@ func (itf Selector) FilterVerbose(filters Filters) ([]*ec2.InstanceTypeInfo, err if err != nil { return nil, err } - instanceTypeInfoSlice = itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice) + instanceTypeInfoSlice, _ = itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice) return instanceTypeInfoSlice, nil } // FilterWithOutput accepts a Filters struct which is used to select the available instance types // matching the criteria within Filters and returns a list of strings based on the custom outputFn -func (itf Selector) FilterWithOutput(filters Filters, outputFn InstanceTypesOutput) ([]string, error) { +func (itf Selector) FilterWithOutput(filters Filters, outputFn InstanceTypesOutput) ([]string, int, error) { instanceTypeInfoSlice, err := itf.rawFilter(filters) if err != nil { - return nil, err + return nil, 0, err } - instanceTypeInfoSlice = itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice) + instanceTypeInfoSlice, numOfItemsTruncated := itf.truncateResults(filters.MaxResults, instanceTypeInfoSlice) output := outputFn.Output(instanceTypeInfoSlice) - return output, nil + return output, numOfItemsTruncated, nil } -func (itf Selector) truncateResults(maxResults *int, instanceTypeInfoSlice []*ec2.InstanceTypeInfo) []*ec2.InstanceTypeInfo { +func (itf Selector) truncateResults(maxResults *int, instanceTypeInfoSlice []*ec2.InstanceTypeInfo) ([]*ec2.InstanceTypeInfo, int) { if maxResults == nil { - return instanceTypeInfoSlice + return instanceTypeInfoSlice, 0 } upperIndex := *maxResults if *maxResults > len(instanceTypeInfoSlice) { upperIndex = len(instanceTypeInfoSlice) } - return instanceTypeInfoSlice[0:upperIndex] + return instanceTypeInfoSlice[0:upperIndex], len(instanceTypeInfoSlice) - upperIndex } // AggregateFilterTransform takes higher level filters which are used to affect multiple raw filters in an opinionated way.