Skip to content

Instantly share code, notes, and snippets.

@ukazap
Last active June 24, 2025 03:56
Show Gist options
  • Save ukazap/7ac9f679793467356d31455876b295da to your computer and use it in GitHub Desktop.
Save ukazap/7ac9f679793467356d31455876b295da to your computer and use it in GitHub Desktop.
The power of pattern matching in Ruby

The power of pattern matching in Ruby

Pattern matching sangat powerful terutama untuk handling input dari external, bisa type checking + variable binding dalam satu step.

Awalnya cuma ada di bahasa functional seperti Erlang, Elixir, Scala, dsb., sekarang ada di Ruby sejak 3.0.

https://docs.ruby-lang.org/en/3.0/syntax/pattern_matching_rdoc.html

def parse_event(sqs_message)
JSON.parse(sqs_message.body) => Hash => parsed_sqs_body
parsed_sqs_body["Message"] => String => raw_sns_message
JSON.parse(raw_sns_message) => Hash => parsed_sns_message
parsed_sns_message["AutoScalingGroupName"] => String => asg
parsed_sns_message["EC2InstanceId"] => String => instance_id
parsed_sns_message["Event"] => String => event
Environment.where(autoscaling_group: asg).pick(:environment_name) => String => environment_name
[ event, { environment_name: environment_name, instance_id: instance_id } ]
rescue NoMatchingPatternError
nil
rescue JSON::ParserError => e
Rails.logger.error "Failed to parse message: #{e.message}"
nil
end
def parse_event(sqs_message)
message_body = JSON.parse(sqs_message.body)
return nil unless message_body.is_a?(Hash)
return nil unless message_body["Message"].is_a?(String)
sns_message = JSON.parse(message_body["Message"])
return nil unless sns_message.is_a?(Hash)
environment_name = Environment.where(autoscaling_group: sns_message["AutoScalingGroupName"])
.pick(:environment_name)
return nil unless environment_name
[ sns_message["Event"], { environment_name: environment_name, instance_id: sns_message["EC2InstanceId"] } ]
rescue JSON::ParserError => e
Rails.logger.error "Failed to parse message: #{e.message}"
nil
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment