This repository was archived by the owner on Aug 4, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnews.go
More file actions
148 lines (119 loc) · 3.15 KB
/
Copy pathnews.go
File metadata and controls
148 lines (119 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package bingo
import (
"context"
"encoding/json"
"fmt"
"net/url"
"time"
"dev.freespoke.com/bingo/v2/bingtypes"
)
type newsClient struct {
*client
URL string
}
// NewsSearchOptions defines options for the news search request.
// It combines query parameters and headers.
type NewsSearchOptions struct {
RequestHeaders
RequestParams
OriginalImage bool
Query string
Freshness string
}
// ToRequest News Search Options
func (o NewsSearchOptions) toQueryString(v *url.Values) {
o.RequestParams.toQueryString(v)
if o.OriginalImage {
v.Add("originalImg", "true")
}
if o.Freshness != "" {
v.Add("freshness", string(o.Freshness))
}
v.Add("q", o.Query)
}
func (s *newsClient) Search(
ctx context.Context,
opts NewsSearchOptions,
) (*bingtypes.NewsAnswer, *bingtypes.ResponseMetadata, error) {
req, err := s.makeGetRequest(ctx, s.URL, "search", opts)
if err != nil {
return nil, nil, err
}
res, err := s.sendRequest(req, opts.RequestParams)
if err != nil {
return nil, nil, err
}
defer res.Body.Close()
var resp bingtypes.NewsAnswer
if err := json.NewDecoder(res.Body).Decode(&resp); err != nil {
return nil, nil, err
}
return &resp, s.getResponseMetadata(res), nil
}
// NewsCategoryOptions defines options for the news category search request.
// It combines query parameters and headers.
type NewsCategoryOptions struct {
RequestHeaders
RequestParams
Category string
}
// ToRequest NewsCategorySearchOptions filter by category.
func (o NewsCategoryOptions) toQueryString(v *url.Values) {
o.RequestParams.toQueryString(v)
v.Add("category", o.Category)
}
func (s *newsClient) Category(
ctx context.Context,
opts NewsCategoryOptions,
) (*bingtypes.NewsAnswer, *bingtypes.ResponseMetadata, error) {
req, err := s.makeGetRequest(ctx, s.URL, "", opts)
if err != nil {
return nil, nil, err
}
res, err := s.sendRequest(req, opts.RequestParams)
if err != nil {
return nil, nil, err
}
defer res.Body.Close()
var resp bingtypes.NewsAnswer
if err := json.NewDecoder(res.Body).Decode(&resp); err != nil {
return nil, nil, err
}
return &resp, s.getResponseMetadata(res), nil
}
// NewsTrendingTopicsOptions defines options for the news trending topics request.
// It combines query parameters and headers.
type NewsTrendingTopicsOptions struct {
RequestHeaders
RequestParams
Since time.Time
SortBy string
}
func (o NewsTrendingTopicsOptions) toQueryString(v *url.Values) {
o.RequestParams.toQueryString(v)
if !o.Since.IsZero() {
v.Add("since", fmt.Sprint(o.Since.Unix()))
v.Add("sortBy", "Date")
} else if o.SortBy != "" {
v.Add("sortBy", o.SortBy)
}
}
func (s *newsClient) TrendingTopics(
ctx context.Context,
opts NewsTrendingTopicsOptions,
) (*bingtypes.TrendingTopicAnswer, *bingtypes.ResponseMetadata, error) {
req, err := s.makeGetRequest(ctx, s.URL, "trendingtopics", opts)
if err != nil {
return nil, nil, err
}
res, err := s.sendRequest(req, opts.RequestParams)
if err != nil {
return nil, nil, err
}
defer res.Body.Close()
var resp bingtypes.TrendingTopicAnswer
if err := json.NewDecoder(res.Body).Decode(&resp); err != nil {
return nil, nil, err
}
return &resp, s.getResponseMetadata(res), nil
}