package cardmarket import ( "context" "encoding/json" "errors" "io" "log/slog" "strings" ) func (c *ApiClient) Get( ctx context.Context, endpoint string, params map[string]string, respBody any, ) error { url := c.baseURL + endpoint slog.DebugContext(ctx, "building query param string...") parts := make([]string, len(params)) i := 0 for k, v := range params { parts[i] = k + "=" + v i++ } query := strings.Join(parts, "&") if query != "" { url += "?" + query } slog.DebugContext(ctx, "built query param string") slog.DebugContext(ctx, "requesting entity info...") resp, err := c.httpClient.GetWithContext(ctx, url) if err != nil { slog.DebugContext(ctx, "failed to get entity from API") return err } slog.DebugContext(ctx, "received entity info") slog.DebugContext(ctx, "reading body...") respBodyBuf, err := io.ReadAll(resp.Body) if err != nil { slog.DebugContext(ctx, "failed to read body") return err } defer resp.Body.Close() slog.DebugContext(ctx, "read body") slog.DebugContext(ctx, "parsing body...", "respBodyBuf", string(respBodyBuf)) if err = json.Unmarshal(respBodyBuf, respBody); err != nil { slog.DebugContext(ctx, "failed to unmarshal body: "+string(respBodyBuf)) return err } slog.DebugContext(ctx, "parsed body") return nil } func (c *ApiClient) Put( ctx context.Context, endpoint string, params map[string]string, contentType string, reqBody io.Reader, respBody any, ) error { url := c.baseURL + endpoint slog.DebugContext(ctx, "building query param string...") parts := make([]string, len(params)) i := 0 for k, v := range params { parts[i] = k + "=" + v i++ } query := strings.Join(parts, "&") if query != "" { url += "?" + query } slog.DebugContext(ctx, "built query param string") slog.DebugContext(ctx, "requesting entity info...") resp, err := c.httpClient.PutWithContext(ctx, url, contentType, reqBody) if err != nil { slog.DebugContext(ctx, "failed to get entity from API") return err } slog.DebugContext(ctx, "received entity info") slog.DebugContext(ctx, "reading body...") respBodyBuf, err := io.ReadAll(resp.Body) if err != nil { slog.DebugContext(ctx, "failed to read body") return err } defer resp.Body.Close() slog.DebugContext(ctx, "read body") if resp.StatusCode < 200 || resp.StatusCode > 299 { msg := "status code outside of successful range - " + resp.Status if len(respBodyBuf) > 0 { msg += " body=" + string(respBodyBuf) } return errors.New(msg) } if respBody == nil { return nil } slog.DebugContext(ctx, "parsing body...", "respBodyBuf", string(respBodyBuf)) if err = json.Unmarshal(respBodyBuf, respBody); err != nil { slog.DebugContext(ctx, "failed to unmarshal body: "+string(respBodyBuf)) return err } slog.DebugContext(ctx, "parsed body") return nil }