mirror of
https://github.com/derfenix/webarchive.git
synced 2026-03-11 12:41:54 +03:00
Update deps, refactoring
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
package api
|
||||
|
||||
//go:generate go run github.com/ogen-go/ogen/cmd/ogen@v0.60.1 --target ./openapi -package openapi --clean openapi.yaml
|
||||
//go:generate go run github.com/ogen-go/ogen/cmd/ogen@v0.77.0 --target ./openapi -package openapi --clean openapi.yaml
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/metric"
|
||||
"go.opentelemetry.io/otel/metric/instrument"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
ht "github.com/ogen-go/ogen/http"
|
||||
@@ -40,7 +39,7 @@ func (cfg *otelConfig) initOTEL() {
|
||||
cfg.TracerProvider = otel.GetTracerProvider()
|
||||
}
|
||||
if cfg.MeterProvider == nil {
|
||||
cfg.MeterProvider = metric.NewNoopMeterProvider()
|
||||
cfg.MeterProvider = otel.GetMeterProvider()
|
||||
}
|
||||
cfg.Tracer = cfg.TracerProvider.Tracer(otelogen.Name,
|
||||
trace.WithInstrumentationVersion(otelogen.SemVersion()),
|
||||
@@ -99,9 +98,9 @@ func newServerConfig(opts ...ServerOption) serverConfig {
|
||||
|
||||
type baseServer struct {
|
||||
cfg serverConfig
|
||||
requests instrument.Int64Counter
|
||||
errors instrument.Int64Counter
|
||||
duration instrument.Int64Histogram
|
||||
requests metric.Int64Counter
|
||||
errors metric.Int64Counter
|
||||
duration metric.Float64Histogram
|
||||
}
|
||||
|
||||
func (s baseServer) notFound(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -120,7 +119,7 @@ func (cfg serverConfig) baseServer() (s baseServer, err error) {
|
||||
if s.errors, err = s.cfg.Meter.Int64Counter(otelogen.ServerErrorsCount); err != nil {
|
||||
return s, err
|
||||
}
|
||||
if s.duration, err = s.cfg.Meter.Int64Histogram(otelogen.ServerDuration); err != nil {
|
||||
if s.duration, err = s.cfg.Meter.Float64Histogram(otelogen.ServerDuration); err != nil {
|
||||
return s, err
|
||||
}
|
||||
return s, nil
|
||||
@@ -162,9 +161,9 @@ func newClientConfig(opts ...ClientOption) clientConfig {
|
||||
|
||||
type baseClient struct {
|
||||
cfg clientConfig
|
||||
requests instrument.Int64Counter
|
||||
errors instrument.Int64Counter
|
||||
duration instrument.Int64Histogram
|
||||
requests metric.Int64Counter
|
||||
errors metric.Int64Counter
|
||||
duration metric.Float64Histogram
|
||||
}
|
||||
|
||||
func (cfg clientConfig) baseClient() (c baseClient, err error) {
|
||||
@@ -175,7 +174,7 @@ func (cfg clientConfig) baseClient() (c baseClient, err error) {
|
||||
if c.errors, err = c.cfg.Meter.Int64Counter(otelogen.ClientErrorsCount); err != nil {
|
||||
return c, err
|
||||
}
|
||||
if c.duration, err = c.cfg.Meter.Int64Histogram(otelogen.ClientDuration); err != nil {
|
||||
if c.duration, err = c.cfg.Meter.Float64Histogram(otelogen.ClientDuration); err != nil {
|
||||
return c, err
|
||||
}
|
||||
return c, nil
|
||||
@@ -200,7 +199,7 @@ func WithTracerProvider(provider trace.TracerProvider) Option {
|
||||
|
||||
// WithMeterProvider specifies a meter provider to use for creating a meter.
|
||||
//
|
||||
// If none is specified, the metric.NewNoopMeterProvider is used.
|
||||
// If none is specified, the otel.GetMeterProvider() is used.
|
||||
func WithMeterProvider(provider metric.MeterProvider) Option {
|
||||
return otelOptionFunc(func(cfg *otelConfig) {
|
||||
if provider != nil {
|
||||
|
||||
@@ -11,6 +11,8 @@ import (
|
||||
"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.19.0"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/ogen-go/ogen/conv"
|
||||
@@ -19,6 +21,34 @@ import (
|
||||
"github.com/ogen-go/ogen/uri"
|
||||
)
|
||||
|
||||
// Invoker invokes operations described by OpenAPI v3 specification.
|
||||
type Invoker interface {
|
||||
// AddPage invokes addPage operation.
|
||||
//
|
||||
// Add new page.
|
||||
//
|
||||
// POST /pages
|
||||
AddPage(ctx context.Context, request OptAddPageReq, params AddPageParams) (AddPageRes, error)
|
||||
// GetFile invokes getFile operation.
|
||||
//
|
||||
// Get file content.
|
||||
//
|
||||
// GET /pages/{id}/file/{file_id}
|
||||
GetFile(ctx context.Context, params GetFileParams) (GetFileRes, error)
|
||||
// GetPage invokes getPage operation.
|
||||
//
|
||||
// Get page details.
|
||||
//
|
||||
// GET /pages/{id}
|
||||
GetPage(ctx context.Context, params GetPageParams) (GetPageRes, error)
|
||||
// GetPages invokes getPages operation.
|
||||
//
|
||||
// Get all pages.
|
||||
//
|
||||
// GET /pages
|
||||
GetPages(ctx context.Context) (Pages, error)
|
||||
}
|
||||
|
||||
// Client implements OAS client.
|
||||
type Client struct {
|
||||
serverURL *url.URL
|
||||
@@ -78,19 +108,20 @@ func (c *Client) requestURL(ctx context.Context) *url.URL {
|
||||
// POST /pages
|
||||
func (c *Client) AddPage(ctx context.Context, request OptAddPageReq, params AddPageParams) (AddPageRes, error) {
|
||||
res, err := c.sendAddPage(ctx, request, params)
|
||||
_ = res
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (c *Client) sendAddPage(ctx context.Context, request OptAddPageReq, params AddPageParams) (res AddPageRes, err error) {
|
||||
otelAttrs := []attribute.KeyValue{
|
||||
otelogen.OperationID("addPage"),
|
||||
semconv.HTTPMethodKey.String("POST"),
|
||||
semconv.HTTPRouteKey.String("/pages"),
|
||||
}
|
||||
// Validate request before sending.
|
||||
if err := func() error {
|
||||
if request.Set {
|
||||
if value, ok := request.Get(); ok {
|
||||
if err := func() error {
|
||||
if err := request.Value.Validate(); err != nil {
|
||||
if err := value.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -106,12 +137,13 @@ func (c *Client) sendAddPage(ctx context.Context, request OptAddPageReq, params
|
||||
// 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, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
c.requests.Add(ctx, 1, otelAttrs...)
|
||||
c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
// Start a span for this request.
|
||||
ctx, span := c.cfg.Tracer.Start(ctx, "AddPage",
|
||||
@@ -124,7 +156,7 @@ func (c *Client) sendAddPage(ctx context.Context, request OptAddPageReq, params
|
||||
if err != nil {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
c.errors.Add(ctx, 1, otelAttrs...)
|
||||
c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
span.End()
|
||||
}()
|
||||
@@ -197,7 +229,7 @@ func (c *Client) sendAddPage(ctx context.Context, request OptAddPageReq, params
|
||||
u.RawQuery = q.Values().Encode()
|
||||
|
||||
stage = "EncodeRequest"
|
||||
r, err := ht.NewRequest(ctx, "POST", u, nil)
|
||||
r, err := ht.NewRequest(ctx, "POST", u)
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "create request")
|
||||
}
|
||||
@@ -228,24 +260,26 @@ func (c *Client) sendAddPage(ctx context.Context, request OptAddPageReq, params
|
||||
// GET /pages/{id}/file/{file_id}
|
||||
func (c *Client) GetFile(ctx context.Context, params GetFileParams) (GetFileRes, error) {
|
||||
res, err := c.sendGetFile(ctx, params)
|
||||
_ = res
|
||||
return res, err
|
||||
}
|
||||
|
||||
func (c *Client) sendGetFile(ctx context.Context, params GetFileParams) (res GetFileRes, err error) {
|
||||
otelAttrs := []attribute.KeyValue{
|
||||
otelogen.OperationID("getFile"),
|
||||
semconv.HTTPMethodKey.String("GET"),
|
||||
semconv.HTTPRouteKey.String("/pages/{id}/file/{file_id}"),
|
||||
}
|
||||
|
||||
// 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, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
c.requests.Add(ctx, 1, otelAttrs...)
|
||||
c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
// Start a span for this request.
|
||||
ctx, span := c.cfg.Tracer.Start(ctx, "GetFile",
|
||||
@@ -258,7 +292,7 @@ func (c *Client) sendGetFile(ctx context.Context, params GetFileParams) (res Get
|
||||
if err != nil {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
c.errors.Add(ctx, 1, otelAttrs...)
|
||||
c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
span.End()
|
||||
}()
|
||||
@@ -307,7 +341,7 @@ func (c *Client) sendGetFile(ctx context.Context, params GetFileParams) (res Get
|
||||
uri.AddPathParts(u, pathParts[:]...)
|
||||
|
||||
stage = "EncodeRequest"
|
||||
r, err := ht.NewRequest(ctx, "GET", u, nil)
|
||||
r, err := ht.NewRequest(ctx, "GET", u)
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "create request")
|
||||
}
|
||||
@@ -335,24 +369,26 @@ func (c *Client) sendGetFile(ctx context.Context, params GetFileParams) (res Get
|
||||
// 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"),
|
||||
semconv.HTTPMethodKey.String("GET"),
|
||||
semconv.HTTPRouteKey.String("/pages/{id}"),
|
||||
}
|
||||
|
||||
// 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, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
c.requests.Add(ctx, 1, otelAttrs...)
|
||||
c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
// Start a span for this request.
|
||||
ctx, span := c.cfg.Tracer.Start(ctx, "GetPage",
|
||||
@@ -365,7 +401,7 @@ func (c *Client) sendGetPage(ctx context.Context, params GetPageParams) (res Get
|
||||
if err != nil {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
c.errors.Add(ctx, 1, otelAttrs...)
|
||||
c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
span.End()
|
||||
}()
|
||||
@@ -395,7 +431,7 @@ func (c *Client) sendGetPage(ctx context.Context, params GetPageParams) (res Get
|
||||
uri.AddPathParts(u, pathParts[:]...)
|
||||
|
||||
stage = "EncodeRequest"
|
||||
r, err := ht.NewRequest(ctx, "GET", u, nil)
|
||||
r, err := ht.NewRequest(ctx, "GET", u)
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "create request")
|
||||
}
|
||||
@@ -423,24 +459,26 @@ func (c *Client) sendGetPage(ctx context.Context, params GetPageParams) (res Get
|
||||
// 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"),
|
||||
semconv.HTTPMethodKey.String("GET"),
|
||||
semconv.HTTPRouteKey.String("/pages"),
|
||||
}
|
||||
|
||||
// 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, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
c.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
c.requests.Add(ctx, 1, otelAttrs...)
|
||||
c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
// Start a span for this request.
|
||||
ctx, span := c.cfg.Tracer.Start(ctx, "GetPages",
|
||||
@@ -453,7 +491,7 @@ func (c *Client) sendGetPages(ctx context.Context) (res Pages, err error) {
|
||||
if err != nil {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
c.errors.Add(ctx, 1, otelAttrs...)
|
||||
c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
span.End()
|
||||
}()
|
||||
@@ -465,7 +503,7 @@ func (c *Client) sendGetPages(ctx context.Context) (res Pages, err error) {
|
||||
uri.AddPathParts(u, pathParts[:]...)
|
||||
|
||||
stage = "EncodeRequest"
|
||||
r, err := ht.NewRequest(ctx, "GET", u, nil)
|
||||
r, err := ht.NewRequest(ctx, "GET", u)
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "create request")
|
||||
}
|
||||
|
||||
@@ -10,7 +10,8 @@ import (
|
||||
"github.com/go-faster/errors"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/codes"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
||||
"go.opentelemetry.io/otel/metric"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.19.0"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
ht "github.com/ogen-go/ogen/http"
|
||||
@@ -42,17 +43,18 @@ func (s *Server) handleAddPageRequest(args [0]string, argsEscaped bool, w http.R
|
||||
startTime := time.Now()
|
||||
defer func() {
|
||||
elapsedDuration := time.Since(startTime)
|
||||
s.duration.Record(ctx, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||
s.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
s.requests.Add(ctx, 1, otelAttrs...)
|
||||
s.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
var (
|
||||
recordError = func(stage string, err error) {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
s.errors.Add(ctx, 1, otelAttrs...)
|
||||
s.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
err error
|
||||
opErrContext = ogenerrors.OperationContext{
|
||||
@@ -89,10 +91,11 @@ func (s *Server) handleAddPageRequest(args [0]string, argsEscaped bool, w http.R
|
||||
var response AddPageRes
|
||||
if m := s.cfg.Middleware; m != nil {
|
||||
mreq := middleware.Request{
|
||||
Context: ctx,
|
||||
OperationName: "AddPage",
|
||||
OperationID: "addPage",
|
||||
Body: request,
|
||||
Context: ctx,
|
||||
OperationName: "AddPage",
|
||||
OperationSummary: "Add new page",
|
||||
OperationID: "addPage",
|
||||
Body: request,
|
||||
Params: middleware.Parameters{
|
||||
{
|
||||
Name: "url",
|
||||
@@ -132,22 +135,27 @@ func (s *Server) handleAddPageRequest(args [0]string, argsEscaped bool, w http.R
|
||||
response, err = s.h.AddPage(ctx, request, params)
|
||||
}
|
||||
if err != nil {
|
||||
recordError("Internal", err)
|
||||
if errRes, ok := errors.Into[*ErrorStatusCode](err); ok {
|
||||
encodeErrorResponse(errRes, w, span)
|
||||
if err := encodeErrorResponse(errRes, w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
if errors.Is(err, ht.ErrNotImplemented) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
return
|
||||
}
|
||||
encodeErrorResponse(s.h.NewError(ctx, err), w, span)
|
||||
if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := encodeAddPageResponse(response, w, span); err != nil {
|
||||
recordError("EncodeResponse", err)
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
if !errors.Is(err, ht.ErrInternalServerErrorResponse) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -175,17 +183,18 @@ func (s *Server) handleGetFileRequest(args [2]string, argsEscaped bool, w http.R
|
||||
startTime := time.Now()
|
||||
defer func() {
|
||||
elapsedDuration := time.Since(startTime)
|
||||
s.duration.Record(ctx, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||
s.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
s.requests.Add(ctx, 1, otelAttrs...)
|
||||
s.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
var (
|
||||
recordError = func(stage string, err error) {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
s.errors.Add(ctx, 1, otelAttrs...)
|
||||
s.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
err error
|
||||
opErrContext = ogenerrors.OperationContext{
|
||||
@@ -207,10 +216,11 @@ func (s *Server) handleGetFileRequest(args [2]string, argsEscaped bool, w http.R
|
||||
var response GetFileRes
|
||||
if m := s.cfg.Middleware; m != nil {
|
||||
mreq := middleware.Request{
|
||||
Context: ctx,
|
||||
OperationName: "GetFile",
|
||||
OperationID: "getFile",
|
||||
Body: nil,
|
||||
Context: ctx,
|
||||
OperationName: "GetFile",
|
||||
OperationSummary: "",
|
||||
OperationID: "getFile",
|
||||
Body: nil,
|
||||
Params: middleware.Parameters{
|
||||
{
|
||||
Name: "id",
|
||||
@@ -246,22 +256,27 @@ func (s *Server) handleGetFileRequest(args [2]string, argsEscaped bool, w http.R
|
||||
response, err = s.h.GetFile(ctx, params)
|
||||
}
|
||||
if err != nil {
|
||||
recordError("Internal", err)
|
||||
if errRes, ok := errors.Into[*ErrorStatusCode](err); ok {
|
||||
encodeErrorResponse(errRes, w, span)
|
||||
if err := encodeErrorResponse(errRes, w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
if errors.Is(err, ht.ErrNotImplemented) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
return
|
||||
}
|
||||
encodeErrorResponse(s.h.NewError(ctx, err), w, span)
|
||||
if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := encodeGetFileResponse(response, w, span); err != nil {
|
||||
recordError("EncodeResponse", err)
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
if !errors.Is(err, ht.ErrInternalServerErrorResponse) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -289,17 +304,18 @@ func (s *Server) handleGetPageRequest(args [1]string, argsEscaped bool, w http.R
|
||||
startTime := time.Now()
|
||||
defer func() {
|
||||
elapsedDuration := time.Since(startTime)
|
||||
s.duration.Record(ctx, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||
s.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
s.requests.Add(ctx, 1, otelAttrs...)
|
||||
s.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
var (
|
||||
recordError = func(stage string, err error) {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
s.errors.Add(ctx, 1, otelAttrs...)
|
||||
s.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
err error
|
||||
opErrContext = ogenerrors.OperationContext{
|
||||
@@ -321,10 +337,11 @@ func (s *Server) handleGetPageRequest(args [1]string, argsEscaped bool, w http.R
|
||||
var response GetPageRes
|
||||
if m := s.cfg.Middleware; m != nil {
|
||||
mreq := middleware.Request{
|
||||
Context: ctx,
|
||||
OperationName: "GetPage",
|
||||
OperationID: "getPage",
|
||||
Body: nil,
|
||||
Context: ctx,
|
||||
OperationName: "GetPage",
|
||||
OperationSummary: "",
|
||||
OperationID: "getPage",
|
||||
Body: nil,
|
||||
Params: middleware.Parameters{
|
||||
{
|
||||
Name: "id",
|
||||
@@ -356,22 +373,27 @@ func (s *Server) handleGetPageRequest(args [1]string, argsEscaped bool, w http.R
|
||||
response, err = s.h.GetPage(ctx, params)
|
||||
}
|
||||
if err != nil {
|
||||
recordError("Internal", err)
|
||||
if errRes, ok := errors.Into[*ErrorStatusCode](err); ok {
|
||||
encodeErrorResponse(errRes, w, span)
|
||||
if err := encodeErrorResponse(errRes, w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
if errors.Is(err, ht.ErrNotImplemented) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
return
|
||||
}
|
||||
encodeErrorResponse(s.h.NewError(ctx, err), w, span)
|
||||
if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := encodeGetPageResponse(response, w, span); err != nil {
|
||||
recordError("EncodeResponse", err)
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
if !errors.Is(err, ht.ErrInternalServerErrorResponse) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -399,17 +421,18 @@ func (s *Server) handleGetPagesRequest(args [0]string, argsEscaped bool, w http.
|
||||
startTime := time.Now()
|
||||
defer func() {
|
||||
elapsedDuration := time.Since(startTime)
|
||||
s.duration.Record(ctx, elapsedDuration.Microseconds(), otelAttrs...)
|
||||
// Use floating point division here for higher precision (instead of Millisecond method).
|
||||
s.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...))
|
||||
}()
|
||||
|
||||
// Increment request counter.
|
||||
s.requests.Add(ctx, 1, otelAttrs...)
|
||||
s.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
|
||||
var (
|
||||
recordError = func(stage string, err error) {
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, stage)
|
||||
s.errors.Add(ctx, 1, otelAttrs...)
|
||||
s.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...))
|
||||
}
|
||||
err error
|
||||
)
|
||||
@@ -417,12 +440,13 @@ func (s *Server) handleGetPagesRequest(args [0]string, argsEscaped bool, w http.
|
||||
var response Pages
|
||||
if m := s.cfg.Middleware; m != nil {
|
||||
mreq := middleware.Request{
|
||||
Context: ctx,
|
||||
OperationName: "GetPages",
|
||||
OperationID: "getPages",
|
||||
Body: nil,
|
||||
Params: middleware.Parameters{},
|
||||
Raw: r,
|
||||
Context: ctx,
|
||||
OperationName: "GetPages",
|
||||
OperationSummary: "Get all pages",
|
||||
OperationID: "getPages",
|
||||
Body: nil,
|
||||
Params: middleware.Parameters{},
|
||||
Raw: r,
|
||||
}
|
||||
|
||||
type (
|
||||
@@ -447,22 +471,27 @@ func (s *Server) handleGetPagesRequest(args [0]string, argsEscaped bool, w http.
|
||||
response, err = s.h.GetPages(ctx)
|
||||
}
|
||||
if err != nil {
|
||||
recordError("Internal", err)
|
||||
if errRes, ok := errors.Into[*ErrorStatusCode](err); ok {
|
||||
encodeErrorResponse(errRes, w, span)
|
||||
if err := encodeErrorResponse(errRes, w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
if errors.Is(err, ht.ErrNotImplemented) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
return
|
||||
}
|
||||
encodeErrorResponse(s.h.NewError(ctx, err), w, span)
|
||||
if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil {
|
||||
recordError("Internal", err)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := encodeGetPagesResponse(response, w, span); err != nil {
|
||||
recordError("EncodeResponse", err)
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
if !errors.Is(err, ht.ErrInternalServerErrorResponse) {
|
||||
s.cfg.ErrorHandler(ctx, w, r, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,12 +23,10 @@ func (s *AddPageBadRequest) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *AddPageBadRequest) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("field")
|
||||
e.Str(s.Field)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("error")
|
||||
e.Str(s.Error)
|
||||
}
|
||||
@@ -138,7 +136,6 @@ func (s *AddPageReq) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *AddPageReq) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("url")
|
||||
e.Str(s.URL)
|
||||
}
|
||||
@@ -280,7 +277,6 @@ func (s *Error) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *Error) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("message")
|
||||
e.Str(s.Message)
|
||||
}
|
||||
@@ -506,22 +502,18 @@ func (s *Page) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *Page) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("id")
|
||||
json.EncodeUUID(e, s.ID)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("url")
|
||||
e.Str(s.URL)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("created")
|
||||
json.EncodeDateTime(e, s.Created)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("formats")
|
||||
e.ArrStart()
|
||||
for _, elem := range s.Formats {
|
||||
@@ -530,12 +522,10 @@ func (s *Page) encodeFields(e *jx.Encoder) {
|
||||
e.ArrEnd()
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("status")
|
||||
s.Status.Encode(e)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("meta")
|
||||
s.Meta.Encode(e)
|
||||
}
|
||||
@@ -699,12 +689,10 @@ func (s *PageMeta) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *PageMeta) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("title")
|
||||
e.Str(s.Title)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("description")
|
||||
e.Str(s.Description)
|
||||
}
|
||||
@@ -831,22 +819,18 @@ func (s *PageWithResults) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *PageWithResults) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("id")
|
||||
json.EncodeUUID(e, s.ID)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("url")
|
||||
e.Str(s.URL)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("created")
|
||||
json.EncodeDateTime(e, s.Created)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("formats")
|
||||
e.ArrStart()
|
||||
for _, elem := range s.Formats {
|
||||
@@ -855,17 +839,14 @@ func (s *PageWithResults) encodeFields(e *jx.Encoder) {
|
||||
e.ArrEnd()
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("status")
|
||||
s.Status.Encode(e)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("meta")
|
||||
s.Meta.Encode(e)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("results")
|
||||
e.ArrStart()
|
||||
for _, elem := range s.Results {
|
||||
@@ -1052,12 +1033,10 @@ func (s *PageWithResultsMeta) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *PageWithResultsMeta) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("title")
|
||||
e.Str(s.Title)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("description")
|
||||
e.Str(s.Description)
|
||||
}
|
||||
@@ -1234,7 +1213,6 @@ func (s *Result) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *Result) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("format")
|
||||
s.Format.Encode(e)
|
||||
}
|
||||
@@ -1245,7 +1223,6 @@ func (s *Result) encodeFields(e *jx.Encoder) {
|
||||
}
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("files")
|
||||
e.ArrStart()
|
||||
for _, elem := range s.Files {
|
||||
@@ -1374,22 +1351,18 @@ func (s *ResultFilesItem) Encode(e *jx.Encoder) {
|
||||
// encodeFields encodes fields.
|
||||
func (s *ResultFilesItem) encodeFields(e *jx.Encoder) {
|
||||
{
|
||||
|
||||
e.FieldStart("id")
|
||||
json.EncodeUUID(e, s.ID)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("name")
|
||||
e.Str(s.Name)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("mimetype")
|
||||
e.Str(s.Mimetype)
|
||||
}
|
||||
{
|
||||
|
||||
e.FieldStart("size")
|
||||
e.Int64(s.Size)
|
||||
}
|
||||
|
||||
@@ -77,9 +77,9 @@ func (s *Server) decodeAddPageRequest(r *http.Request) (
|
||||
return req, close, err
|
||||
}
|
||||
if err := func() error {
|
||||
if request.Set {
|
||||
if value, ok := request.Get(); ok {
|
||||
if err := func() error {
|
||||
if err := request.Value.Validate(); err != nil {
|
||||
if err := value.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -20,7 +20,7 @@ func encodeAddPageRequest(
|
||||
// Keep request with empty body if value is not set.
|
||||
return nil
|
||||
}
|
||||
e := jx.GetEncoder()
|
||||
e := new(jx.Encoder)
|
||||
{
|
||||
if req.Set {
|
||||
req.Encode(e)
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
"github.com/ogen-go/ogen/validate"
|
||||
)
|
||||
|
||||
func decodeAddPageResponse(resp *http.Response) (res AddPageRes, err error) {
|
||||
func decodeAddPageResponse(resp *http.Response) (res AddPageRes, _ error) {
|
||||
switch resp.StatusCode {
|
||||
case 201:
|
||||
// Code 201.
|
||||
@@ -128,12 +128,12 @@ func decodeAddPageResponse(resp *http.Response) (res AddPageRes, err error) {
|
||||
}
|
||||
}()
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "default")
|
||||
return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode)
|
||||
}
|
||||
return res, errors.Wrap(defRes, "error")
|
||||
}
|
||||
|
||||
func decodeGetFileResponse(resp *http.Response) (res GetFileRes, err error) {
|
||||
func decodeGetFileResponse(resp *http.Response) (res GetFileRes, _ error) {
|
||||
switch resp.StatusCode {
|
||||
case 200:
|
||||
// Code 200.
|
||||
@@ -216,12 +216,12 @@ func decodeGetFileResponse(resp *http.Response) (res GetFileRes, err error) {
|
||||
}
|
||||
}()
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "default")
|
||||
return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode)
|
||||
}
|
||||
return res, errors.Wrap(defRes, "error")
|
||||
}
|
||||
|
||||
func decodeGetPageResponse(resp *http.Response) (res GetPageRes, err error) {
|
||||
func decodeGetPageResponse(resp *http.Response) (res GetPageRes, _ error) {
|
||||
switch resp.StatusCode {
|
||||
case 200:
|
||||
// Code 200.
|
||||
@@ -302,12 +302,12 @@ func decodeGetPageResponse(resp *http.Response) (res GetPageRes, err error) {
|
||||
}
|
||||
}()
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "default")
|
||||
return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode)
|
||||
}
|
||||
return res, errors.Wrap(defRes, "error")
|
||||
}
|
||||
|
||||
func decodeGetPagesResponse(resp *http.Response) (res Pages, err error) {
|
||||
func decodeGetPagesResponse(resp *http.Response) (res Pages, _ error) {
|
||||
switch resp.StatusCode {
|
||||
case 200:
|
||||
// Code 200.
|
||||
@@ -385,7 +385,7 @@ func decodeGetPagesResponse(resp *http.Response) (res Pages, err error) {
|
||||
}
|
||||
}()
|
||||
if err != nil {
|
||||
return res, errors.Wrap(err, "default")
|
||||
return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode)
|
||||
}
|
||||
return res, errors.Wrap(defRes, "error")
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ import (
|
||||
"github.com/go-faster/jx"
|
||||
"go.opentelemetry.io/otel/codes"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
ht "github.com/ogen-go/ogen/http"
|
||||
)
|
||||
|
||||
func encodeAddPageResponse(response AddPageRes, w http.ResponseWriter, span trace.Span) error {
|
||||
@@ -19,11 +21,12 @@ func encodeAddPageResponse(response AddPageRes, w http.ResponseWriter, span trac
|
||||
w.WriteHeader(201)
|
||||
span.SetStatus(codes.Ok, http.StatusText(201))
|
||||
|
||||
e := jx.GetEncoder()
|
||||
e := new(jx.Encoder)
|
||||
response.Encode(e)
|
||||
if _, err := e.WriteTo(w); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case *AddPageBadRequest:
|
||||
@@ -31,11 +34,12 @@ func encodeAddPageResponse(response AddPageRes, w http.ResponseWriter, span trac
|
||||
w.WriteHeader(400)
|
||||
span.SetStatus(codes.Error, http.StatusText(400))
|
||||
|
||||
e := jx.GetEncoder()
|
||||
e := new(jx.Encoder)
|
||||
response.Encode(e)
|
||||
if _, err := e.WriteTo(w); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
default:
|
||||
@@ -54,6 +58,7 @@ func encodeGetFileResponse(response GetFileRes, w http.ResponseWriter, span trac
|
||||
if _, err := io.Copy(writer, response); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case *GetFileOKTextHTML:
|
||||
@@ -65,6 +70,7 @@ func encodeGetFileResponse(response GetFileRes, w http.ResponseWriter, span trac
|
||||
if _, err := io.Copy(writer, response); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case *GetFileOKTextPlain:
|
||||
@@ -76,6 +82,7 @@ func encodeGetFileResponse(response GetFileRes, w http.ResponseWriter, span trac
|
||||
if _, err := io.Copy(writer, response); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case *GetFileNotFound:
|
||||
@@ -96,11 +103,12 @@ func encodeGetPageResponse(response GetPageRes, w http.ResponseWriter, span trac
|
||||
w.WriteHeader(200)
|
||||
span.SetStatus(codes.Ok, http.StatusText(200))
|
||||
|
||||
e := jx.GetEncoder()
|
||||
e := new(jx.Encoder)
|
||||
response.Encode(e)
|
||||
if _, err := e.WriteTo(w); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
case *GetPageNotFound:
|
||||
@@ -119,11 +127,12 @@ func encodeGetPagesResponse(response Pages, w http.ResponseWriter, span trace.Sp
|
||||
w.WriteHeader(200)
|
||||
span.SetStatus(codes.Ok, http.StatusText(200))
|
||||
|
||||
e := jx.GetEncoder()
|
||||
e := new(jx.Encoder)
|
||||
response.Encode(e)
|
||||
if _, err := e.WriteTo(w); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -142,11 +151,15 @@ func encodeErrorResponse(response *ErrorStatusCode, w http.ResponseWriter, span
|
||||
span.SetStatus(codes.Ok, st)
|
||||
}
|
||||
|
||||
e := jx.GetEncoder()
|
||||
e := new(jx.Encoder)
|
||||
response.Response.Encode(e)
|
||||
if _, err := e.WriteTo(w); err != nil {
|
||||
return errors.Wrap(err, "write")
|
||||
}
|
||||
|
||||
if code >= http.StatusInternalServerError {
|
||||
return errors.Wrapf(ht.ErrInternalServerErrorResponse, "code: %d, message: %s", code, http.StatusText(code))
|
||||
}
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,19 @@ import (
|
||||
"github.com/ogen-go/ogen/uri"
|
||||
)
|
||||
|
||||
func (s *Server) cutPrefix(path string) (string, bool) {
|
||||
prefix := s.cfg.Prefix
|
||||
if prefix == "" {
|
||||
return path, true
|
||||
}
|
||||
if !strings.HasPrefix(path, prefix) {
|
||||
// Prefix doesn't match.
|
||||
return "", false
|
||||
}
|
||||
// Cut prefix from the path.
|
||||
return strings.TrimPrefix(path, prefix), true
|
||||
}
|
||||
|
||||
// ServeHTTP serves http request as defined by OpenAPI v3 specification,
|
||||
// calling handler that matches the path or returning not found error.
|
||||
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -21,17 +34,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
elemIsEscaped = strings.ContainsRune(elem, '%')
|
||||
}
|
||||
}
|
||||
if prefix := s.cfg.Prefix; len(prefix) > 0 {
|
||||
if strings.HasPrefix(elem, prefix) {
|
||||
// Cut prefix from the path.
|
||||
elem = strings.TrimPrefix(elem, prefix)
|
||||
} else {
|
||||
// Prefix doesn't match.
|
||||
s.notFound(w, r)
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(elem) == 0 {
|
||||
|
||||
elem, ok := s.cutPrefix(elem)
|
||||
if !ok || len(elem) == 0 {
|
||||
s.notFound(w, r)
|
||||
return
|
||||
}
|
||||
@@ -129,6 +134,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
// Route is route object.
|
||||
type Route struct {
|
||||
name string
|
||||
summary string
|
||||
operationID string
|
||||
pathPattern string
|
||||
count int
|
||||
@@ -142,6 +148,11 @@ func (r Route) Name() string {
|
||||
return r.name
|
||||
}
|
||||
|
||||
// Summary returns OpenAPI summary.
|
||||
func (r Route) Summary() string {
|
||||
return r.summary
|
||||
}
|
||||
|
||||
// OperationID returns OpenAPI operationId.
|
||||
func (r Route) OperationID() string {
|
||||
return r.operationID
|
||||
@@ -183,6 +194,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
|
||||
}()
|
||||
}
|
||||
|
||||
elem, ok := s.cutPrefix(elem)
|
||||
if !ok {
|
||||
return r, false
|
||||
}
|
||||
|
||||
// Static code generated router with unwrapped path search.
|
||||
switch {
|
||||
default:
|
||||
@@ -201,6 +217,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
|
||||
switch method {
|
||||
case "GET":
|
||||
r.name = "GetPages"
|
||||
r.summary = "Get all pages"
|
||||
r.operationID = "getPages"
|
||||
r.pathPattern = "/pages"
|
||||
r.args = args
|
||||
@@ -208,6 +225,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
|
||||
return r, true
|
||||
case "POST":
|
||||
r.name = "AddPage"
|
||||
r.summary = "Add new page"
|
||||
r.operationID = "addPage"
|
||||
r.pathPattern = "/pages"
|
||||
r.args = args
|
||||
@@ -238,6 +256,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
|
||||
switch method {
|
||||
case "GET":
|
||||
r.name = "GetPage"
|
||||
r.summary = ""
|
||||
r.operationID = "getPage"
|
||||
r.pathPattern = "/pages/{id}"
|
||||
r.args = args
|
||||
@@ -265,6 +284,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
|
||||
case "GET":
|
||||
// Leaf: GetFile
|
||||
r.name = "GetFile"
|
||||
r.summary = ""
|
||||
r.operationID = "getFile"
|
||||
r.pathPattern = "/pages/{id}/file/{file_id}"
|
||||
r.args = args
|
||||
|
||||
@@ -140,6 +140,16 @@ const (
|
||||
FormatHeaders Format = "headers"
|
||||
)
|
||||
|
||||
// AllValues returns all Format values.
|
||||
func (Format) AllValues() []Format {
|
||||
return []Format{
|
||||
FormatAll,
|
||||
FormatPdf,
|
||||
FormatSingleFile,
|
||||
FormatHeaders,
|
||||
}
|
||||
}
|
||||
|
||||
// MarshalText implements encoding.TextMarshaler.
|
||||
func (s Format) MarshalText() ([]byte, error) {
|
||||
switch s {
|
||||
@@ -189,6 +199,9 @@ type GetFileOKApplicationPdf struct {
|
||||
//
|
||||
// Kept to satisfy the io.Reader interface.
|
||||
func (s GetFileOKApplicationPdf) Read(p []byte) (n int, err error) {
|
||||
if s.Data == nil {
|
||||
return 0, io.EOF
|
||||
}
|
||||
return s.Data.Read(p)
|
||||
}
|
||||
|
||||
@@ -202,6 +215,9 @@ type GetFileOKTextHTML struct {
|
||||
//
|
||||
// Kept to satisfy the io.Reader interface.
|
||||
func (s GetFileOKTextHTML) Read(p []byte) (n int, err error) {
|
||||
if s.Data == nil {
|
||||
return 0, io.EOF
|
||||
}
|
||||
return s.Data.Read(p)
|
||||
}
|
||||
|
||||
@@ -215,6 +231,9 @@ type GetFileOKTextPlain struct {
|
||||
//
|
||||
// Kept to satisfy the io.Reader interface.
|
||||
func (s GetFileOKTextPlain) Read(p []byte) (n int, err error) {
|
||||
if s.Data == nil {
|
||||
return 0, io.EOF
|
||||
}
|
||||
return s.Data.Read(p)
|
||||
}
|
||||
|
||||
@@ -642,6 +661,17 @@ const (
|
||||
StatusWithErrors Status = "with_errors"
|
||||
)
|
||||
|
||||
// AllValues returns all Status values.
|
||||
func (Status) AllValues() []Status {
|
||||
return []Status{
|
||||
StatusNew,
|
||||
StatusProcessing,
|
||||
StatusDone,
|
||||
StatusFailed,
|
||||
StatusWithErrors,
|
||||
}
|
||||
}
|
||||
|
||||
// MarshalText implements encoding.TextMarshaler.
|
||||
func (s Status) MarshalText() ([]byte, error) {
|
||||
switch s {
|
||||
|
||||
@@ -42,6 +42,7 @@ func (s *AddPageReq) Validate() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Format) Validate() error {
|
||||
switch s {
|
||||
case "all":
|
||||
@@ -103,6 +104,7 @@ func (s *Page) Validate() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *PageWithResults) Validate() error {
|
||||
var failures []validate.FieldError
|
||||
if err := func() error {
|
||||
@@ -177,12 +179,14 @@ func (s *PageWithResults) Validate() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Pages) Validate() error {
|
||||
if s == nil {
|
||||
alias := ([]Page)(s)
|
||||
if alias == nil {
|
||||
return errors.New("nil is invalid value")
|
||||
}
|
||||
var failures []validate.FieldError
|
||||
for i, elem := range s {
|
||||
for i, elem := range alias {
|
||||
if err := func() error {
|
||||
if err := elem.Validate(); err != nil {
|
||||
return err
|
||||
@@ -200,6 +204,7 @@ func (s Pages) Validate() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Result) Validate() error {
|
||||
var failures []validate.FieldError
|
||||
if err := func() error {
|
||||
@@ -229,6 +234,7 @@ func (s *Result) Validate() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s Status) Validate() error {
|
||||
switch s {
|
||||
case "new":
|
||||
|
||||
Reference in New Issue
Block a user