🏡 index : quine-global/quintodrome.git

// Package apiv1 provides primitives to interact with the openapi HTTP API.
//
// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.8.0 DO NOT EDIT.
package apiv1

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/go-chi/chi/v5"
)

// Defines values for ProblemCode.
const (
	ProblemCodeForbidden        ProblemCode = "forbidden"
	ProblemCodeInternal         ProblemCode = "internal"
	ProblemCodeMethodNotAllowed ProblemCode = "method_not_allowed"
	ProblemCodeNotFound         ProblemCode = "not_found"
	ProblemCodeUnauthorized     ProblemCode = "unauthorized"
	ProblemCodeUnavailable      ProblemCode = "unavailable"
	ProblemCodeValidation       ProblemCode = "validation"
)

// Valid indicates whether the value is a known member of the ProblemCode enum.
func (e ProblemCode) Valid() bool {
	switch e {
	case ProblemCodeForbidden:
		return true
	case ProblemCodeInternal:
		return true
	case ProblemCodeMethodNotAllowed:
		return true
	case ProblemCodeNotFound:
		return true
	case ProblemCodeUnauthorized:
		return true
	case ProblemCodeUnavailable:
		return true
	case ProblemCodeValidation:
		return true
	default:
		return false
	}
}

// Defines values for ServerInfoLoginMethods.
const (
	ServerInfoLoginMethodsPassword ServerInfoLoginMethods = "password"
)

// Valid indicates whether the value is a known member of the ServerInfoLoginMethods enum.
func (e ServerInfoLoginMethods) Valid() bool {
	switch e {
	case ServerInfoLoginMethodsPassword:
		return true
	default:
		return false
	}
}

// Problem RFC 9457 problem details, returned for every 4xx and 5xx response.
type Problem struct {
	// Code Machine-readable error code, and the value clients switch on. New codes may be added.
	Code ProblemCode `json:"code"`

	// Detail Human-readable explanation specific to this occurrence. Omitted for internal errors.
	Detail *string `json:"detail,omitempty"`

	// Errors Per-field failures. Present only when `code` is `validation`.
	Errors *[]ValidationError `json:"errors,omitempty"`

	// Status HTTP status code of this response.
	Status int `json:"status"`

	// Title Short human-readable summary, the same for all occurrences of this problem type.
	Title string `json:"title"`

	// Type URI reference identifying the problem type. Omitted while the problem carries no semantics
	// beyond its HTTP status code, which RFC 9457 defines as `about:blank`. Problems with their
	// own semantics get their own URI; switch on `code` instead.
	Type *string `json:"type,omitempty"`
}

// ProblemCode Machine-readable error code, and the value clients switch on. New codes may be added.
type ProblemCode string

// ServerInfo Public server description. Everything an add-server screen needs before login.
type ServerInfo struct {
	// LoginMethods Login methods this server accepts. New methods may be added; clients ignore values they do not recognise.
	LoginMethods []ServerInfoLoginMethods `json:"loginMethods"`

	// Name Human-readable server product name.
	Name string `json:"name"`

	// ServerVersion Version of the running server build.
	ServerVersion string `json:"serverVersion"`

	// SetupRequired True until the first admin user has been created.
	SetupRequired bool `json:"setupRequired"`

	// SpecVersion Version of the OpenAPI document this server implements.
	SpecVersion string `json:"specVersion"`
}

// ServerInfoLoginMethods defines model for ServerInfo.LoginMethods.
type ServerInfoLoginMethods string

// ValidationError One field-level validation failure.
type ValidationError struct {
	// Field Name of the offending query parameter, path parameter, or body field (dotted for nested).
	Field string `json:"field"`

	// Message Why the value was rejected.
	Message string `json:"message"`
}

// InternalError RFC 9457 problem details, returned for every 4xx and 5xx response.
type InternalError = Problem

// ServerInterface represents all server handlers.
type ServerInterface interface {
	// GetServerInfo Describe the server
	// (GET /server)
	GetServerInfo(w http.ResponseWriter, r *http.Request)
}

// Unimplemented server implementation that returns http.StatusNotImplemented for each endpoint.

type Unimplemented struct{}

// GetServerInfo Describe the server
// (GET /server)
func (_ Unimplemented) GetServerInfo(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusNotImplemented)
}

// ServerInterfaceWrapper converts contexts to parameters.
type ServerInterfaceWrapper struct {
	Handler            ServerInterface
	HandlerMiddlewares []MiddlewareFunc
	ErrorHandlerFunc   func(w http.ResponseWriter, r *http.Request, err error)
}

type MiddlewareFunc func(http.Handler) http.Handler

// GetServerInfo operation middleware
func (siw *ServerInterfaceWrapper) GetServerInfo(w http.ResponseWriter, r *http.Request) {

	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		siw.Handler.GetServerInfo(w, r)
	}))

	for _, middleware := range siw.HandlerMiddlewares {
		handler = middleware(handler)
	}

	handler.ServeHTTP(w, r)
}

type UnescapedCookieParamError struct {
	ParamName string
	Err       error
}

func (e *UnescapedCookieParamError) Error() string {
	return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName)
}

func (e *UnescapedCookieParamError) Unwrap() error {
	return e.Err
}

type UnmarshalingParamError struct {
	ParamName string
	Err       error
}

func (e *UnmarshalingParamError) Error() string {
	return fmt.Sprintf("Error unmarshaling parameter %s as JSON: %s", e.ParamName, e.Err.Error())
}

func (e *UnmarshalingParamError) Unwrap() error {
	return e.Err
}

type RequiredParamError struct {
	ParamName string
}

func (e *RequiredParamError) Error() string {
	return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName)
}

type RequiredHeaderError struct {
	ParamName string
	Err       error
}

func (e *RequiredHeaderError) Error() string {
	return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName)
}

func (e *RequiredHeaderError) Unwrap() error {
	return e.Err
}

type InvalidParamFormatError struct {
	ParamName string
	Err       error
}

func (e *InvalidParamFormatError) Error() string {
	return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error())
}

func (e *InvalidParamFormatError) Unwrap() error {
	return e.Err
}

type TooManyValuesForParamError struct {
	ParamName string
	Count     int
}

func (e *TooManyValuesForParamError) Error() string {
	return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count)
}

// Handler creates http.Handler with routing matching OpenAPI spec.
func Handler(si ServerInterface) http.Handler {
	return HandlerWithOptions(si, ChiServerOptions{})
}

type ChiServerOptions struct {
	BaseURL          string
	BaseRouter       chi.Router
	Middlewares      []MiddlewareFunc
	ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
}

// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux.
func HandlerFromMux(si ServerInterface, r chi.Router) http.Handler {
	return HandlerWithOptions(si, ChiServerOptions{
		BaseRouter: r,
	})
}

func HandlerFromMuxWithBaseURL(si ServerInterface, r chi.Router, baseURL string) http.Handler {
	return HandlerWithOptions(si, ChiServerOptions{
		BaseURL:    baseURL,
		BaseRouter: r,
	})
}

// HandlerWithOptions creates http.Handler with additional options
func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handler {
	r := options.BaseRouter

	if r == nil {
		r = chi.NewRouter()
	}
	if options.ErrorHandlerFunc == nil {
		options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) {
			http.Error(w, err.Error(), http.StatusBadRequest)
		}
	}
	wrapper := ServerInterfaceWrapper{
		Handler:            si,
		HandlerMiddlewares: options.Middlewares,
		ErrorHandlerFunc:   options.ErrorHandlerFunc,
	}

	r.Group(func(r chi.Router) {
		r.Get(options.BaseURL+"/server", wrapper.GetServerInfo)
	})

	return r
}

type InternalErrorApplicationProblemPlusJSONResponse Problem

type GetServerInfoRequestObject struct {
}

type GetServerInfoResponseObject interface {
	VisitGetServerInfoResponse(w http.ResponseWriter) error
}

type GetServerInfo200JSONResponse ServerInfo

func (response GetServerInfo200JSONResponse) VisitGetServerInfoResponse(w http.ResponseWriter) error {

	var buf bytes.Buffer
	if err := json.NewEncoder(&buf).Encode(response); err != nil {
		return err
	}
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(200)
	_, err := buf.WriteTo(w)
	return err
}

type GetServerInfo500ApplicationProblemPlusJSONResponse struct {
	InternalErrorApplicationProblemPlusJSONResponse
}

func (response GetServerInfo500ApplicationProblemPlusJSONResponse) VisitGetServerInfoResponse(w http.ResponseWriter) error {

	var buf bytes.Buffer
	if err := json.NewEncoder(&buf).Encode(response); err != nil {
		return err
	}
	w.Header().Set("Content-Type", "application/problem+json")
	w.WriteHeader(500)
	_, err := buf.WriteTo(w)
	return err
}

// StrictServerInterface represents all server handlers.
type StrictServerInterface interface {
	// GetServerInfo Describe the server
	// (GET /server)
	GetServerInfo(ctx context.Context, request GetServerInfoRequestObject) (GetServerInfoResponseObject, error)
}

type StrictHandlerFunc func(ctx context.Context, w http.ResponseWriter, r *http.Request, request any) (any, error)
type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc

type StrictHTTPServerOptions struct {
	RequestErrorHandlerFunc  func(w http.ResponseWriter, r *http.Request, err error)
	ResponseErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error)
}

func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface {
	return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictHTTPServerOptions{
		RequestErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) {
			http.Error(w, err.Error(), http.StatusBadRequest)
		},
		ResponseErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		},
	}}
}

func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictHTTPServerOptions) ServerInterface {
	if options.RequestErrorHandlerFunc == nil {
		options.RequestErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) {
			http.Error(w, err.Error(), http.StatusBadRequest)
		}
	}
	if options.ResponseErrorHandlerFunc == nil {
		options.ResponseErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
	}
	return &strictHandler{ssi: ssi, middlewares: middlewares, options: options}
}

type strictHandler struct {
	ssi         StrictServerInterface
	middlewares []StrictMiddlewareFunc
	options     StrictHTTPServerOptions
}

// GetServerInfo operation middleware
func (sh *strictHandler) GetServerInfo(w http.ResponseWriter, r *http.Request) {
	var request GetServerInfoRequestObject

	handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
		return sh.ssi.GetServerInfo(ctx, request.(GetServerInfoRequestObject))
	}
	for _, middleware := range sh.middlewares {
		handler = middleware(handler, "GetServerInfo")
	}

	response, err := handler(r.Context(), w, r, request)

	if err != nil {
		sh.options.ResponseErrorHandlerFunc(w, r, err)
	} else if validResponse, ok := response.(GetServerInfoResponseObject); ok {
		if err := validResponse.VisitGetServerInfoResponse(w); err != nil {
			sh.options.ResponseErrorHandlerFunc(w, r, err)
		}
	} else if response != nil {
		sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response))
	}
}