Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. # nancy.rb
  2. require "rack"
  3.  
  4. module Nancy
  5. class Base
  6. def initialize
  7. @routes = {}
  8. end
  9.  
  10. attr_reader :routes
  11.  
  12. def get(path, &handler)
  13. route("GET", path, &handler)
  14. end
  15.  
  16. def post(path, &handler)
  17. route("POST", path, &handler)
  18. end
  19.  
  20. def put(path, &handler)
  21. route("PUT", path, &handler)
  22. end
  23.  
  24. def patch(path, &handler)
  25. route("PATCH", path, &handler)
  26. end
  27.  
  28. def delete(path, &handler)
  29. route("DELETE", path, &handler)
  30. end
  31.  
  32. def head(path, &handler)
  33. route("HEAD", path, &handler)
  34. end
  35.  
  36. def call(env)
  37. @request = Rack::Request.new(env)
  38. verb = @request.request_method
  39. requested_path = @request.path_info
  40.  
  41. handler = @routes.fetch(verb, {}).fetch(requested_path, nil)
  42.  
  43. if handler
  44. result = instance_eval(&handler)
  45. if result.class == String
  46. [200, {}, [result]]
  47. else
  48. result
  49. end
  50. else
  51. [404, {}, ["Oops! No route for #{verb} #{requested_path}"]]
  52. end
  53. end
  54.  
  55. attr_reader :request
  56.  
  57. private
  58.  
  59. def route(ver, path, &handler)
  60. @routes[verb] ||= {}
  61. @routes[verb][path] = handler
  62. end
  63.  
  64. def params
  65. @request.params
  66. end
  67. end
  68.  
  69. Application = Base.new
  70.  
  71. module Delegator
  72. def self.delegate(*methods, to:)
  73. Array(methods).each do |method_name|
  74. define_method(method_name) do |*args, &block|
  75. to.send(method_name, *args, &block)
  76. end
  77.  
  78. private method_name
  79. end
  80. end
  81.  
  82. delegate :get, :patch, :put, :post, :delete, :head, to: Application
  83. end
  84. end
  85.  
  86. include Nancy::Delegator
  87.  
  88.  
  89. nancy = Nancy::Base.new
  90.  
  91. nancy.get "/hello" do
  92. [200, {}, ["Nancy says hello"]]
  93. end
  94.  
  95. puts nancy.routes
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement