Created
January 9, 2012 03:57
-
-
Save drewdeponte/1580975 to your computer and use it in GitHub Desktop.
generate_from_segments
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
def generate_from_segments(segments, params, merged, options, optional = false) | |
if optional | |
return EMPTY_STRING if segments.all? { |s| s.is_a?(String) } | |
return EMPTY_STRING unless segments.flatten.any? { |s| | |
params.has_key?(s.name) if s.is_a?(DynamicSegment) | |
} | |
return EMPTY_STRING if segments.any? { |segment| | |
if segment.is_a?(DynamicSegment) | |
value = merged[segment.name] || @defaults[segment.name] | |
value = parameterize(segment.name, value, options) | |
merged_value = parameterize(segment.name, merged[segment.name], options) | |
default_value = parameterize(segment.name, @defaults[segment.name], options) | |
if value.nil? || segment !~ value | |
true | |
elsif merged_value == default_value | |
# Nasty control flow | |
return :clear_remaining_segments | |
else | |
false | |
end | |
end | |
} | |
end | |
generated = segments.map do |segment| | |
case segment | |
when String | |
segment | |
when DynamicSegment | |
puts "DREW: dynamic segment" | |
value = params[segment.name] || merged[segment.name] || @defaults[segment.name] | |
value = parameterize(segment.name, value, options) | |
if value && segment =~ value.to_s | |
value | |
else | |
return | |
end | |
when Array | |
value = generate_from_segments(segment, params, merged, options, true) | |
if value == :clear_remaining_segments | |
segment.each { |s| params.delete(s.name) if s.is_a?(DynamicSegment) } | |
EMPTY_STRING | |
elsif value.nil? | |
EMPTY_STRING | |
else | |
value | |
end | |
end | |
end | |
# Delete any used items from the params | |
segments.each { |s| params.delete(s.name) if s.is_a?(DynamicSegment) } | |
generated.join | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment