Last active
August 29, 2015 13:56
-
-
Save acook/9260920 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class GreetingView | |
def initialize env | |
@env = env | |
end | |
def new | |
flash | |
print "Enter your name: " | |
end | |
def show | |
flash | |
puts "Hello, #{@env[:greeter].name}!" | |
end | |
def error | |
puts "Sorry, something went wrong: #{@env.delete(:flash)}" | |
end | |
def flash | |
puts @env.delete(:flash) if @env[:flash] | |
end | |
end | |
class GreetingController | |
def initialize router | |
@router = router | |
end | |
def new | |
GreetingView.new(@router.env).new | |
response = gets.strip | |
unless response.empty? then | |
@router.go_to 'greeting/create' | |
else | |
@router.env[:flash] = "Try again!" | |
@router.go_to 'greeting/new' | |
end | |
response | |
end | |
def create | |
if @router.response.is_a? String then | |
@router.env[:greeter] = Greeter.new(@router.response) | |
@router.go_to 'greeting/show' | |
else | |
@router.env[:flash] = "I don't know what do do with #{@router.response.inspect}!" | |
@router.go_to 'greeting/error' | |
end | |
[email protected][:greeter] | |
end | |
def show | |
GreetingView.new(@router.env).show | |
@router.done! | |
end | |
def error | |
GreetingView.new(@router.env).error | |
@router.go_to :default | |
end | |
end | |
class Greeter | |
def initialize name | |
@name = name | |
end | |
attr_accessor :name | |
end | |
class GreetingRouter | |
def initialize env = Hash.new | |
@env = env | |
end | |
def route! | |
route_to :default | |
until @env[:done] | |
route_to @env[:destination] | |
end | |
rescue => error | |
@env[:flash] = "Encountered error in route #{@env[:destination]}: #{error.inspect}" | |
go_to 'greeting/error' | |
retry | |
end | |
def env | |
@env | |
end | |
def go_to destination | |
@env[:destination] = destination | |
end | |
def response | |
@env[:response] | |
end | |
def done! | |
@env[:done] = true | |
end | |
private | |
def route_to destination | |
route = map[destination] | |
if route then | |
@env[:response] = route.first.new(self).send route.last | |
else | |
@env[:flash] = "Unknown route: #{destination.inspect}" | |
route_to 'greeting/error' | |
end | |
end | |
def map | |
{ | |
:default => [GreetingController, :new], | |
'greeting/new' => [GreetingController, :new], | |
'greeting/create' => [GreetingController, :create], | |
'greeting/show' => [GreetingController, :show], | |
'greeting/error' => [GreetingController, :error] | |
} | |
end | |
end | |
GreetingRouter.new.route! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment