@@ -132,20 +132,17 @@ func (h *restHandler) handleStreamMessage(rw http.ResponseWriter, req *http.Requ
132132func (h * restHandler ) handleGetTask (rw http.ResponseWriter , req * http.Request ) {
133133 ctx := req .Context ()
134134 taskID := req .PathValue ("id" )
135- historyLengthRaw := req .URL .Query ().Get ("historyLength" )
136- var historyLength * int
137- if historyLengthRaw != "" {
138- val , err := strconv .Atoi (historyLengthRaw )
139- if err != nil {
140- writeRESTError (ctx , rw , a2a .ErrInvalidRequest , a2a .TaskID (taskID ))
141- return
142- }
143- historyLength = & val
144- }
135+
145136 if taskID == "" {
146137 writeRESTError (ctx , rw , a2a .ErrInvalidRequest , a2a .TaskID ("" ))
147138 return
148139 }
140+ historyLength , err := parseHistoryLength (req .URL .Query ())
141+ if err != nil {
142+ writeRESTError (ctx , rw , fmt .Errorf ("%w: invalid historyLength %v" , a2a .ErrInvalidRequest , err ), a2a .TaskID (taskID ))
143+ return
144+ }
145+
149146 params := & a2a.GetTaskRequest {
150147 ID : a2a .TaskID (taskID ),
151148 HistoryLength : historyLength ,
@@ -166,53 +163,13 @@ func (h *restHandler) handleGetTask(rw http.ResponseWriter, req *http.Request) {
166163func (h * restHandler ) handleListTasks (rw http.ResponseWriter , req * http.Request ) {
167164 ctx := req .Context ()
168165 query := req .URL .Query ()
169- request := & a2a.ListTasksRequest {}
170- var parseErrors []error
171- parse := func (key string , target any ) {
172- val := query .Get (key )
173- if val == "" {
174- return
175- }
176- switch t := target .(type ) {
177- case * string :
178- * t = val
179- case * a2a.TaskState :
180- * t = a2a .TaskState (val )
181- case * int :
182- v , err := strconv .Atoi (val )
183- if err != nil {
184- parseErrors = append (parseErrors , fmt .Errorf ("invalid %s: %w" , key , err ))
185- return
186- }
187- * t = v
188- case * bool :
189- v , err := strconv .ParseBool (val )
190- if err != nil {
191- parseErrors = append (parseErrors , fmt .Errorf ("invalid %s: %w" , key , err ))
192- return
193- }
194- * t = v
195- case * time.Time :
196- parsedTime , err := time .Parse (time .RFC3339 , val )
197- if err != nil {
198- parseErrors = append (parseErrors , fmt .Errorf ("invalid %s: %w" , key , err ))
199- return
200- }
201- * t = parsedTime
202- }
203- }
204- parse ("contextId" , & request .ContextID )
205- parse ("status" , & request .Status )
206- parse ("pageSize" , & request .PageSize )
207- parse ("pageToken" , & request .PageToken )
208- parse ("historyLength" , & request .HistoryLength )
209- parse ("statusTimestampAfter" , & request .StatusTimestampAfter )
210- parse ("includeArtifacts" , & request .IncludeArtifacts )
211- fillTenant (ctx , & request .Tenant )
212- if len (parseErrors ) > 0 {
213- writeRESTError (ctx , rw , a2a .ErrInvalidRequest , a2a .TaskID ("" ))
166+ request , err := parseListTasksQueryParams (query )
167+ if err != nil {
168+ writeRESTError (ctx , rw , err , a2a .TaskID ("" ))
214169 return
215170 }
171+
172+ fillTenant (ctx , & request .Tenant )
216173 result , err := h .handler .ListTasks (ctx , request )
217174 if err != nil {
218175 writeRESTError (ctx , rw , err , a2a .TaskID ("" ))
@@ -498,6 +455,75 @@ func writeRESTError(ctx context.Context, rw http.ResponseWriter, err error, task
498455 }
499456}
500457
458+ func parseListTasksQueryParams (query url.Values ) (* a2a.ListTasksRequest , error ) {
459+ request := & a2a.ListTasksRequest {}
460+ contextID := query .Get ("contextId" )
461+ if contextID != "" {
462+ request .ContextID = contextID
463+ }
464+ status := query .Get ("status" )
465+ if status != "" {
466+ request .Status = a2a .TaskState (status )
467+ }
468+ pageSize := query .Get ("pageSize" )
469+ if pageSize != "" {
470+ val , err := strconv .Atoi (pageSize )
471+ if err != nil {
472+ return nil , fmt .Errorf ("%w: invalid pageSize %v" , a2a .ErrInvalidRequest , err )
473+ }
474+ request .PageSize = val
475+ }
476+ pageToken := query .Get ("pageToken" )
477+ if pageToken != "" {
478+ request .PageToken = pageToken
479+ }
480+ includeArtifacts := query .Get ("includeArtifacts" )
481+ if includeArtifacts != "" {
482+ val , err := strconv .ParseBool (includeArtifacts )
483+ if err != nil {
484+ return nil , fmt .Errorf ("%w: invalid includeArtifacts %v" , a2a .ErrInvalidRequest , err )
485+ }
486+ request .IncludeArtifacts = val
487+ }
488+ historyLength , err := parseHistoryLength (query )
489+ if err != nil {
490+ return nil , fmt .Errorf ("%w: invalid historyLength %v" , a2a .ErrInvalidRequest , err )
491+ }
492+ request .HistoryLength = historyLength
493+ statusTimestampAfter , err := parseStatusTimestampAfter (query )
494+ if err != nil {
495+ return nil , fmt .Errorf ("%w: invalid statusTimestampAfter %v" , a2a .ErrInvalidRequest , err )
496+ }
497+ request .StatusTimestampAfter = statusTimestampAfter
498+ return request , nil
499+ }
500+
501+ func parseHistoryLength (query url.Values ) (* int , error ) {
502+ historyLengthRaw := query .Get ("historyLength" )
503+ var historyLength * int
504+ if historyLengthRaw != "" {
505+ val , err := strconv .Atoi (historyLengthRaw )
506+ if err != nil {
507+ return nil , err
508+ }
509+ historyLength = & val
510+ }
511+ return historyLength , nil
512+ }
513+
514+ func parseStatusTimestampAfter (query url.Values ) (* time.Time , error ) {
515+ statusTimestampAfterRaw := query .Get ("statusTimestampAfter" )
516+ var statusTimestampAfter * time.Time
517+ if statusTimestampAfterRaw != "" {
518+ val , err := time .Parse (time .RFC3339Nano , statusTimestampAfterRaw )
519+ if err != nil {
520+ return nil , err
521+ }
522+ statusTimestampAfter = & val
523+ }
524+ return statusTimestampAfter , nil
525+ }
526+
501527type tenantKeyType struct {}
502528
503529func fillTenant (ctx context.Context , tenant * string ) {
0 commit comments