github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/cloudcontroller/ccv3/paginate.go (about) 1 package ccv3 2 3 import ( 4 "net/http" 5 6 "code.cloudfoundry.org/cli/api/cloudcontroller" 7 ) 8 9 func (client Client) paginate(request *cloudcontroller.Request, obj interface{}, appendToExternalList func(interface{}) error) (Warnings, error) { 10 fullWarningsList := Warnings{} 11 12 for { 13 wrapper := NewPaginatedResources(obj) 14 response := cloudcontroller.Response{ 15 DecodeJSONResponseInto: &wrapper, 16 } 17 18 err := client.connection.Make(request, &response) 19 fullWarningsList = append(fullWarningsList, response.Warnings...) 20 if err != nil { 21 return fullWarningsList, err 22 } 23 24 list, err := wrapper.Resources() 25 if err != nil { 26 return fullWarningsList, err 27 } 28 29 for _, item := range list { 30 err = appendToExternalList(item) 31 if err != nil { 32 return fullWarningsList, err 33 } 34 } 35 36 if wrapper.NextPage() == "" { 37 break 38 } 39 40 request, err = client.newHTTPRequest(requestOptions{ 41 URL: wrapper.NextPage(), 42 Method: http.MethodGet, 43 }) 44 if err != nil { 45 return fullWarningsList, err 46 } 47 } 48 49 return fullWarningsList, nil 50 } 51 52 func (requester RealRequester) paginate(request *cloudcontroller.Request, obj interface{}, appendToExternalList func(interface{}) error) (IncludedResources, Warnings, error) { 53 fullWarningsList := Warnings{} 54 var includes IncludedResources 55 56 for { 57 wrapper, warnings, err := requester.wrapFirstPage(request, obj, appendToExternalList) 58 fullWarningsList = append(fullWarningsList, warnings...) 59 if err != nil { 60 return IncludedResources{}, fullWarningsList, err 61 } 62 63 includes.Users = append(includes.Users, wrapper.IncludedResources.Users...) 64 includes.Organizations = append(includes.Organizations, wrapper.IncludedResources.Organizations...) 65 includes.Spaces = append(includes.Spaces, wrapper.IncludedResources.Spaces...) 66 includes.ServiceOfferings = append(includes.ServiceOfferings, wrapper.IncludedResources.ServiceOfferings...) 67 includes.ServiceBrokers = append(includes.ServiceBrokers, wrapper.IncludedResources.ServiceBrokers...) 68 69 if wrapper.NextPage() == "" { 70 break 71 } 72 73 request, err = requester.newHTTPRequest(requestOptions{ 74 URL: wrapper.NextPage(), 75 Method: http.MethodGet, 76 }) 77 if err != nil { 78 return IncludedResources{}, fullWarningsList, err 79 } 80 } 81 82 return includes, fullWarningsList, nil 83 } 84 85 func (requester RealRequester) wrapFirstPage(request *cloudcontroller.Request, obj interface{}, appendToExternalList func(interface{}) error) (*PaginatedResources, Warnings, error) { 86 warnings := Warnings{} 87 wrapper := NewPaginatedResources(obj) 88 response := cloudcontroller.Response{ 89 DecodeJSONResponseInto: &wrapper, 90 } 91 92 err := requester.connection.Make(request, &response) 93 warnings = append(warnings, response.Warnings...) 94 if err != nil { 95 return nil, warnings, err 96 } 97 98 list, err := wrapper.Resources() 99 if err != nil { 100 return nil, warnings, err 101 } 102 103 for _, item := range list { 104 err = appendToExternalList(item) 105 if err != nil { 106 return nil, warnings, err 107 } 108 } 109 110 return wrapper, warnings, nil 111 }