github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/poi/list.go (about)

     1  package poi
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/chanxuehong/wechat/mp/core"
     7  )
     8  
     9  type ListResult struct {
    10  	TotalCount int   `json:"total_count"`   // 门店总数量
    11  	ItemCount  int   `json:"item_count"`    // 本次调用获取的门店数量
    12  	List       []Poi `json:"business_list"` // 本次调用获取的门店列表
    13  }
    14  
    15  // List 查询门店列表.
    16  //
    17  //	begin: 开始位置,0 即为从第一条开始查询
    18  //	limit: 返回数据条数,最大允许50,默认为20
    19  func List(clt *core.Client, begin, limit int) (rslt *ListResult, err error) {
    20  	const incompleteURL = "https://api.weixin.qq.com/cgi-bin/poi/getpoilist?access_token="
    21  
    22  	if begin < 0 {
    23  		err = fmt.Errorf("invalid begin: %d", begin)
    24  		return
    25  	}
    26  	if limit <= 0 {
    27  		err = fmt.Errorf("invalid limit: %d", limit)
    28  		return
    29  	}
    30  
    31  	var request = struct {
    32  		Begin int `json:"begin"`
    33  		Limit int `json:"limit"`
    34  	}{
    35  		Begin: begin,
    36  		Limit: limit,
    37  	}
    38  	var result struct {
    39  		core.Error
    40  		ListResult
    41  	}
    42  	if err = clt.PostJSON(incompleteURL, &request, &result); err != nil {
    43  		return
    44  	}
    45  	if result.ErrCode != core.ErrCodeOK {
    46  		err = &result.Error
    47  		return
    48  	}
    49  	result.ListResult.ItemCount = len(result.ListResult.List)
    50  	rslt = &result.ListResult
    51  	return
    52  }
    53  
    54  // =====================================================================================================================
    55  
    56  // PoiIterator
    57  //
    58  //	iter, err := NewPoiIterator(clt, 0, 10)
    59  //	if err != nil {
    60  //	    // TODO: 增加你的代码
    61  //	}
    62  //
    63  //	for iter.HasNext() {
    64  //	    items, err := iter.NextPage()
    65  //	    if err != nil {
    66  //	        // TODO: 增加你的代码
    67  //	    }
    68  //	    // TODO: 增加你的代码
    69  //	}
    70  type PoiIterator struct {
    71  	clt *core.Client
    72  
    73  	nextOffset int
    74  	count      int
    75  
    76  	lastListResult *ListResult
    77  	nextPageCalled bool
    78  }
    79  
    80  func (iter *PoiIterator) TotalCount() int {
    81  	return iter.lastListResult.TotalCount
    82  }
    83  
    84  func (iter *PoiIterator) HasNext() bool {
    85  	if !iter.nextPageCalled {
    86  		return iter.lastListResult.ItemCount > 0 || iter.nextOffset < iter.lastListResult.TotalCount
    87  	}
    88  	return iter.nextOffset < iter.lastListResult.TotalCount
    89  }
    90  
    91  func (iter *PoiIterator) NextPage() (list []Poi, err error) {
    92  	if !iter.nextPageCalled {
    93  		iter.nextPageCalled = true
    94  		list = iter.lastListResult.List
    95  		return
    96  	}
    97  
    98  	rslt, err := List(iter.clt, iter.nextOffset, iter.count)
    99  	if err != nil {
   100  		return
   101  	}
   102  
   103  	iter.lastListResult = rslt
   104  	iter.nextOffset += rslt.ItemCount
   105  
   106  	list = rslt.List
   107  	return
   108  }
   109  
   110  func NewPoiIterator(clt *core.Client, begin, limit int) (iter *PoiIterator, err error) {
   111  	// 逻辑上相当于第一次调用 PoiIterator.NextPage,
   112  	// 因为第一次调用 PoiIterator.HasNext 需要数据支撑, 所以提前获取了数据
   113  	rslt, err := List(clt, begin, limit)
   114  	if err != nil {
   115  		return
   116  	}
   117  
   118  	iter = &PoiIterator{
   119  		clt: clt,
   120  
   121  		nextOffset: begin + rslt.ItemCount,
   122  		count:      limit,
   123  
   124  		lastListResult: rslt,
   125  		nextPageCalled: false,
   126  	}
   127  	return
   128  }