// Code generated by ogen, DO NOT EDIT. package ogent import ( "net/http" "net/url" "strings" "github.com/ogen-go/ogen/uri" ) // 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 if rawPath := r.URL.RawPath; rawPath != "" { if normalized, ok := uri.NormalizeEscapedPath(rawPath); ok { elem = normalized } } 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 { 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 'c': // Prefix: "cards" if l := len("cards"); len(elem) >= l && elem[0:l] == "cards" { elem = elem[l:] } else { break } if len(elem) == 0 { switch r.Method { case "GET": s.handleListCardRequest([0]string{}, w, r) case "POST": s.handleCreateCardRequest([0]string{}, w, r) default: s.notAllowed(w, r, "GET,POST") } return } switch elem[0] { case '/': // Prefix: "/" if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } // Param: "id" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { idx = len(elem) } args[0] = elem[:idx] elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "DELETE": s.handleDeleteCardRequest([1]string{ args[0], }, w, r) case "GET": s.handleReadCardRequest([1]string{ args[0], }, w, r) case "PATCH": s.handleUpdateCardRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "DELETE,GET,PATCH") } return } 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 'd': // Prefix: "d" if l := len("d"); len(elem) >= l && elem[0:l] == "d" { elem = elem[l:] } else { break } if len(elem) == 0 { // Leaf node. switch r.Method { case "PUT": s.handleDrawDoneRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "PUT") } return } case 'o': // Prefix: "owner" if l := len("owner"); len(elem) >= l && elem[0:l] == "owner" { elem = elem[l:] } else { break } if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": s.handleReadCardOwnerRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "GET") } return } } } } case 'g': // Prefix: "groups" if l := len("groups"); len(elem) >= l && elem[0:l] == "groups" { elem = elem[l:] } else { break } if len(elem) == 0 { switch r.Method { case "GET": s.handleListGroupRequest([0]string{}, w, r) case "POST": s.handleCreateGroupRequest([0]string{}, w, r) default: s.notAllowed(w, r, "GET,POST") } return } switch elem[0] { case '/': // Prefix: "/" if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } // Param: "id" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { idx = len(elem) } args[0] = elem[:idx] elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "DELETE": s.handleDeleteGroupRequest([1]string{ args[0], }, w, r) case "GET": s.handleReadGroupRequest([1]string{ args[0], }, w, r) case "PATCH": s.handleUpdateGroupRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "DELETE,GET,PATCH") } return } switch elem[0] { case '/': // Prefix: "/users" if l := len("/users"); len(elem) >= l && elem[0:l] == "/users" { elem = elem[l:] } else { break } if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": s.handleListGroupUsersRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "GET") } return } } } case 'u': // Prefix: "users" if l := len("users"); len(elem) >= l && elem[0:l] == "users" { elem = elem[l:] } else { break } if len(elem) == 0 { switch r.Method { case "GET": s.handleListUserRequest([0]string{}, w, r) case "POST": s.handleCreateUserRequest([0]string{}, w, r) default: s.notAllowed(w, r, "GET,POST") } return } switch elem[0] { case '/': // Prefix: "/" if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } // Param: "id" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { idx = len(elem) } args[0] = elem[:idx] elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "DELETE": s.handleDeleteUserRequest([1]string{ args[0], }, w, r) case "GET": s.handleReadUserRequest([1]string{ args[0], }, w, r) case "PATCH": s.handleUpdateUserRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "DELETE,GET,PATCH") } return } switch elem[0] { case '/': // Prefix: "/card" if l := len("/card"); len(elem) >= l && elem[0:l] == "/card" { elem = elem[l:] } else { break } if len(elem) == 0 { switch r.Method { case "GET": s.handleListUserCardRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "GET") } return } switch elem[0] { case '/': // Prefix: "/start" if l := len("/start"); len(elem) >= l && elem[0:l] == "/start" { elem = elem[l:] } else { break } if len(elem) == 0 { // Leaf node. switch r.Method { case "PATCH": s.handleDrawStartRequest([1]string{ args[0], }, w, r) default: s.notAllowed(w, r, "PATCH") } return } } } } } } } s.notFound(w, r) } // Route is route object. type Route struct { name string operationID 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 } // OperationID returns OpenAPI operationId. func (r Route) OperationID() string { return r.operationID } // 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 } } }() } // 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 'c': // Prefix: "cards" if l := len("cards"); len(elem) >= l && elem[0:l] == "cards" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "GET": r.name = "ListCard" r.operationID = "listCard" r.pathPattern = "/cards" r.args = args r.count = 0 return r, true case "POST": r.name = "CreateCard" r.operationID = "createCard" r.pathPattern = "/cards" 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" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { idx = len(elem) } args[0] = elem[:idx] elem = elem[idx:] if len(elem) == 0 { switch method { case "DELETE": r.name = "DeleteCard" r.operationID = "deleteCard" r.pathPattern = "/cards/{id}" r.args = args r.count = 1 return r, true case "GET": r.name = "ReadCard" r.operationID = "readCard" r.pathPattern = "/cards/{id}" r.args = args r.count = 1 return r, true case "PATCH": r.name = "UpdateCard" r.operationID = "updateCard" r.pathPattern = "/cards/{id}" r.args = args r.count = 1 return r, true default: return } } 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 'd': // Prefix: "d" if l := len("d"); len(elem) >= l && elem[0:l] == "d" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "PUT": // Leaf: DrawDone r.name = "DrawDone" r.operationID = "drawDone" r.pathPattern = "/cards/{id}/d" r.args = args r.count = 1 return r, true default: return } } case 'o': // Prefix: "owner" if l := len("owner"); len(elem) >= l && elem[0:l] == "owner" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "GET": // Leaf: ReadCardOwner r.name = "ReadCardOwner" r.operationID = "readCardOwner" r.pathPattern = "/cards/{id}/owner" r.args = args r.count = 1 return r, true default: return } } } } } case 'g': // Prefix: "groups" if l := len("groups"); len(elem) >= l && elem[0:l] == "groups" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "GET": r.name = "ListGroup" r.operationID = "listGroup" r.pathPattern = "/groups" r.args = args r.count = 0 return r, true case "POST": r.name = "CreateGroup" r.operationID = "createGroup" r.pathPattern = "/groups" 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" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { idx = len(elem) } args[0] = elem[:idx] elem = elem[idx:] if len(elem) == 0 { switch method { case "DELETE": r.name = "DeleteGroup" r.operationID = "deleteGroup" r.pathPattern = "/groups/{id}" r.args = args r.count = 1 return r, true case "GET": r.name = "ReadGroup" r.operationID = "readGroup" r.pathPattern = "/groups/{id}" r.args = args r.count = 1 return r, true case "PATCH": r.name = "UpdateGroup" r.operationID = "updateGroup" r.pathPattern = "/groups/{id}" r.args = args r.count = 1 return r, true default: return } } switch elem[0] { case '/': // Prefix: "/users" if l := len("/users"); len(elem) >= l && elem[0:l] == "/users" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "GET": // Leaf: ListGroupUsers r.name = "ListGroupUsers" r.operationID = "listGroupUsers" r.pathPattern = "/groups/{id}/users" r.args = args r.count = 1 return r, true default: return } } } } case 'u': // Prefix: "users" if l := len("users"); len(elem) >= l && elem[0:l] == "users" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "GET": r.name = "ListUser" r.operationID = "listUser" r.pathPattern = "/users" r.args = args r.count = 0 return r, true case "POST": r.name = "CreateUser" r.operationID = "createUser" r.pathPattern = "/users" 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" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { idx = len(elem) } args[0] = elem[:idx] elem = elem[idx:] if len(elem) == 0 { switch method { case "DELETE": r.name = "DeleteUser" r.operationID = "deleteUser" r.pathPattern = "/users/{id}" r.args = args r.count = 1 return r, true case "GET": r.name = "ReadUser" r.operationID = "readUser" r.pathPattern = "/users/{id}" r.args = args r.count = 1 return r, true case "PATCH": r.name = "UpdateUser" r.operationID = "updateUser" r.pathPattern = "/users/{id}" r.args = args r.count = 1 return r, true default: return } } switch elem[0] { case '/': // Prefix: "/card" if l := len("/card"); len(elem) >= l && elem[0:l] == "/card" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "GET": r.name = "ListUserCard" r.operationID = "listUserCard" r.pathPattern = "/users/{id}/card" r.args = args r.count = 1 return r, true default: return } } switch elem[0] { case '/': // Prefix: "/start" if l := len("/start"); len(elem) >= l && elem[0:l] == "/start" { elem = elem[l:] } else { break } if len(elem) == 0 { switch method { case "PATCH": // Leaf: DrawStart r.name = "DrawStart" r.operationID = "drawStart" r.pathPattern = "/users/{id}/card/start" r.args = args r.count = 1 return r, true default: return } } } } } } } } return r, false }