# Kemal DSL is defined here and it's baked into global scope. # # The DSL currently consists of: # # - get post put patch delete options # - WebSocket(ws) # - before_* # - error HTTP_METHODS = %w(get post put patch delete options head) FILTER_METHODS = %w(get post put patch delete options head all) {% for method in HTTP_METHODS %} def {{method.id}}(path : String, &block : HTTP::Server::Context -> _) raise Kemal::Exceptions::InvalidPathStartException.new({{method}}, path) unless Kemal::Utils.path_starts_with_slash?(path) Kemal::RouteHandler::INSTANCE.add_route({{method}}.upcase, path, &block) end {% end %} def ws(path : String, &block : HTTP::WebSocket, HTTP::Server::Context -> Void) raise Kemal::Exceptions::InvalidPathStartException.new("ws", path) unless Kemal::Utils.path_starts_with_slash?(path) Kemal::WebSocketHandler::INSTANCE.add_route path, &block end def error(status_code : Int32, &block : HTTP::Server::Context, Exception -> _) Kemal.config.add_error_handler status_code, &block end # All the helper methods available are: # - before_all, before_get, before_post, before_put, before_patch, before_delete, before_options # - after_all, after_get, after_post, after_put, after_patch, after_delete, after_options {% for type in ["before", "after"] %} {% for method in FILTER_METHODS %} def {{type.id}}_{{method.id}}(path : String = "*", &block : HTTP::Server::Context -> _) Kemal::FilterHandler::INSTANCE.{{type.id}}({{method}}.upcase, path, &block) end def {{type.id}}_{{method.id}}(paths : Array(String), &block : HTTP::Server::Context -> _) paths.each do |path| Kemal::FilterHandler::INSTANCE.{{type.id}}({{method}}.upcase, path, &block) end end {% end %} {% end %}