package lib import ( "bytes" "encoding/json" "io" "net/http" ) // Entry represents a single fetched item. type Entry struct { Title string URL string } // Fetcher is the interface for a fetcher. type Fetcher interface { Fetch() []Entry } // FetcherRequest represents a common HTTP request configuration. type FetcherRequest struct { BaseURL string Path string Method string Headers map[string]string Body []byte } // Run executes the HTTP request and decodes the JSON response into target. func (r FetcherRequest) Run(target interface{}) error { url := r.BaseURL + r.Path var body io.Reader if r.Body != nil { body = bytes.NewBuffer(r.Body) } req, err := http.NewRequest(r.Method, url, body) if err != nil { return err } for key, value := range r.Headers { req.Header.Set(key, value) } res, err := http.DefaultClient.Do(req) if err != nil { return err } defer res.Body.Close() return json.NewDecoder(res.Body).Decode(target) }