lib/roadie/errors.rb
# frozen_string_literal: true
module Roadie
# Base class for all Roadie errors. Rescue this if you want to catch errors
# from Roadie.
#
# If Roadie raises an error that does not inherit this class, please report
# it as a bug.
class Error < RuntimeError; end
# Raised when Roadie encounters an invalid URL which cannot be parsed by
# Ruby's +URI+ class.
#
# This could be a hint that something in your HTML or CSS is broken.
class InvalidUrlPath < Error
# The original error, raised from +URI+.
attr_reader :cause
def initialize(given_path, cause = nil)
@cause = cause
cause_message = if cause
" Caused by: #{cause}"
else
""
end
super(
"Cannot use path \"#{given_path}\" in URL generation.#{cause_message}"
)
end
end
# Raised when an asset provider cannot find a stylesheet.
#
# If you are writing your own asset provider, make sure to raise this in the
# +#find_stylesheet!+ method.
#
# @see AssetProvider
class CssNotFound < Error
# The name of the stylesheet that cannot be found
attr_reader :css_name
# Provider used when finding
attr_reader :provider
# Extra message
attr_reader :extra_message
def initialize(css_name:, message: nil, provider: nil)
@css_name = css_name
@provider = provider
@extra_message = message
super(build_message)
end
protected
def error_row
"#{provider || "Unknown provider"}: #{extra_message}"
end
private
def build_message
message = +%(Could not find stylesheet "#{css_name}")
message << ": #{extra_message}" if extra_message
message << "\nUsed provider:\n#{provider}" if provider
message
end
end
class ProvidersFailed < CssNotFound
attr_reader :errors
def initialize(css_name:, providers:, errors:)
@errors = errors
super(
css_name: css_name,
message: "All providers failed",
provider: providers
)
end
private
def build_message
message = +%(Could not find stylesheet "#{css_name}": #{extra_message}\nUsed providers:\n)
each_error_row(errors) do |row|
message << "\t" << row << "\n"
end
message
end
def each_error_row(errors)
errors.each do |error|
case error
when ProvidersFailed
each_error_row(error.errors) { |row| yield row }
when CssNotFound
yield error.error_row
else
yield "Unknown provider (#{error.class}): #{error}"
end
end
end
end
end