module Orion::DSL::Constraints

Overview

Constraints can be used to further determine if a route is hit beyond just it's path. Routes have some predefined constraints you can specify, but you can also pass in a custom constraint.

Parameter constraints

When defining a route, you can pass in parameter constraints. The path params will be checked against the provided regex before the route is chosen as a valid route.

get "users/:id", constraints: { id: /[0-9]{4}/ }

Format constraints

You can constrain the request to a certain format. Such as restricting the extension of the URL to '.json'.

get "api/users/:id", format: "json"

Request Mime-Type constraints

You can constrain the request to a certain mime-type by using the content_type param on the route. This will ensure that if the request has a body, it will provide the proper content type.

put "api/users/:id", content_type: "application/json"

Response Mime-Type constraints

You can constrain the response to a certain mime-type by using the accept param on the route. This is similar to the format constraint but allows clients to specify the Accept header rather than the extension.

Orion will automatically add mime-type headers for requests with no Accept header and a specified extension.

get "api/users/:id", accept: "application/json"

Combined Mime-Type constraints

You can constrain the request and response to a certain mime-type by using the type param on the route. This will ensure that if the request has a body, it will provide the proper content type. In addition, it will also validate that the client provides a proper accept header for the response.

Orion will automatically add mime-type headers for requests with no Accept header and a specified extension.

put "api/users/:id", type: "application/json"

Host constraints

You can constrain the request to a specific host by wrapping routes in a host block. In this method, any routes within the block will be matched at that constraint.

You may also choose to limit the request to a certain format. Such as restricting the extension of the URL to '.json'.

host "example.com" do
  get "users/:id", format: "json"
end

Subdomain constraints

You can constrain the request to a specific subdomain by wrapping routes in a subdomain block. In this method, any routes within the block will be matched at that constraint.

You may also choose to limit the request to a certain format. Such as restricting the extension of the URL to '.json'.

subdomain "api" do
  get "users/:id", format: "json"
end

Custom Constraints

You can also pass in your own constraints by just passing a class/struct that implements the Orion::Constraint module.

struct MyConstraint
  def matches?(req : HTTP::Request)
    true
  end
end

constraint MyConstraint.new do
  get "users/:id", format: "json"
end

Defined in:

orion/dsl/constraints.cr

Macro Summary

Macro Detail

macro constraint(constraint) #

Constrain routes by an Orion::Constraint


[View source]
macro constraints(*constraints) #

Constrain routes by one or more Orion::Constraints


[View source]
macro host(host) #

Constrain routes by a given domain


[View source]
macro subdomain(subdomain) #

Constrain routes by a given subdomain


[View source]