feat: polish & windviz & deploy

This commit is contained in:
Anatoly Antonov 2026-05-30 06:29:39 +09:00
parent 81b8e763bd
commit 465ad00f7b
78 changed files with 20622 additions and 2154 deletions

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,27 @@
// Code generated by ogen, DO NOT EDIT.
package rest
// setDefaults set default value of fields.
func (s *ConstraintSpec) setDefaults() {
{
val := ConstraintSpecAction("stop")
s.Action.SetTo(val)
}
}
// setDefaults set default value of fields.
func (s *PiecewiseSegment) setDefaults() {
{
val := PiecewiseSegmentReference("absolute")
s.Reference.SetTo(val)
}
}
// setDefaults set default value of fields.
func (s *PredictionV2Request) setDefaults() {
{
val := PredictionV2RequestDirection("forward")
s.Direction.SetTo(val)
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -6,6 +6,19 @@ package rest
type OperationName = string
const (
PerformPredictionOperation OperationName = "PerformPrediction"
ReadinessCheckOperation OperationName = "ReadinessCheck"
CancelDatasetJobOperation OperationName = "CancelDatasetJob"
CancelPredictionJobOperation OperationName = "CancelPredictionJob"
CreatePredictionJobOperation OperationName = "CreatePredictionJob"
DeleteDatasetOperation OperationName = "DeleteDataset"
GetDatasetJobOperation OperationName = "GetDatasetJob"
GetPredictionJobOperation OperationName = "GetPredictionJob"
GetServiceStatusOperation OperationName = "GetServiceStatus"
GetWindFieldOperation OperationName = "GetWindField"
GetWindMetaOperation OperationName = "GetWindMeta"
ListDatasetJobsOperation OperationName = "ListDatasetJobs"
ListDatasetsOperation OperationName = "ListDatasets"
PerformPredictionOperation OperationName = "PerformPrediction"
PerformPredictionV2Operation OperationName = "PerformPredictionV2"
ReadinessCheckOperation OperationName = "ReadinessCheck"
TriggerDatasetDownloadOperation OperationName = "TriggerDatasetDownload"
)

View file

@ -4,6 +4,7 @@ package rest
import (
"net/http"
"net/url"
"time"
"github.com/go-faster/errors"
@ -14,6 +15,791 @@ import (
"github.com/ogen-go/ogen/validate"
)
// CancelDatasetJobParams is parameters of cancelDatasetJob operation.
type CancelDatasetJobParams struct {
ID string
}
func unpackCancelDatasetJobParams(packed middleware.Parameters) (params CancelDatasetJobParams) {
{
key := middleware.ParameterKey{
Name: "id",
In: "path",
}
params.ID = packed[key].(string)
}
return params
}
func decodeCancelDatasetJobParams(args [1]string, argsEscaped bool, r *http.Request) (params CancelDatasetJobParams, _ error) {
// Decode path: id.
if err := func() error {
param := args[0]
if argsEscaped {
unescaped, err := url.PathUnescape(args[0])
if err != nil {
return errors.Wrap(err, "unescape path")
}
param = unescaped
}
if len(param) > 0 {
d := uri.NewPathDecoder(uri.PathDecoderConfig{
Param: "id",
Value: param,
Style: uri.PathStyleSimple,
Explode: false,
})
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToString(val)
if err != nil {
return err
}
params.ID = c
return nil
}(); err != nil {
return err
}
} else {
return validate.ErrFieldRequired
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "id",
In: "path",
Err: err,
}
}
return params, nil
}
// CancelPredictionJobParams is parameters of cancelPredictionJob operation.
type CancelPredictionJobParams struct {
ID string
}
func unpackCancelPredictionJobParams(packed middleware.Parameters) (params CancelPredictionJobParams) {
{
key := middleware.ParameterKey{
Name: "id",
In: "path",
}
params.ID = packed[key].(string)
}
return params
}
func decodeCancelPredictionJobParams(args [1]string, argsEscaped bool, r *http.Request) (params CancelPredictionJobParams, _ error) {
// Decode path: id.
if err := func() error {
param := args[0]
if argsEscaped {
unescaped, err := url.PathUnescape(args[0])
if err != nil {
return errors.Wrap(err, "unescape path")
}
param = unescaped
}
if len(param) > 0 {
d := uri.NewPathDecoder(uri.PathDecoderConfig{
Param: "id",
Value: param,
Style: uri.PathStyleSimple,
Explode: false,
})
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToString(val)
if err != nil {
return err
}
params.ID = c
return nil
}(); err != nil {
return err
}
} else {
return validate.ErrFieldRequired
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "id",
In: "path",
Err: err,
}
}
return params, nil
}
// DeleteDatasetParams is parameters of deleteDataset operation.
type DeleteDatasetParams struct {
Name string
}
func unpackDeleteDatasetParams(packed middleware.Parameters) (params DeleteDatasetParams) {
{
key := middleware.ParameterKey{
Name: "name",
In: "path",
}
params.Name = packed[key].(string)
}
return params
}
func decodeDeleteDatasetParams(args [1]string, argsEscaped bool, r *http.Request) (params DeleteDatasetParams, _ error) {
// Decode path: name.
if err := func() error {
param := args[0]
if argsEscaped {
unescaped, err := url.PathUnescape(args[0])
if err != nil {
return errors.Wrap(err, "unescape path")
}
param = unescaped
}
if len(param) > 0 {
d := uri.NewPathDecoder(uri.PathDecoderConfig{
Param: "name",
Value: param,
Style: uri.PathStyleSimple,
Explode: false,
})
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToString(val)
if err != nil {
return err
}
params.Name = c
return nil
}(); err != nil {
return err
}
} else {
return validate.ErrFieldRequired
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "name",
In: "path",
Err: err,
}
}
return params, nil
}
// GetDatasetJobParams is parameters of getDatasetJob operation.
type GetDatasetJobParams struct {
ID string
}
func unpackGetDatasetJobParams(packed middleware.Parameters) (params GetDatasetJobParams) {
{
key := middleware.ParameterKey{
Name: "id",
In: "path",
}
params.ID = packed[key].(string)
}
return params
}
func decodeGetDatasetJobParams(args [1]string, argsEscaped bool, r *http.Request) (params GetDatasetJobParams, _ error) {
// Decode path: id.
if err := func() error {
param := args[0]
if argsEscaped {
unescaped, err := url.PathUnescape(args[0])
if err != nil {
return errors.Wrap(err, "unescape path")
}
param = unescaped
}
if len(param) > 0 {
d := uri.NewPathDecoder(uri.PathDecoderConfig{
Param: "id",
Value: param,
Style: uri.PathStyleSimple,
Explode: false,
})
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToString(val)
if err != nil {
return err
}
params.ID = c
return nil
}(); err != nil {
return err
}
} else {
return validate.ErrFieldRequired
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "id",
In: "path",
Err: err,
}
}
return params, nil
}
// GetPredictionJobParams is parameters of getPredictionJob operation.
type GetPredictionJobParams struct {
ID string
}
func unpackGetPredictionJobParams(packed middleware.Parameters) (params GetPredictionJobParams) {
{
key := middleware.ParameterKey{
Name: "id",
In: "path",
}
params.ID = packed[key].(string)
}
return params
}
func decodeGetPredictionJobParams(args [1]string, argsEscaped bool, r *http.Request) (params GetPredictionJobParams, _ error) {
// Decode path: id.
if err := func() error {
param := args[0]
if argsEscaped {
unescaped, err := url.PathUnescape(args[0])
if err != nil {
return errors.Wrap(err, "unescape path")
}
param = unescaped
}
if len(param) > 0 {
d := uri.NewPathDecoder(uri.PathDecoderConfig{
Param: "id",
Value: param,
Style: uri.PathStyleSimple,
Explode: false,
})
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToString(val)
if err != nil {
return err
}
params.ID = c
return nil
}(); err != nil {
return err
}
} else {
return validate.ErrFieldRequired
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "id",
In: "path",
Err: err,
}
}
return params, nil
}
// GetWindFieldParams is parameters of getWindField operation.
type GetWindFieldParams struct {
Time OptDateTime `json:",omitempty,omitzero"`
Altitude OptFloat64 `json:",omitempty,omitzero"`
MinLat OptFloat64 `json:",omitempty,omitzero"`
MaxLat OptFloat64 `json:",omitempty,omitzero"`
MinLng OptFloat64 `json:",omitempty,omitzero"`
MaxLng OptFloat64 `json:",omitempty,omitzero"`
Step OptFloat64 `json:",omitempty,omitzero"`
}
func unpackGetWindFieldParams(packed middleware.Parameters) (params GetWindFieldParams) {
{
key := middleware.ParameterKey{
Name: "time",
In: "query",
}
if v, ok := packed[key]; ok {
params.Time = v.(OptDateTime)
}
}
{
key := middleware.ParameterKey{
Name: "altitude",
In: "query",
}
if v, ok := packed[key]; ok {
params.Altitude = v.(OptFloat64)
}
}
{
key := middleware.ParameterKey{
Name: "min_lat",
In: "query",
}
if v, ok := packed[key]; ok {
params.MinLat = v.(OptFloat64)
}
}
{
key := middleware.ParameterKey{
Name: "max_lat",
In: "query",
}
if v, ok := packed[key]; ok {
params.MaxLat = v.(OptFloat64)
}
}
{
key := middleware.ParameterKey{
Name: "min_lng",
In: "query",
}
if v, ok := packed[key]; ok {
params.MinLng = v.(OptFloat64)
}
}
{
key := middleware.ParameterKey{
Name: "max_lng",
In: "query",
}
if v, ok := packed[key]; ok {
params.MaxLng = v.(OptFloat64)
}
}
{
key := middleware.ParameterKey{
Name: "step",
In: "query",
}
if v, ok := packed[key]; ok {
params.Step = v.(OptFloat64)
}
}
return params
}
func decodeGetWindFieldParams(args [0]string, argsEscaped bool, r *http.Request) (params GetWindFieldParams, _ error) {
q := uri.NewQueryDecoder(r.URL.Query())
// Decode query: time.
if err := func() error {
cfg := uri.QueryParameterDecodingConfig{
Name: "time",
Style: uri.QueryStyleForm,
Explode: true,
}
if err := q.HasParam(cfg); err == nil {
if err := q.DecodeParam(cfg, func(d uri.Decoder) error {
var paramsDotTimeVal time.Time
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToDateTime(val)
if err != nil {
return err
}
paramsDotTimeVal = c
return nil
}(); err != nil {
return err
}
params.Time.SetTo(paramsDotTimeVal)
return nil
}); err != nil {
return err
}
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "time",
In: "query",
Err: err,
}
}
// Decode query: altitude.
if err := func() error {
cfg := uri.QueryParameterDecodingConfig{
Name: "altitude",
Style: uri.QueryStyleForm,
Explode: true,
}
if err := q.HasParam(cfg); err == nil {
if err := q.DecodeParam(cfg, func(d uri.Decoder) error {
var paramsDotAltitudeVal float64
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToFloat64(val)
if err != nil {
return err
}
paramsDotAltitudeVal = c
return nil
}(); err != nil {
return err
}
params.Altitude.SetTo(paramsDotAltitudeVal)
return nil
}); err != nil {
return err
}
if err := func() error {
if value, ok := params.Altitude.Get(); ok {
if err := func() error {
if err := (validate.Float{}).Validate(float64(value)); err != nil {
return errors.Wrap(err, "float")
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "altitude",
In: "query",
Err: err,
}
}
// Decode query: min_lat.
if err := func() error {
cfg := uri.QueryParameterDecodingConfig{
Name: "min_lat",
Style: uri.QueryStyleForm,
Explode: true,
}
if err := q.HasParam(cfg); err == nil {
if err := q.DecodeParam(cfg, func(d uri.Decoder) error {
var paramsDotMinLatVal float64
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToFloat64(val)
if err != nil {
return err
}
paramsDotMinLatVal = c
return nil
}(); err != nil {
return err
}
params.MinLat.SetTo(paramsDotMinLatVal)
return nil
}); err != nil {
return err
}
if err := func() error {
if value, ok := params.MinLat.Get(); ok {
if err := func() error {
if err := (validate.Float{}).Validate(float64(value)); err != nil {
return errors.Wrap(err, "float")
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "min_lat",
In: "query",
Err: err,
}
}
// Decode query: max_lat.
if err := func() error {
cfg := uri.QueryParameterDecodingConfig{
Name: "max_lat",
Style: uri.QueryStyleForm,
Explode: true,
}
if err := q.HasParam(cfg); err == nil {
if err := q.DecodeParam(cfg, func(d uri.Decoder) error {
var paramsDotMaxLatVal float64
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToFloat64(val)
if err != nil {
return err
}
paramsDotMaxLatVal = c
return nil
}(); err != nil {
return err
}
params.MaxLat.SetTo(paramsDotMaxLatVal)
return nil
}); err != nil {
return err
}
if err := func() error {
if value, ok := params.MaxLat.Get(); ok {
if err := func() error {
if err := (validate.Float{}).Validate(float64(value)); err != nil {
return errors.Wrap(err, "float")
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "max_lat",
In: "query",
Err: err,
}
}
// Decode query: min_lng.
if err := func() error {
cfg := uri.QueryParameterDecodingConfig{
Name: "min_lng",
Style: uri.QueryStyleForm,
Explode: true,
}
if err := q.HasParam(cfg); err == nil {
if err := q.DecodeParam(cfg, func(d uri.Decoder) error {
var paramsDotMinLngVal float64
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToFloat64(val)
if err != nil {
return err
}
paramsDotMinLngVal = c
return nil
}(); err != nil {
return err
}
params.MinLng.SetTo(paramsDotMinLngVal)
return nil
}); err != nil {
return err
}
if err := func() error {
if value, ok := params.MinLng.Get(); ok {
if err := func() error {
if err := (validate.Float{}).Validate(float64(value)); err != nil {
return errors.Wrap(err, "float")
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "min_lng",
In: "query",
Err: err,
}
}
// Decode query: max_lng.
if err := func() error {
cfg := uri.QueryParameterDecodingConfig{
Name: "max_lng",
Style: uri.QueryStyleForm,
Explode: true,
}
if err := q.HasParam(cfg); err == nil {
if err := q.DecodeParam(cfg, func(d uri.Decoder) error {
var paramsDotMaxLngVal float64
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToFloat64(val)
if err != nil {
return err
}
paramsDotMaxLngVal = c
return nil
}(); err != nil {
return err
}
params.MaxLng.SetTo(paramsDotMaxLngVal)
return nil
}); err != nil {
return err
}
if err := func() error {
if value, ok := params.MaxLng.Get(); ok {
if err := func() error {
if err := (validate.Float{}).Validate(float64(value)); err != nil {
return errors.Wrap(err, "float")
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "max_lng",
In: "query",
Err: err,
}
}
// Decode query: step.
if err := func() error {
cfg := uri.QueryParameterDecodingConfig{
Name: "step",
Style: uri.QueryStyleForm,
Explode: true,
}
if err := q.HasParam(cfg); err == nil {
if err := q.DecodeParam(cfg, func(d uri.Decoder) error {
var paramsDotStepVal float64
if err := func() error {
val, err := d.DecodeValue()
if err != nil {
return err
}
c, err := conv.ToFloat64(val)
if err != nil {
return err
}
paramsDotStepVal = c
return nil
}(); err != nil {
return err
}
params.Step.SetTo(paramsDotStepVal)
return nil
}); err != nil {
return err
}
if err := func() error {
if value, ok := params.Step.Get(); ok {
if err := func() error {
if err := (validate.Float{}).Validate(float64(value)); err != nil {
return errors.Wrap(err, "float")
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return err
}
}
return nil
}(); err != nil {
return params, &ogenerrors.DecodeParamError{
Name: "step",
In: "query",
Err: err,
}
}
return params, nil
}
// PerformPredictionParams is parameters of performPrediction operation.
type PerformPredictionParams struct {
LaunchLatitude float64

View file

@ -1,3 +1,252 @@
// Code generated by ogen, DO NOT EDIT.
package rest
import (
"bytes"
"io"
"mime"
"net/http"
"github.com/go-faster/errors"
"github.com/go-faster/jx"
"github.com/ogen-go/ogen/ogenerrors"
"github.com/ogen-go/ogen/validate"
)
func (s *Server) decodeCreatePredictionJobRequest(r *http.Request) (
req *PredictionV2Request,
rawBody []byte,
close func() error,
rerr error,
) {
var closers []func() error
close = func() error {
var merr error
// Close in reverse order, to match defer behavior.
for i := len(closers) - 1; i >= 0; i-- {
c := closers[i]
merr = errors.Join(merr, c())
}
return merr
}
defer func() {
if rerr != nil {
rerr = errors.Join(rerr, close())
}
}()
ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type"))
if err != nil {
return req, rawBody, close, errors.Wrap(err, "parse media type")
}
switch {
case ct == "application/json":
if r.ContentLength == 0 {
return req, rawBody, close, validate.ErrBodyRequired
}
buf, err := io.ReadAll(r.Body)
defer func() {
_ = r.Body.Close()
}()
if err != nil {
return req, rawBody, close, err
}
// Reset the body to allow for downstream reading.
r.Body = io.NopCloser(bytes.NewBuffer(buf))
if len(buf) == 0 {
return req, rawBody, close, validate.ErrBodyRequired
}
rawBody = append(rawBody, buf...)
d := jx.DecodeBytes(buf)
var request PredictionV2Request
if err := func() error {
if err := request.Decode(d); err != nil {
return err
}
if err := d.Skip(); err != io.EOF {
return errors.New("unexpected trailing data")
}
return nil
}(); err != nil {
err = &ogenerrors.DecodeBodyError{
ContentType: ct,
Body: buf,
Err: err,
}
return req, rawBody, close, err
}
if err := func() error {
if err := request.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return req, rawBody, close, errors.Wrap(err, "validate")
}
return &request, rawBody, close, nil
default:
return req, rawBody, close, validate.InvalidContentType(ct)
}
}
func (s *Server) decodePerformPredictionV2Request(r *http.Request) (
req *PredictionV2Request,
rawBody []byte,
close func() error,
rerr error,
) {
var closers []func() error
close = func() error {
var merr error
// Close in reverse order, to match defer behavior.
for i := len(closers) - 1; i >= 0; i-- {
c := closers[i]
merr = errors.Join(merr, c())
}
return merr
}
defer func() {
if rerr != nil {
rerr = errors.Join(rerr, close())
}
}()
ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type"))
if err != nil {
return req, rawBody, close, errors.Wrap(err, "parse media type")
}
switch {
case ct == "application/json":
if r.ContentLength == 0 {
return req, rawBody, close, validate.ErrBodyRequired
}
buf, err := io.ReadAll(r.Body)
defer func() {
_ = r.Body.Close()
}()
if err != nil {
return req, rawBody, close, err
}
// Reset the body to allow for downstream reading.
r.Body = io.NopCloser(bytes.NewBuffer(buf))
if len(buf) == 0 {
return req, rawBody, close, validate.ErrBodyRequired
}
rawBody = append(rawBody, buf...)
d := jx.DecodeBytes(buf)
var request PredictionV2Request
if err := func() error {
if err := request.Decode(d); err != nil {
return err
}
if err := d.Skip(); err != io.EOF {
return errors.New("unexpected trailing data")
}
return nil
}(); err != nil {
err = &ogenerrors.DecodeBodyError{
ContentType: ct,
Body: buf,
Err: err,
}
return req, rawBody, close, err
}
if err := func() error {
if err := request.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return req, rawBody, close, errors.Wrap(err, "validate")
}
return &request, rawBody, close, nil
default:
return req, rawBody, close, validate.InvalidContentType(ct)
}
}
func (s *Server) decodeTriggerDatasetDownloadRequest(r *http.Request) (
req *DownloadRequest,
rawBody []byte,
close func() error,
rerr error,
) {
var closers []func() error
close = func() error {
var merr error
// Close in reverse order, to match defer behavior.
for i := len(closers) - 1; i >= 0; i-- {
c := closers[i]
merr = errors.Join(merr, c())
}
return merr
}
defer func() {
if rerr != nil {
rerr = errors.Join(rerr, close())
}
}()
ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type"))
if err != nil {
return req, rawBody, close, errors.Wrap(err, "parse media type")
}
switch {
case ct == "application/json":
if r.ContentLength == 0 {
return req, rawBody, close, validate.ErrBodyRequired
}
buf, err := io.ReadAll(r.Body)
defer func() {
_ = r.Body.Close()
}()
if err != nil {
return req, rawBody, close, err
}
// Reset the body to allow for downstream reading.
r.Body = io.NopCloser(bytes.NewBuffer(buf))
if len(buf) == 0 {
return req, rawBody, close, validate.ErrBodyRequired
}
rawBody = append(rawBody, buf...)
d := jx.DecodeBytes(buf)
var request DownloadRequest
if err := func() error {
if err := request.Decode(d); err != nil {
return err
}
if err := d.Skip(); err != io.EOF {
return errors.New("unexpected trailing data")
}
return nil
}(); err != nil {
err = &ogenerrors.DecodeBodyError{
ContentType: ct,
Body: buf,
Err: err,
}
return req, rawBody, close, err
}
if err := func() error {
if err := request.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return req, rawBody, close, errors.Wrap(err, "validate")
}
return &request, rawBody, close, nil
default:
return req, rawBody, close, validate.InvalidContentType(ct)
}
}

View file

@ -1,3 +1,53 @@
// Code generated by ogen, DO NOT EDIT.
package rest
import (
"bytes"
"net/http"
"github.com/go-faster/jx"
ht "github.com/ogen-go/ogen/http"
)
func encodeCreatePredictionJobRequest(
req *PredictionV2Request,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodePerformPredictionV2Request(
req *PredictionV2Request,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}
func encodeTriggerDatasetDownloadRequest(
req *DownloadRequest,
r *http.Request,
) error {
const contentType = "application/json"
e := new(jx.Encoder)
{
req.Encode(e)
}
encoded := e.Bytes()
ht.SetBody(r, bytes.NewReader(encoded), contentType)
return nil
}

File diff suppressed because it is too large Load diff

View file

@ -12,6 +12,147 @@ import (
"go.opentelemetry.io/otel/trace"
)
func encodeCancelDatasetJobResponse(response *CancelDatasetJobNoContent, w http.ResponseWriter, span trace.Span) error {
w.WriteHeader(204)
span.SetStatus(codes.Ok, http.StatusText(204))
return nil
}
func encodeCancelPredictionJobResponse(response *CancelPredictionJobNoContent, w http.ResponseWriter, span trace.Span) error {
w.WriteHeader(204)
span.SetStatus(codes.Ok, http.StatusText(204))
return nil
}
func encodeCreatePredictionJobResponse(response *PredictionJob, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(202)
span.SetStatus(codes.Ok, http.StatusText(202))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeDeleteDatasetResponse(response *DeleteDatasetNoContent, w http.ResponseWriter, span trace.Span) error {
w.WriteHeader(204)
span.SetStatus(codes.Ok, http.StatusText(204))
return nil
}
func encodeGetDatasetJobResponse(response *DownloadJob, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeGetPredictionJobResponse(response *PredictionJob, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeGetServiceStatusResponse(response *StatusResponse, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeGetWindFieldResponse(response []WindComponent, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
e.ArrStart()
for _, elem := range response {
elem.Encode(e)
}
e.ArrEnd()
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeGetWindMetaResponse(response *WindMeta, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeListDatasetJobsResponse(response []DownloadJob, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
e.ArrStart()
for _, elem := range response {
elem.Encode(e)
}
e.ArrEnd()
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeListDatasetsResponse(response *DatasetList, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodePerformPredictionResponse(response *PredictionResponse, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
@ -26,6 +167,20 @@ func encodePerformPredictionResponse(response *PredictionResponse, w http.Respon
return nil
}
func encodePerformPredictionV2Response(response *PredictionV2Response, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
span.SetStatus(codes.Ok, http.StatusText(200))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeReadinessCheckResponse(response *ReadinessResponse, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(200)
@ -40,7 +195,21 @@ func encodeReadinessCheckResponse(response *ReadinessResponse, w http.ResponseWr
return nil
}
func encodeErrorResponse(response *ErrorStatusCode, w http.ResponseWriter, span trace.Span) error {
func encodeTriggerDatasetDownloadResponse(response *DownloadAccepted, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(202)
span.SetStatus(codes.Ok, http.StatusText(202))
e := new(jx.Encoder)
response.Encode(e)
if _, err := e.WriteTo(w); err != nil {
return errors.Wrap(err, "write")
}
return nil
}
func encodeErrorResponse(response *DefaultErrorStatusCode, w http.ResponseWriter, span trace.Span) error {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
code := response.StatusCode
if code == 0 {

View file

@ -10,6 +10,18 @@ import (
"github.com/ogen-go/ogen/uri"
)
var (
rn15AllowedHeaders = map[string]string{
"POST": "Content-Type",
}
rn6AllowedHeaders = map[string]string{
"POST": "Content-Type",
}
rn18AllowedHeaders = map[string]string{
"POST": "Content-Type",
}
)
func (s *Server) cutPrefix(path string) (string, bool) {
prefix := s.cfg.Prefix
if prefix == "" {
@ -40,6 +52,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.notFound(w, r)
return
}
args := [1]string{}
// Static code generated router with unwrapped path search.
switch {
@ -60,29 +73,382 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
break
}
switch elem[0] {
case 'a': // Prefix: "api/v1/prediction"
case 'a': // Prefix: "api/v"
if l := len("api/v1/prediction"); len(elem) >= l && elem[0:l] == "api/v1/prediction" {
if l := len("api/v"); len(elem) >= l && elem[0:l] == "api/v" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "GET":
s.handlePerformPredictionRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
break
}
switch elem[0] {
case '1': // Prefix: "1/"
if l := len("1/"); len(elem) >= l && elem[0:l] == "1/" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
break
}
switch elem[0] {
case 'a': // Prefix: "admin/"
if l := len("admin/"); len(elem) >= l && elem[0:l] == "admin/" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
break
}
switch elem[0] {
case 'd': // Prefix: "datasets"
if l := len("datasets"); len(elem) >= l && elem[0:l] == "datasets" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch r.Method {
case "GET":
s.handleListDatasetsRequest([0]string{}, elemIsEscaped, w, r)
case "POST":
s.handleTriggerDatasetDownloadRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "GET,POST",
allowedHeaders: rn15AllowedHeaders,
acceptPost: "application/json",
acceptPatch: "",
})
}
return
}
switch elem[0] {
case '/': // Prefix: "/"
if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
elem = elem[l:]
} else {
break
}
// Param: "name"
// Leaf parameter, slashes are prohibited
idx := strings.IndexByte(elem, '/')
if idx >= 0 {
break
}
args[0] = elem
elem = ""
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "DELETE":
s.handleDeleteDatasetRequest([1]string{
args[0],
}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "DELETE",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
}
case 'j': // Prefix: "jobs"
if l := len("jobs"); len(elem) >= l && elem[0:l] == "jobs" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch r.Method {
case "GET":
s.handleListDatasetJobsRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
switch elem[0] {
case '/': // Prefix: "/"
if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
elem = elem[l:]
} else {
break
}
// Param: "id"
// Leaf parameter, slashes are prohibited
idx := strings.IndexByte(elem, '/')
if idx >= 0 {
break
}
args[0] = elem
elem = ""
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "DELETE":
s.handleCancelDatasetJobRequest([1]string{
args[0],
}, elemIsEscaped, w, r)
case "GET":
s.handleGetDatasetJobRequest([1]string{
args[0],
}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "DELETE,GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
}
case 's': // Prefix: "status"
if l := len("status"); len(elem) >= l && elem[0:l] == "status" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "GET":
s.handleGetServiceStatusRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
}
case 'p': // Prefix: "prediction"
if l := len("prediction"); len(elem) >= l && elem[0:l] == "prediction" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch r.Method {
case "GET":
s.handlePerformPredictionRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
switch elem[0] {
case 's': // Prefix: "s"
if l := len("s"); len(elem) >= l && elem[0:l] == "s" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch r.Method {
case "POST":
s.handleCreatePredictionJobRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "POST",
allowedHeaders: rn6AllowedHeaders,
acceptPost: "application/json",
acceptPatch: "",
})
}
return
}
switch elem[0] {
case '/': // Prefix: "/"
if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
elem = elem[l:]
} else {
break
}
// Param: "id"
// Leaf parameter, slashes are prohibited
idx := strings.IndexByte(elem, '/')
if idx >= 0 {
break
}
args[0] = elem
elem = ""
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "DELETE":
s.handleCancelPredictionJobRequest([1]string{
args[0],
}, elemIsEscaped, w, r)
case "GET":
s.handleGetPredictionJobRequest([1]string{
args[0],
}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "DELETE,GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
}
}
case 'w': // Prefix: "wind/"
if l := len("wind/"); len(elem) >= l && elem[0:l] == "wind/" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
break
}
switch elem[0] {
case 'f': // Prefix: "field"
if l := len("field"); len(elem) >= l && elem[0:l] == "field" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "GET":
s.handleGetWindFieldRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
case 'm': // Prefix: "meta"
if l := len("meta"); len(elem) >= l && elem[0:l] == "meta" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "GET":
s.handleGetWindMetaRequest([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "GET",
allowedHeaders: nil,
acceptPost: "",
acceptPatch: "",
})
}
return
}
}
}
case '2': // Prefix: "2/prediction"
if l := len("2/prediction"); len(elem) >= l && elem[0:l] == "2/prediction" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch r.Method {
case "POST":
s.handlePerformPredictionV2Request([0]string{}, elemIsEscaped, w, r)
default:
s.notAllowed(w, r, notAllowedParams{
allowedMethods: "POST",
allowedHeaders: rn18AllowedHeaders,
acceptPost: "application/json",
acceptPatch: "",
})
}
return
}
return
}
case 'r': // Prefix: "ready"
@ -125,7 +491,7 @@ type Route struct {
operationGroup string
pathPattern string
count int
args [0]string
args [1]string
}
// Name returns ogen operation name.
@ -210,29 +576,393 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) {
break
}
switch elem[0] {
case 'a': // Prefix: "api/v1/prediction"
case 'a': // Prefix: "api/v"
if l := len("api/v1/prediction"); len(elem) >= l && elem[0:l] == "api/v1/prediction" {
if l := len("api/v"); len(elem) >= l && elem[0:l] == "api/v" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch method {
case "GET":
r.name = PerformPredictionOperation
r.summary = "Perform prediction"
r.operationID = "performPrediction"
r.operationGroup = ""
r.pathPattern = "/api/v1/prediction"
r.args = args
r.count = 0
return r, true
default:
return
break
}
switch elem[0] {
case '1': // Prefix: "1/"
if l := len("1/"); len(elem) >= l && elem[0:l] == "1/" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
break
}
switch elem[0] {
case 'a': // Prefix: "admin/"
if l := len("admin/"); len(elem) >= l && elem[0:l] == "admin/" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
break
}
switch elem[0] {
case 'd': // Prefix: "datasets"
if l := len("datasets"); len(elem) >= l && elem[0:l] == "datasets" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch method {
case "GET":
r.name = ListDatasetsOperation
r.summary = "List stored datasets"
r.operationID = "listDatasets"
r.operationGroup = ""
r.pathPattern = "/api/v1/admin/datasets"
r.args = args
r.count = 0
return r, true
case "POST":
r.name = TriggerDatasetDownloadOperation
r.summary = "Trigger a dataset download"
r.operationID = "triggerDatasetDownload"
r.operationGroup = ""
r.pathPattern = "/api/v1/admin/datasets"
r.args = args
r.count = 0
return r, true
default:
return
}
}
switch elem[0] {
case '/': // Prefix: "/"
if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
elem = elem[l:]
} else {
break
}
// Param: "name"
// Leaf parameter, slashes are prohibited
idx := strings.IndexByte(elem, '/')
if idx >= 0 {
break
}
args[0] = elem
elem = ""
if len(elem) == 0 {
// Leaf node.
switch method {
case "DELETE":
r.name = DeleteDatasetOperation
r.summary = "Delete a stored dataset by filename"
r.operationID = "deleteDataset"
r.operationGroup = ""
r.pathPattern = "/api/v1/admin/datasets/{name}"
r.args = args
r.count = 1
return r, true
default:
return
}
}
}
case 'j': // Prefix: "jobs"
if l := len("jobs"); len(elem) >= l && elem[0:l] == "jobs" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch method {
case "GET":
r.name = ListDatasetJobsOperation
r.summary = "List dataset download jobs"
r.operationID = "listDatasetJobs"
r.operationGroup = ""
r.pathPattern = "/api/v1/admin/jobs"
r.args = args
r.count = 0
return r, true
default:
return
}
}
switch elem[0] {
case '/': // Prefix: "/"
if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
elem = elem[l:]
} else {
break
}
// Param: "id"
// Leaf parameter, slashes are prohibited
idx := strings.IndexByte(elem, '/')
if idx >= 0 {
break
}
args[0] = elem
elem = ""
if len(elem) == 0 {
// Leaf node.
switch method {
case "DELETE":
r.name = CancelDatasetJobOperation
r.summary = "Cancel a running download job"
r.operationID = "cancelDatasetJob"
r.operationGroup = ""
r.pathPattern = "/api/v1/admin/jobs/{id}"
r.args = args
r.count = 1
return r, true
case "GET":
r.name = GetDatasetJobOperation
r.summary = "Get a dataset download job"
r.operationID = "getDatasetJob"
r.operationGroup = ""
r.pathPattern = "/api/v1/admin/jobs/{id}"
r.args = args
r.count = 1
return r, true
default:
return
}
}
}
case 's': // Prefix: "status"
if l := len("status"); len(elem) >= l && elem[0:l] == "status" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch method {
case "GET":
r.name = GetServiceStatusOperation
r.summary = "Service status summary"
r.operationID = "getServiceStatus"
r.operationGroup = ""
r.pathPattern = "/api/v1/admin/status"
r.args = args
r.count = 0
return r, true
default:
return
}
}
}
case 'p': // Prefix: "prediction"
if l := len("prediction"); len(elem) >= l && elem[0:l] == "prediction" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch method {
case "GET":
r.name = PerformPredictionOperation
r.summary = "Tawhiri-compatible prediction"
r.operationID = "performPrediction"
r.operationGroup = ""
r.pathPattern = "/api/v1/prediction"
r.args = args
r.count = 0
return r, true
default:
return
}
}
switch elem[0] {
case 's': // Prefix: "s"
if l := len("s"); len(elem) >= l && elem[0:l] == "s" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
switch method {
case "POST":
r.name = CreatePredictionJobOperation
r.summary = "Enqueue an asynchronous prediction"
r.operationID = "createPredictionJob"
r.operationGroup = ""
r.pathPattern = "/api/v1/predictions"
r.args = args
r.count = 0
return r, true
default:
return
}
}
switch elem[0] {
case '/': // Prefix: "/"
if l := len("/"); len(elem) >= l && elem[0:l] == "/" {
elem = elem[l:]
} else {
break
}
// Param: "id"
// Leaf parameter, slashes are prohibited
idx := strings.IndexByte(elem, '/')
if idx >= 0 {
break
}
args[0] = elem
elem = ""
if len(elem) == 0 {
// Leaf node.
switch method {
case "DELETE":
r.name = CancelPredictionJobOperation
r.summary = "Cancel a queued prediction job"
r.operationID = "cancelPredictionJob"
r.operationGroup = ""
r.pathPattern = "/api/v1/predictions/{id}"
r.args = args
r.count = 1
return r, true
case "GET":
r.name = GetPredictionJobOperation
r.summary = "Poll an asynchronous prediction job"
r.operationID = "getPredictionJob"
r.operationGroup = ""
r.pathPattern = "/api/v1/predictions/{id}"
r.args = args
r.count = 1
return r, true
default:
return
}
}
}
}
case 'w': // Prefix: "wind/"
if l := len("wind/"); len(elem) >= l && elem[0:l] == "wind/" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
break
}
switch elem[0] {
case 'f': // Prefix: "field"
if l := len("field"); len(elem) >= l && elem[0:l] == "field" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch method {
case "GET":
r.name = GetWindFieldOperation
r.summary = "Wind-field velocity grid (leaflet-velocity / wind-layer format)"
r.operationID = "getWindField"
r.operationGroup = ""
r.pathPattern = "/api/v1/wind/field"
r.args = args
r.count = 0
return r, true
default:
return
}
}
case 'm': // Prefix: "meta"
if l := len("meta"); len(elem) >= l && elem[0:l] == "meta" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch method {
case "GET":
r.name = GetWindMetaOperation
r.summary = "Wind-field visualization metadata"
r.operationID = "getWindMeta"
r.operationGroup = ""
r.pathPattern = "/api/v1/wind/meta"
r.args = args
r.count = 0
return r, true
default:
return
}
}
}
}
case '2': // Prefix: "2/prediction"
if l := len("2/prediction"); len(elem) >= l && elem[0:l] == "2/prediction" {
elem = elem[l:]
} else {
break
}
if len(elem) == 0 {
// Leaf node.
switch method {
case "POST":
r.name = PerformPredictionV2Operation
r.summary = "Profile-driven prediction (synchronous)"
r.operationID = "performPredictionV2"
r.operationGroup = ""
r.pathPattern = "/api/v2/prediction"
r.args = args
r.count = 0
return r, true
default:
return
}
}
}
case 'r': // Prefix: "ready"

File diff suppressed because it is too large Load diff

View file

@ -8,22 +8,100 @@ import (
// Handler handles operations described by OpenAPI v3 specification.
type Handler interface {
// CancelDatasetJob implements cancelDatasetJob operation.
//
// Cancel a running download job.
//
// DELETE /api/v1/admin/jobs/{id}
CancelDatasetJob(ctx context.Context, params CancelDatasetJobParams) error
// CancelPredictionJob implements cancelPredictionJob operation.
//
// Cancel a queued prediction job.
//
// DELETE /api/v1/predictions/{id}
CancelPredictionJob(ctx context.Context, params CancelPredictionJobParams) error
// CreatePredictionJob implements createPredictionJob operation.
//
// Enqueue an asynchronous prediction.
//
// POST /api/v1/predictions
CreatePredictionJob(ctx context.Context, req *PredictionV2Request) (*PredictionJob, error)
// DeleteDataset implements deleteDataset operation.
//
// Delete a stored dataset by filename.
//
// DELETE /api/v1/admin/datasets/{name}
DeleteDataset(ctx context.Context, params DeleteDatasetParams) error
// GetDatasetJob implements getDatasetJob operation.
//
// Get a dataset download job.
//
// GET /api/v1/admin/jobs/{id}
GetDatasetJob(ctx context.Context, params GetDatasetJobParams) (*DownloadJob, error)
// GetPredictionJob implements getPredictionJob operation.
//
// Poll an asynchronous prediction job.
//
// GET /api/v1/predictions/{id}
GetPredictionJob(ctx context.Context, params GetPredictionJobParams) (*PredictionJob, error)
// GetServiceStatus implements getServiceStatus operation.
//
// Service status summary.
//
// GET /api/v1/admin/status
GetServiceStatus(ctx context.Context) (*StatusResponse, error)
// GetWindField implements getWindField operation.
//
// Wind-field velocity grid (leaflet-velocity / wind-layer format).
//
// GET /api/v1/wind/field
GetWindField(ctx context.Context, params GetWindFieldParams) ([]WindComponent, error)
// GetWindMeta implements getWindMeta operation.
//
// Wind-field visualization metadata.
//
// GET /api/v1/wind/meta
GetWindMeta(ctx context.Context) (*WindMeta, error)
// ListDatasetJobs implements listDatasetJobs operation.
//
// List dataset download jobs.
//
// GET /api/v1/admin/jobs
ListDatasetJobs(ctx context.Context) ([]DownloadJob, error)
// ListDatasets implements listDatasets operation.
//
// List stored datasets.
//
// GET /api/v1/admin/datasets
ListDatasets(ctx context.Context) (*DatasetList, error)
// PerformPrediction implements performPrediction operation.
//
// Perform prediction.
// Tawhiri-compatible prediction.
//
// GET /api/v1/prediction
PerformPrediction(ctx context.Context, params PerformPredictionParams) (*PredictionResponse, error)
// PerformPredictionV2 implements performPredictionV2 operation.
//
// Profile-driven prediction (synchronous).
//
// POST /api/v2/prediction
PerformPredictionV2(ctx context.Context, req *PredictionV2Request) (*PredictionV2Response, error)
// ReadinessCheck implements readinessCheck operation.
//
// Readiness check.
//
// GET /ready
ReadinessCheck(ctx context.Context) (*ReadinessResponse, error)
// NewError creates *ErrorStatusCode from error returned by handler.
// TriggerDatasetDownload implements triggerDatasetDownload operation.
//
// Trigger a dataset download.
//
// POST /api/v1/admin/datasets
TriggerDatasetDownload(ctx context.Context, req *DownloadRequest) (*DownloadAccepted, error)
// NewError creates *DefaultErrorStatusCode from error returned by handler.
//
// Used for common default response.
NewError(ctx context.Context, err error) *ErrorStatusCode
NewError(ctx context.Context, err error) *DefaultErrorStatusCode
}
// Server implements http server based on OpenAPI v3 specification and

View file

@ -13,15 +13,123 @@ type UnimplementedHandler struct{}
var _ Handler = UnimplementedHandler{}
// CancelDatasetJob implements cancelDatasetJob operation.
//
// Cancel a running download job.
//
// DELETE /api/v1/admin/jobs/{id}
func (UnimplementedHandler) CancelDatasetJob(ctx context.Context, params CancelDatasetJobParams) error {
return ht.ErrNotImplemented
}
// CancelPredictionJob implements cancelPredictionJob operation.
//
// Cancel a queued prediction job.
//
// DELETE /api/v1/predictions/{id}
func (UnimplementedHandler) CancelPredictionJob(ctx context.Context, params CancelPredictionJobParams) error {
return ht.ErrNotImplemented
}
// CreatePredictionJob implements createPredictionJob operation.
//
// Enqueue an asynchronous prediction.
//
// POST /api/v1/predictions
func (UnimplementedHandler) CreatePredictionJob(ctx context.Context, req *PredictionV2Request) (r *PredictionJob, _ error) {
return r, ht.ErrNotImplemented
}
// DeleteDataset implements deleteDataset operation.
//
// Delete a stored dataset by filename.
//
// DELETE /api/v1/admin/datasets/{name}
func (UnimplementedHandler) DeleteDataset(ctx context.Context, params DeleteDatasetParams) error {
return ht.ErrNotImplemented
}
// GetDatasetJob implements getDatasetJob operation.
//
// Get a dataset download job.
//
// GET /api/v1/admin/jobs/{id}
func (UnimplementedHandler) GetDatasetJob(ctx context.Context, params GetDatasetJobParams) (r *DownloadJob, _ error) {
return r, ht.ErrNotImplemented
}
// GetPredictionJob implements getPredictionJob operation.
//
// Poll an asynchronous prediction job.
//
// GET /api/v1/predictions/{id}
func (UnimplementedHandler) GetPredictionJob(ctx context.Context, params GetPredictionJobParams) (r *PredictionJob, _ error) {
return r, ht.ErrNotImplemented
}
// GetServiceStatus implements getServiceStatus operation.
//
// Service status summary.
//
// GET /api/v1/admin/status
func (UnimplementedHandler) GetServiceStatus(ctx context.Context) (r *StatusResponse, _ error) {
return r, ht.ErrNotImplemented
}
// GetWindField implements getWindField operation.
//
// Wind-field velocity grid (leaflet-velocity / wind-layer format).
//
// GET /api/v1/wind/field
func (UnimplementedHandler) GetWindField(ctx context.Context, params GetWindFieldParams) (r []WindComponent, _ error) {
return r, ht.ErrNotImplemented
}
// GetWindMeta implements getWindMeta operation.
//
// Wind-field visualization metadata.
//
// GET /api/v1/wind/meta
func (UnimplementedHandler) GetWindMeta(ctx context.Context) (r *WindMeta, _ error) {
return r, ht.ErrNotImplemented
}
// ListDatasetJobs implements listDatasetJobs operation.
//
// List dataset download jobs.
//
// GET /api/v1/admin/jobs
func (UnimplementedHandler) ListDatasetJobs(ctx context.Context) (r []DownloadJob, _ error) {
return r, ht.ErrNotImplemented
}
// ListDatasets implements listDatasets operation.
//
// List stored datasets.
//
// GET /api/v1/admin/datasets
func (UnimplementedHandler) ListDatasets(ctx context.Context) (r *DatasetList, _ error) {
return r, ht.ErrNotImplemented
}
// PerformPrediction implements performPrediction operation.
//
// Perform prediction.
// Tawhiri-compatible prediction.
//
// GET /api/v1/prediction
func (UnimplementedHandler) PerformPrediction(ctx context.Context, params PerformPredictionParams) (r *PredictionResponse, _ error) {
return r, ht.ErrNotImplemented
}
// PerformPredictionV2 implements performPredictionV2 operation.
//
// Profile-driven prediction (synchronous).
//
// POST /api/v2/prediction
func (UnimplementedHandler) PerformPredictionV2(ctx context.Context, req *PredictionV2Request) (r *PredictionV2Response, _ error) {
return r, ht.ErrNotImplemented
}
// ReadinessCheck implements readinessCheck operation.
//
// Readiness check.
@ -31,10 +139,19 @@ func (UnimplementedHandler) ReadinessCheck(ctx context.Context) (r *ReadinessRes
return r, ht.ErrNotImplemented
}
// NewError creates *ErrorStatusCode from error returned by handler.
// TriggerDatasetDownload implements triggerDatasetDownload operation.
//
// Trigger a dataset download.
//
// POST /api/v1/admin/datasets
func (UnimplementedHandler) TriggerDatasetDownload(ctx context.Context, req *DownloadRequest) (r *DownloadAccepted, _ error) {
return r, ht.ErrNotImplemented
}
// NewError creates *DefaultErrorStatusCode from error returned by handler.
//
// Used for common default response.
func (UnimplementedHandler) NewError(ctx context.Context, err error) (r *ErrorStatusCode) {
r = new(ErrorStatusCode)
func (UnimplementedHandler) NewError(ctx context.Context, err error) (r *DefaultErrorStatusCode) {
r = new(DefaultErrorStatusCode)
return r
}

File diff suppressed because it is too large Load diff