@@ -5,7 +5,6 @@ package main
55
66import (
77 "context"
8- "errors"
98 "fmt"
109 "html/template"
1110 "net/http"
@@ -72,91 +71,60 @@ const minPeriodsOnThePage = 1
7271const maxPeriodsOnThePage = 12
7372
7473func makeHeatmapParams (ctx context.Context , r * http.Request ) (* coverageHeatmapParams , error ) {
75- minCoverLinesDrop , err := getIntParam (r , covPageParams [MinCoverLinesDrop ], 0 )
76- if err != nil {
77- return nil , err
78- }
79- onlyUnique , err := getBoolParam (r , covPageParams [UniqueOnly ], false )
80- if err != nil {
81- return nil , err
82- }
83- orderByCoverDrop , err := getBoolParam (r , covPageParams [OrderByCoverDrop ], false )
84- if err != nil {
85- return nil , err
86- }
87- periodType , err := getStringParam (r , covPageParams [PeriodType ], coveragedb .DayPeriod )
88- if err != nil {
89- return nil , err
90- }
74+ onlyUnique := getParam [bool ](r , covPageParams [UniqueOnly ], false )
75+ periodType := getParam [string ](r , covPageParams [PeriodType ])
9176 if ! slices .Contains (coveragedb .AllPeriods , periodType ) {
9277 return nil , fmt .Errorf ("only {%s} are allowed, but received %s instead, %w" ,
9378 strings .Join (coveragedb .AllPeriods , ", " ), periodType , ErrClientBadRequest )
9479 }
95-
96- nPeriods , err := getIntParam (r , covPageParams [PeriodCount ], 4 )
97- if err != nil || nPeriods > maxPeriodsOnThePage || nPeriods < minPeriodsOnThePage {
98- return nil , fmt .Errorf ("periods_count is wrong, expected [%d, %d]: %w" ,
99- minPeriodsOnThePage , maxPeriodsOnThePage , err )
100- }
101-
102- dateTo := civil .DateOf (timeNow (ctx ))
103- if customDate := r .FormValue (covPageParams [DateTo ]); customDate != "" {
104- if dateTo , err = civil .ParseDate (customDate ); err != nil {
105- return nil , fmt .Errorf ("civil.ParseDate(%s): %w" , customDate , err )
106- }
80+ nPeriods := getParam [int ](r , covPageParams [PeriodCount ], 4 )
81+ if nPeriods > maxPeriodsOnThePage || nPeriods < minPeriodsOnThePage {
82+ return nil , fmt .Errorf ("periods_count is wrong, expected [%d, %d]" ,
83+ minPeriodsOnThePage , maxPeriodsOnThePage )
10784 }
10885
10986 return & coverageHeatmapParams {
110- manager : r . FormValue ( covPageParams [ManagerName ]),
111- subsystem : r . FormValue ( covPageParams [SubsystemName ]),
87+ manager : getParam [ string ]( r , covPageParams [ManagerName ]),
88+ subsystem : getParam [ string ]( r , covPageParams [SubsystemName ]),
11289 onlyUnique : onlyUnique ,
11390 periodType : periodType ,
11491 nPeriods : nPeriods ,
115- dateTo : dateTo ,
92+ dateTo : getParam [civil. Date ]( r , covPageParams [ DateTo ], civil . DateOf ( timeNow ( ctx ))) ,
11693 Format : cover.Format {
11794 DropCoveredLines0 : onlyUnique ,
118- OrderByCoveredLinesDrop : orderByCoverDrop ,
119- FilterMinCoveredLinesDrop : minCoverLinesDrop ,
95+ OrderByCoveredLinesDrop : getParam [ bool ]( r , covPageParams [ OrderByCoverDrop ]) ,
96+ FilterMinCoveredLinesDrop : getParam [ int ]( r , covPageParams [ MinCoverLinesDrop ]) ,
12097 },
12198 }, nil
12299}
123100
124- func getIntParam (r * http.Request , name string , orDefault ... int ) (int , error ) {
125- if r .FormValue (name ) == "" {
126- if len (orDefault ) > 0 {
127- return orDefault [0 ], nil
128- }
129- return 0 , errors .New ("missing parameter " + name )
130- }
131- res , err := strconv .Atoi (r .FormValue (name ))
132- if err != nil {
133- return 0 , fmt .Errorf ("strconv.Atoi(%s): %w" , name , err )
101+ func getParam [T int | string | bool | civil.Date ](r * http.Request , name string , orDefault ... T ) T {
102+ var def T
103+ if len (orDefault ) > 0 {
104+ def = orDefault [0 ]
134105 }
135- return res , nil
136- }
137-
138- func getBoolParam (r * http.Request , name string , orDefault ... bool ) (bool , error ) {
139106 if r .FormValue (name ) == "" {
140- if len (orDefault ) > 0 {
141- return orDefault [0 ], nil
142- }
143- return false , errors .New ("missing parameter " + name )
144- }
145- res , err := strconv .ParseBool (r .FormValue (name ))
146- if err != nil {
147- return false , fmt .Errorf ("strconv.ParseBool(%s): %w" , name , err )
107+ return def
148108 }
149- return res , nil
109+ var t T
110+ return extractVal (t , r .FormValue (name )).(T )
150111}
151112
152- func getStringParam (r * http.Request , name string , orDefault ... string ) (string , error ) {
153- if r .FormValue (name ) == "" {
154- if len (orDefault ) > 0 {
155- return orDefault [0 ], nil
156- }
157- return "" , errors .New ("missing parameter " + name )
158- }
159- return r .FormValue (name ), nil
113+ func extractVal (t interface {}, val string ) interface {} {
114+ switch t .(type ) {
115+ case int :
116+ res , _ := strconv .Atoi (val )
117+ return res
118+ case string :
119+ return val
120+ case bool :
121+ res , _ := strconv .ParseBool (val )
122+ return res
123+ case civil.Date :
124+ res , _ := civil .ParseDate (val )
125+ return res
126+ }
127+ panic ("unsupported type" )
160128}
161129
162130func handleCoverageHeatmap (c context.Context , w http.ResponseWriter , r * http.Request ) error {
@@ -168,7 +136,7 @@ func handleCoverageHeatmap(c context.Context, w http.ResponseWriter, r *http.Req
168136 if err != nil {
169137 return fmt .Errorf ("%s: %w" , err .Error (), ErrClientBadRequest )
170138 }
171- if requestJSONL , _ := getBoolParam (r , "jsonl" , false ); requestJSONL {
139+ if getParam [ bool ] (r , "jsonl" ) {
172140 ns := hdr .Namespace
173141 repo , _ := getNsConfig (c , ns ).mainRepoBranch ()
174142 w .Header ().Set ("Content-Type" , "application/json" )
@@ -332,7 +300,6 @@ func handleFileCoverage(c context.Context, w http.ResponseWriter, r *http.Reques
332300 if err != nil {
333301 return fmt .Errorf ("coveragedb.MakeTimePeriod: %w" , err )
334302 }
335- onlyUnique , _ := getBoolParam (r , covPageParams [UniqueOnly ], false )
336303 mainNsRepo , _ := nsConfig .mainRepoBranch ()
337304 client := getCoverageDBClient (c )
338305 if client == nil {
@@ -344,7 +311,7 @@ func handleFileCoverage(c context.Context, w http.ResponseWriter, r *http.Reques
344311 if err != nil {
345312 return fmt .Errorf ("coveragedb.ReadLinesHitCount(%s): %w" , manager , err )
346313 }
347- if onlyUnique {
314+ if getParam [ bool ]( r , covPageParams [ UniqueOnly ]) {
348315 // This request is expected to be made second by tests.
349316 // Moving it to goroutine don't forget to change multiManagerCovDBFixture.
350317 allHitLines , allHitCounts , err := coveragedb .ReadLinesHitCount (
0 commit comments