github.com/twilio/twilio-go@v1.20.1/client/page_util.go (about)

     1  package client
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"strings"
     7  )
     8  
     9  // Takes a limit on the max number of records to read and a max pageSize and calculates the max number of pages to read.
    10  func ReadLimits(pageSize *int, limit *int) int {
    11  	//don't care about pageSize
    12  	if pageSize == nil {
    13  		if limit == nil {
    14  			//don't care about the limit either
    15  			return 50 //default
    16  		}
    17  		//return the most efficient pageSize
    18  		return min(*limit, 1000)
    19  	} else {
    20  		if limit == nil {
    21  			//we care about the pageSize but not the limit
    22  			return *pageSize
    23  		}
    24  		return min(*pageSize, *limit)
    25  	}
    26  }
    27  
    28  func GetNext(baseUrl string, response interface{}, getNextPage func(nextPageUri string) (interface{}, error)) (interface{}, error) {
    29  	nextPageUrl, err := getNextPageUrl(baseUrl, response)
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	return getNextPage(nextPageUrl)
    35  }
    36  
    37  func toMap(s interface{}) (map[string]interface{}, error) {
    38  	var payload map[string]interface{}
    39  	data, err := json.Marshal(s)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  
    44  	err = json.Unmarshal(data, &payload)
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  
    49  	return payload, err
    50  }
    51  
    52  func getNextPageUrl(baseUrl string, response interface{}) (string, error) {
    53  	payload, err := toMap(response)
    54  	if err != nil {
    55  		return "", err
    56  	}
    57  
    58  	if payload != nil && payload["meta"] != nil && payload["meta"].(map[string]interface{})["next_page_url"] != nil {
    59  		return payload["meta"].(map[string]interface{})["next_page_url"].(string), nil
    60  	}
    61  
    62  	if payload != nil && payload["next_page_uri"] != nil {
    63  		// remove any leading and trailing '/'
    64  		return fmt.Sprintf("%s/%s", strings.Trim(baseUrl, "/"), strings.Trim(payload["next_page_uri"].(string), "/")), nil
    65  	}
    66  
    67  	return "", nil
    68  }
    69  
    70  func min(a int, b int) int {
    71  	if a > b {
    72  		return b
    73  	}
    74  	return a
    75  }