@@ -18,6 +18,7 @@ import (
1818 "encoding/json"
1919 "fmt"
2020 "strings"
21+ "time"
2122
2223 "github.com/mongodb/openapi/tools/cli/internal/cli/flag"
2324 "github.com/mongodb/openapi/tools/cli/internal/cli/usage"
@@ -32,6 +33,10 @@ type ListOpts struct {
3233 basePath string
3334 outputPath string
3435 format string
36+ from string
37+ to string
38+ toDate * time.Time
39+ fromDate * time.Time
3540}
3641
3742func (o * ListOpts ) Run () error {
@@ -41,7 +46,12 @@ func (o *ListOpts) Run() error {
4146 return err
4247 }
4348
44- bytes , err := o .newSunsetListBytes (openapi .NewSunsetListFromSpec (specInfo ))
49+ sunsets , err := o .newSunsetInRange (openapi .NewSunsetListFromSpec (specInfo ))
50+ if err != nil {
51+ return err
52+ }
53+
54+ bytes , err := o .newSunsetListBytes (sunsets )
4555 if err != nil {
4656 return err
4757 }
@@ -53,6 +63,42 @@ func (o *ListOpts) Run() error {
5363 return nil
5464}
5565
66+ func (o * ListOpts ) newSunsetInRange (sunsets []* openapi.Sunset ) ([]* openapi.Sunset , error ) {
67+ var out []* openapi.Sunset
68+ if o .from == "" && o .to == "" {
69+ return sunsets , nil
70+ }
71+
72+ for _ , s := range sunsets {
73+ sunsetDate , err := time .Parse ("2006-01-02" , s .SunsetDate )
74+ if err != nil {
75+ return nil , err
76+ }
77+
78+ if isDateInRange (& sunsetDate , o .fromDate , o .toDate ) {
79+ out = append (out , s )
80+ }
81+ }
82+
83+ return out , nil
84+ }
85+
86+ func isDateInRange (date , from , to * time.Time ) bool {
87+ if date == nil {
88+ return false
89+ }
90+
91+ if from != nil && date .Before (* from ) {
92+ return false
93+ }
94+
95+ if to != nil && date .After (* to ) {
96+ return false
97+ }
98+
99+ return true
100+ }
101+
56102func (o * ListOpts ) newSunsetListBytes (versions []* openapi.Sunset ) ([]byte , error ) {
57103 data , err := json .MarshalIndent (versions , "" , " " )
58104 if err != nil {
@@ -63,7 +109,7 @@ func (o *ListOpts) newSunsetListBytes(versions []*openapi.Sunset) ([]byte, error
63109 return data , nil
64110 }
65111
66- var jsonData interface {}
112+ var jsonData any
67113 if mErr := json .Unmarshal (data , & jsonData ); mErr != nil {
68114 return nil , mErr
69115 }
@@ -76,8 +122,28 @@ func (o *ListOpts) newSunsetListBytes(versions []*openapi.Sunset) ([]byte, error
76122 return yamlData , nil
77123}
78124
125+ func (o * ListOpts ) validate () error {
126+ if o .from != "" {
127+ value , err := time .Parse ("2006-01-02" , o .from )
128+ if err != nil {
129+ return err
130+ }
131+ o .fromDate = & value
132+ }
133+
134+ if o .to != "" {
135+ value , err := time .Parse ("2006-01-02" , o .to )
136+ if err != nil {
137+ return err
138+ }
139+ o .toDate = & value
140+ }
141+
142+ return nil
143+ }
144+
79145// ListBuilder builds the merge command with the following signature:
80- // changelog create -b path_folder -r path_folder --dry-run
146+ // sunset ls -s spec.json -f 2024-01-01 -t 2024-09-22
81147func ListBuilder () * cobra.Command {
82148 opts := & ListOpts {
83149 fs : afero .NewOsFs (),
@@ -88,13 +154,18 @@ func ListBuilder() *cobra.Command {
88154 Short : "List API endpoints with a Sunset date for a given OpenAPI spec." ,
89155 Aliases : []string {"ls" },
90156 Args : cobra .NoArgs ,
157+ PreRunE : func (_ * cobra.Command , _ []string ) error {
158+ return opts .validate ()
159+ },
91160 RunE : func (_ * cobra.Command , _ []string ) error {
92161 return opts .Run ()
93162 },
94163 }
95164
96165 cmd .Flags ().StringVarP (& opts .basePath , flag .Spec , flag .SpecShort , "" , usage .Spec )
97166 cmd .Flags ().StringVarP (& opts .outputPath , flag .Output , flag .OutputShort , "" , usage .Output )
167+ cmd .Flags ().StringVar (& opts .from , flag .From , "" , usage .From )
168+ cmd .Flags ().StringVar (& opts .to , flag .To , "" , usage .To )
98169 cmd .Flags ().StringVarP (& opts .format , flag .Format , flag .FormatShort , "json" , usage .Format )
99170
100171 _ = cmd .MarkFlagRequired (flag .Spec )
0 commit comments