Radix Tree implementation for Crystal
Radix tree implementation for
Crystal language
Add this to your application’s shard.yml
:
dependencies:
radix:
github: luislavena/radix
You can associate a payload with each path added to the tree:
require "radix"
tree = Radix::Tree(Symbol).new
tree.add "/products", :products
tree.add "/products/featured", :featured
result = tree.find "/products/featured"
if result.found?
puts result.payload # => :featured
end
The types allowed for payload are defined on Tree definition:
tree = Radix::Tree(Symbol).new
# Good, since Symbol is allowed as payload
tree.add "/", :root
# Compilation error, Int32 is not allowed
tree.add "/meaning-of-life", 42
Can combine multiple types if needed:
tree = Radix::Tree(Int32 | String | Symbol).new
tree.add "/", :root
tree.add "/meaning-of-life", 42
tree.add "/hello", "world"
You can also extract values from placeholders (as named segments or globbing):
tree.add "/products/:id", :product
result = tree.find "/products/1234"
if result.found?
puts result.params["id"]? # => "1234"
end
Please see Radix::Tree#add
documentation for more usage examples.
Pretty much all Radix implementations have their limitations and this project
is no exception.
When designing and adding paths to a Tree, please consider that two different
named parameters cannot share the same level:
tree.add "/", :root
tree.add "/:post", :post
tree.add "/:category/:post", :category_post # => Radix::Tree::SharedKeyError
This is because different named parameters at the same level will result in
incorrect params
when lookup is performed, and sometimes the value forpost
or category
parameters will not be stored as expected.
To avoid this issue, usage of explicit keys that differentiate each path is
recommended.
For example, following a good SEO practice will be consider /:post
as
absolute permalink for the post and have a list of categories which links to
the permalinks of the posts under that category:
tree.add "/", :root
tree.add "/:post", :post # this is post permalink
tree.add "/categories", :categories # list of categories
tree.add "/categories/:category", :category # listing of posts under each category
This project has been inspired and adapted from
julienschmidt/httprouter and
spriet2000/vertx-http-router
Go and Java implementations, respectively.
Changes to logic and optimizations have been made to take advantage of
Crystal’s features.
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)