package openlibrary import ( "encoding/json" "net/http" "net/url" "strconv" ) func computeOpenLibraryUrl(paths ...string) (*url.URL, error) { baseUrl := "https://openlibrary.org" u, err := url.Parse(baseUrl) if err != nil { return nil, err } for _, p := range paths { u = u.JoinPath(p) } return u, nil } func fetchAndParseResult[T any](u *url.URL, queryResult *T) error { resp, err := doOpenLibraryQuery(u) if err != nil { return err } defer resp.Body.Close() decoder := json.NewDecoder(resp.Body) err = decoder.Decode(queryResult) return err } func doOpenLibraryQuery(u *url.URL) (*http.Response, error) { client := &http.Client{} req, err := http.NewRequest("GET", u.String(), nil) if err != nil { return nil, err } req.Header.Add("Accept", "application/json") req.Header.Add("User-Agent", "PersonalLibraryManager/0.1 (artlef@protonmail.com)") return client.Do(req) } func addQueryParamInt(u *url.URL, paramName string, paramValue int) { addQueryParam(u, paramName, strconv.Itoa(paramValue)) } func addQueryParam(u *url.URL, paramName string, paramValue string) { q := u.Query() q.Set(paramName, paramValue) u.RawQuery = q.Encode() }