Skip to content

Instantly share code, notes, and snippets.

@acook
Last active August 29, 2015 13:56
Show Gist options
  • Save acook/9260920 to your computer and use it in GitHub Desktop.
Save acook/9260920 to your computer and use it in GitHub Desktop.
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