// Code generated by ogen, DO NOT EDIT. package openapi import ( "context" "net/url" "strings" "time" "github.com/go-faster/errors" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" "github.com/ogen-go/ogen/conv" ht "github.com/ogen-go/ogen/http" "github.com/ogen-go/ogen/otelogen" "github.com/ogen-go/ogen/uri" ) // Client implements OAS client. type Client struct { serverURL *url.URL baseClient } type errorHandler interface { NewError(ctx context.Context, err error) *ErrorStatusCode } var _ Handler = struct { errorHandler *Client }{} func trimTrailingSlashes(u *url.URL) { u.Path = strings.TrimRight(u.Path, "/") u.RawPath = strings.TrimRight(u.RawPath, "/") } // NewClient initializes new Client defined by OAS. func NewClient(serverURL string, opts ...ClientOption) (*Client, error) { u, err := url.Parse(serverURL) if err != nil { return nil, err } trimTrailingSlashes(u) c, err := newClientConfig(opts...).baseClient() if err != nil { return nil, err } return &Client{ serverURL: u, baseClient: c, }, nil } type serverURLKey struct{} // WithServerURL sets context key to override server URL. func WithServerURL(ctx context.Context, u *url.URL) context.Context { return context.WithValue(ctx, serverURLKey{}, u) } func (c *Client) requestURL(ctx context.Context) *url.URL { u, ok := ctx.Value(serverURLKey{}).(*url.URL) if !ok { return c.serverURL } return u } // AddPage invokes addPage operation. // // Add new page. // // POST /pages func (c *Client) AddPage(ctx context.Context, request OptAddPageReq) (*Page, error) { res, err := c.sendAddPage(ctx, request) _ = res return res, err } func (c *Client) sendAddPage(ctx context.Context, request OptAddPageReq) (res *Page, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("addPage"), } // Validate request before sending. if err := func() error { if request.Set { if err := func() error { if err := request.Value.Validate(); err != nil { return err } return nil }(); err != nil { return err } } return nil }(); err != nil { return res, errors.Wrap(err, "validate") } // Run stopwatch. startTime := time.Now() defer func() { elapsedDuration := time.Since(startTime) c.duration.Record(ctx, elapsedDuration.Microseconds(), otelAttrs...) }() // Increment request counter. c.requests.Add(ctx, 1, otelAttrs...) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "AddPage", trace.WithAttributes(otelAttrs...), clientSpanKind, ) // Track stage for error reporting. var stage string defer func() { if err != nil { span.RecordError(err) span.SetStatus(codes.Error, stage) c.errors.Add(ctx, 1, otelAttrs...) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string pathParts[0] = "/pages" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "POST", u, nil) if err != nil { return res, errors.Wrap(err, "create request") } if err := encodeAddPageRequest(request, r); err != nil { return res, errors.Wrap(err, "encode request") } stage = "SendRequest" resp, err := c.cfg.Client.Do(r) if err != nil { return res, errors.Wrap(err, "do request") } defer resp.Body.Close() stage = "DecodeResponse" result, err := decodeAddPageResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil } // GetPage invokes getPage operation. // // Get page details. // // GET /pages/{id} func (c *Client) GetPage(ctx context.Context, params GetPageParams) (GetPageRes, error) { res, err := c.sendGetPage(ctx, params) _ = res return res, err } func (c *Client) sendGetPage(ctx context.Context, params GetPageParams) (res GetPageRes, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getPage"), } // Run stopwatch. startTime := time.Now() defer func() { elapsedDuration := time.Since(startTime) c.duration.Record(ctx, elapsedDuration.Microseconds(), otelAttrs...) }() // Increment request counter. c.requests.Add(ctx, 1, otelAttrs...) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "GetPage", trace.WithAttributes(otelAttrs...), clientSpanKind, ) // Track stage for error reporting. var stage string defer func() { if err != nil { span.RecordError(err) span.SetStatus(codes.Error, stage) c.errors.Add(ctx, 1, otelAttrs...) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [2]string pathParts[0] = "/pages/" { // Encode "id" parameter. e := uri.NewPathEncoder(uri.PathEncoderConfig{ Param: "id", Style: uri.PathStyleSimple, Explode: false, }) if err := func() error { return e.EncodeValue(conv.UUIDToString(params.ID)) }(); err != nil { return res, errors.Wrap(err, "encode path") } encoded, err := e.Result() if err != nil { return res, errors.Wrap(err, "encode path") } pathParts[1] = encoded } uri.AddPathParts(u, pathParts[:]...) stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "GET", u, nil) if err != nil { return res, errors.Wrap(err, "create request") } stage = "SendRequest" resp, err := c.cfg.Client.Do(r) if err != nil { return res, errors.Wrap(err, "do request") } defer resp.Body.Close() stage = "DecodeResponse" result, err := decodeGetPageResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil } // GetPages invokes getPages operation. // // Get all pages. // // GET /pages func (c *Client) GetPages(ctx context.Context) (Pages, error) { res, err := c.sendGetPages(ctx) _ = res return res, err } func (c *Client) sendGetPages(ctx context.Context) (res Pages, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getPages"), } // Run stopwatch. startTime := time.Now() defer func() { elapsedDuration := time.Since(startTime) c.duration.Record(ctx, elapsedDuration.Microseconds(), otelAttrs...) }() // Increment request counter. c.requests.Add(ctx, 1, otelAttrs...) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "GetPages", trace.WithAttributes(otelAttrs...), clientSpanKind, ) // Track stage for error reporting. var stage string defer func() { if err != nil { span.RecordError(err) span.SetStatus(codes.Error, stage) c.errors.Add(ctx, 1, otelAttrs...) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string pathParts[0] = "/pages" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "GET", u, nil) if err != nil { return res, errors.Wrap(err, "create request") } stage = "SendRequest" resp, err := c.cfg.Client.Do(r) if err != nil { return res, errors.Wrap(err, "do request") } defer resp.Body.Close() stage = "DecodeResponse" result, err := decodeGetPagesResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil }