// Code generated by ogen, DO NOT EDIT. package api 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/metric" semconv "go.opentelemetry.io/otel/semconv/v1.26.0" "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" ) // Invoker invokes operations described by OpenAPI v3 specification. type Invoker interface { // CreateSubmission invokes createSubmission operation. // // Create new submission. // // POST /submissions CreateSubmission(ctx context.Context) (*ID, error) // GetSubmission invokes getSubmission operation. // // Retrieve map with ID. // // GET /submissions/{SubmissionID} GetSubmission(ctx context.Context, params GetSubmissionParams) (*Submission, error) // ListSubmissions invokes listSubmissions operation. // // Get list of submissions. // // GET /submissions ListSubmissions(ctx context.Context, params ListSubmissionsParams) ([]Submission, error) // PatchSubmissionCompleted invokes patchSubmissionCompleted operation. // // Retrieve map with ID. // // PATCH /submissions/{SubmissionID}/completed PatchSubmissionCompleted(ctx context.Context, params PatchSubmissionCompletedParams) error // PatchSubmissionModel invokes patchSubmissionModel operation. // // Update model following role restrictions. // // PATCH /submissions/{SubmissionID}/model PatchSubmissionModel(ctx context.Context, params PatchSubmissionModelParams) error // PatchSubmissionStatus invokes patchSubmissionStatus operation. // // Update status following role restrictions. // // PATCH /submissions/{SubmissionID}/status PatchSubmissionStatus(ctx context.Context, params PatchSubmissionStatusParams) error } // 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 } // CreateSubmission invokes createSubmission operation. // // Create new submission. // // POST /submissions func (c *Client) CreateSubmission(ctx context.Context) (*ID, error) { res, err := c.sendCreateSubmission(ctx) return res, err } func (c *Client) sendCreateSubmission(ctx context.Context) (res *ID, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("createSubmission"), semconv.HTTPRequestMethodKey.String("POST"), semconv.HTTPRouteKey.String("/submissions"), } // Run stopwatch. startTime := time.Now() defer func() { // Use floating point division here for higher precision (instead of Millisecond method). elapsedDuration := time.Since(startTime) c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...)) }() // Increment request counter. c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "CreateSubmission", 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, metric.WithAttributes(otelAttrs...)) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string pathParts[0] = "/submissions" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "POST", u) 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 := decodeCreateSubmissionResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil } // GetSubmission invokes getSubmission operation. // // Retrieve map with ID. // // GET /submissions/{SubmissionID} func (c *Client) GetSubmission(ctx context.Context, params GetSubmissionParams) (*Submission, error) { res, err := c.sendGetSubmission(ctx, params) return res, err } func (c *Client) sendGetSubmission(ctx context.Context, params GetSubmissionParams) (res *Submission, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getSubmission"), semconv.HTTPRequestMethodKey.String("GET"), semconv.HTTPRouteKey.String("/submissions/{SubmissionID}"), } // Run stopwatch. startTime := time.Now() defer func() { // Use floating point division here for higher precision (instead of Millisecond method). elapsedDuration := time.Since(startTime) c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...)) }() // Increment request counter. c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "GetSubmission", 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, metric.WithAttributes(otelAttrs...)) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [2]string pathParts[0] = "/submissions/" { // Encode "SubmissionID" parameter. e := uri.NewPathEncoder(uri.PathEncoderConfig{ Param: "SubmissionID", Style: uri.PathStyleSimple, Explode: false, }) if err := func() error { return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) }(); 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) 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 := decodeGetSubmissionResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil } // ListSubmissions invokes listSubmissions operation. // // Get list of submissions. // // GET /submissions func (c *Client) ListSubmissions(ctx context.Context, params ListSubmissionsParams) ([]Submission, error) { res, err := c.sendListSubmissions(ctx, params) return res, err } func (c *Client) sendListSubmissions(ctx context.Context, params ListSubmissionsParams) (res []Submission, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("listSubmissions"), semconv.HTTPRequestMethodKey.String("GET"), semconv.HTTPRouteKey.String("/submissions"), } // Run stopwatch. startTime := time.Now() defer func() { // Use floating point division here for higher precision (instead of Millisecond method). elapsedDuration := time.Since(startTime) c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...)) }() // Increment request counter. c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "ListSubmissions", 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, metric.WithAttributes(otelAttrs...)) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string pathParts[0] = "/submissions" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" q := uri.NewQueryEncoder() { // Encode "page" parameter. cfg := uri.QueryParameterEncodingConfig{ Name: "page", Style: uri.QueryStyleForm, Explode: true, } if err := q.EncodeParam(cfg, func(e uri.Encoder) error { return params.Page.EncodeURI(e) }); err != nil { return res, errors.Wrap(err, "encode query") } } { // Encode "filter" parameter. cfg := uri.QueryParameterEncodingConfig{ Name: "filter", Style: uri.QueryStyleForm, Explode: true, } if err := q.EncodeParam(cfg, func(e uri.Encoder) error { if val, ok := params.Filter.Get(); ok { return val.EncodeURI(e) } return nil }); err != nil { return res, errors.Wrap(err, "encode query") } } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "GET", u) 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 := decodeListSubmissionsResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil } // PatchSubmissionCompleted invokes patchSubmissionCompleted operation. // // Retrieve map with ID. // // PATCH /submissions/{SubmissionID}/completed func (c *Client) PatchSubmissionCompleted(ctx context.Context, params PatchSubmissionCompletedParams) error { _, err := c.sendPatchSubmissionCompleted(ctx, params) return err } func (c *Client) sendPatchSubmissionCompleted(ctx context.Context, params PatchSubmissionCompletedParams) (res *PatchSubmissionCompletedOK, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("patchSubmissionCompleted"), semconv.HTTPRequestMethodKey.String("PATCH"), semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/completed"), } // Run stopwatch. startTime := time.Now() defer func() { // Use floating point division here for higher precision (instead of Millisecond method). elapsedDuration := time.Since(startTime) c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...)) }() // Increment request counter. c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "PatchSubmissionCompleted", 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, metric.WithAttributes(otelAttrs...)) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [3]string pathParts[0] = "/submissions/" { // Encode "SubmissionID" parameter. e := uri.NewPathEncoder(uri.PathEncoderConfig{ Param: "SubmissionID", Style: uri.PathStyleSimple, Explode: false, }) if err := func() error { return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) }(); 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 } pathParts[2] = "/completed" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" q := uri.NewQueryEncoder() { // Encode "Completed" parameter. cfg := uri.QueryParameterEncodingConfig{ Name: "Completed", Style: uri.QueryStyleForm, Explode: true, } if err := q.EncodeParam(cfg, func(e uri.Encoder) error { return e.EncodeValue(conv.BoolToString(params.Completed)) }); err != nil { return res, errors.Wrap(err, "encode query") } } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "PATCH", u) 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 := decodePatchSubmissionCompletedResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil } // PatchSubmissionModel invokes patchSubmissionModel operation. // // Update model following role restrictions. // // PATCH /submissions/{SubmissionID}/model func (c *Client) PatchSubmissionModel(ctx context.Context, params PatchSubmissionModelParams) error { _, err := c.sendPatchSubmissionModel(ctx, params) return err } func (c *Client) sendPatchSubmissionModel(ctx context.Context, params PatchSubmissionModelParams) (res *PatchSubmissionModelOK, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("patchSubmissionModel"), semconv.HTTPRequestMethodKey.String("PATCH"), semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/model"), } // Run stopwatch. startTime := time.Now() defer func() { // Use floating point division here for higher precision (instead of Millisecond method). elapsedDuration := time.Since(startTime) c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...)) }() // Increment request counter. c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "PatchSubmissionModel", 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, metric.WithAttributes(otelAttrs...)) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [3]string pathParts[0] = "/submissions/" { // Encode "SubmissionID" parameter. e := uri.NewPathEncoder(uri.PathEncoderConfig{ Param: "SubmissionID", Style: uri.PathStyleSimple, Explode: false, }) if err := func() error { return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) }(); 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 } pathParts[2] = "/model" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" q := uri.NewQueryEncoder() { // Encode "ModelID" parameter. cfg := uri.QueryParameterEncodingConfig{ Name: "ModelID", Style: uri.QueryStyleForm, Explode: true, } if err := q.EncodeParam(cfg, func(e uri.Encoder) error { return e.EncodeValue(conv.Int64ToString(params.ModelID)) }); err != nil { return res, errors.Wrap(err, "encode query") } } { // Encode "VersionID" parameter. cfg := uri.QueryParameterEncodingConfig{ Name: "VersionID", Style: uri.QueryStyleForm, Explode: true, } if err := q.EncodeParam(cfg, func(e uri.Encoder) error { return e.EncodeValue(conv.Int64ToString(params.VersionID)) }); err != nil { return res, errors.Wrap(err, "encode query") } } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "PATCH", u) 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 := decodePatchSubmissionModelResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil } // PatchSubmissionStatus invokes patchSubmissionStatus operation. // // Update status following role restrictions. // // PATCH /submissions/{SubmissionID}/status func (c *Client) PatchSubmissionStatus(ctx context.Context, params PatchSubmissionStatusParams) error { _, err := c.sendPatchSubmissionStatus(ctx, params) return err } func (c *Client) sendPatchSubmissionStatus(ctx context.Context, params PatchSubmissionStatusParams) (res *PatchSubmissionStatusOK, err error) { otelAttrs := []attribute.KeyValue{ otelogen.OperationID("patchSubmissionStatus"), semconv.HTTPRequestMethodKey.String("PATCH"), semconv.HTTPRouteKey.String("/submissions/{SubmissionID}/status"), } // Run stopwatch. startTime := time.Now() defer func() { // Use floating point division here for higher precision (instead of Millisecond method). elapsedDuration := time.Since(startTime) c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...)) }() // Increment request counter. c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) // Start a span for this request. ctx, span := c.cfg.Tracer.Start(ctx, "PatchSubmissionStatus", 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, metric.WithAttributes(otelAttrs...)) } span.End() }() stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [3]string pathParts[0] = "/submissions/" { // Encode "SubmissionID" parameter. e := uri.NewPathEncoder(uri.PathEncoderConfig{ Param: "SubmissionID", Style: uri.PathStyleSimple, Explode: false, }) if err := func() error { return e.EncodeValue(conv.Int64ToString(params.SubmissionID)) }(); 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 } pathParts[2] = "/status" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" q := uri.NewQueryEncoder() { // Encode "Status" parameter. cfg := uri.QueryParameterEncodingConfig{ Name: "Status", Style: uri.QueryStyleForm, Explode: true, } if err := q.EncodeParam(cfg, func(e uri.Encoder) error { return e.EncodeValue(conv.Int32ToString(params.Status)) }); err != nil { return res, errors.Wrap(err, "encode query") } } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" r, err := ht.NewRequest(ctx, "PATCH", u) 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 := decodePatchSubmissionStatusResponse(resp) if err != nil { return res, errors.Wrap(err, "decode response") } return result, nil }