// Code generated by ogen, DO NOT EDIT. package rest import ( "net/http" "net/url" "strings" "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 == "" { 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) { elem := r.URL.Path elemIsEscaped := false if rawPath := r.URL.RawPath; rawPath != "" { if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok { elem = normalized elemIsEscaped = strings.ContainsRune(elem, '%') } } elem, ok := s.cutPrefix(elem) if !ok || len(elem) == 0 { s.notFound(w, r) return } args := [1]string{} // Static code generated router with unwrapped path search. switch { default: if len(elem) == 0 { break } switch elem[0] { case '/': // Prefix: "/" if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { break } switch elem[0] { case 'a': // Prefix: "api/v" if l := len("api/v"); len(elem) >= l && elem[0:l] == "api/v" { elem = elem[l:] } else { break } if len(elem) == 0 { 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 } } case 'r': // Prefix: "ready" if l := len("ready"); len(elem) >= l && elem[0:l] == "ready" { elem = elem[l:] } else { break } if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": s.handleReadinessCheckRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", allowedHeaders: nil, acceptPost: "", acceptPatch: "", }) } return } } } } s.notFound(w, r) } // Route is route object. type Route struct { name string summary string operationID string operationGroup string pathPattern string count int args [1]string } // Name returns ogen operation name. // // It is guaranteed to be unique and not empty. 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 } // OperationGroup returns the x-ogen-operation-group value. func (r Route) OperationGroup() string { return r.operationGroup } // PathPattern returns OpenAPI path. func (r Route) PathPattern() string { return r.pathPattern } // Args returns parsed arguments. func (r Route) Args() []string { return r.args[:r.count] } // FindRoute finds Route for given method and path. // // Note: this method does not unescape path or handle reserved characters in path properly. Use FindPath instead. func (s *Server) FindRoute(method, path string) (Route, bool) { return s.FindPath(method, &url.URL{Path: path}) } // FindPath finds Route for given method and URL. func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { var ( elem = u.Path args = r.args ) if rawPath := u.RawPath; rawPath != "" { if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok { elem = normalized } defer func() { for i, arg := range r.args[:r.count] { if unescaped, err := url.PathUnescape(arg); err == nil { r.args[i] = unescaped } } }() } elem, ok := s.cutPrefix(elem) if !ok { return r, false } // Static code generated router with unwrapped path search. switch { default: if len(elem) == 0 { break } switch elem[0] { case '/': // Prefix: "/" if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { break } switch elem[0] { case 'a': // Prefix: "api/v" if l := len("api/v"); len(elem) >= l && elem[0:l] == "api/v" { elem = elem[l:] } else { break } if len(elem) == 0 { 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" if l := len("ready"); len(elem) >= l && elem[0:l] == "ready" { elem = elem[l:] } else { break } if len(elem) == 0 { // Leaf node. switch method { case "GET": r.name = ReadinessCheckOperation r.summary = "Readiness check" r.operationID = "readinessCheck" r.operationGroup = "" r.pathPattern = "/ready" r.args = args r.count = 0 return r, true default: return } } } } } return r, false }