Skip to content

Instantly share code, notes, and snippets.

@Sija
Last active February 24, 2017 02:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Sija/d0559921a7763b6f4407b441f04dabe0 to your computer and use it in GitHub Desktop.
Save Sija/d0559921a7763b6f4407b441f04dabe0 to your computer and use it in GitHub Desktop.
module MacroMagic
def initialize(**attributes)
{% for var in @type.instance_vars %}
if arg = attributes[:{{var.name.id}}]?
@{{var.name.id}} = arg
end
{% end %}
end
private def instance_var_get(name)
name = name.to_s
{% for var in @type.instance_vars %}
return @{{var.name.id}} if {{var.name.stringify}} == name
{% end %}
yield
end
protected def instance_method_get(name)
name = name.to_s
{% for method in @type.methods.select { |m| m.args.empty? && !m.splat_index && !m.double_splat } %}
return {{method.name.id}} if {{method.name.stringify}} == name
{% end %}
yield
end
protected def instance_var_or_method_get(name)
instance_var_get(name) do
instance_method_get(name) { yield }
end
end
def []?(option : Symbol | String)
instance_var_get(option) { nil }
end
def [](option : Symbol | String)
instance_var_get(option) { raise KeyError.new "Missing key '#{option}'" }
end
def []=(option : Symbol | String, value)
option = option.to_s
{% for var in @type.instance_vars %}
if option == {{var.name.stringify}}
if value.is_a?({{var.type.id}})
return @{{var.name.id}} = value
else
raise TypeCastError.new "Wrong type for key '#{option}': expected {{var.type.id}}, got #{value.class}"
end
end
{% end %}
raise KeyError.new "Missing key '#{option}'"
end
def to_named_tuple
{% if @type.instance_vars.empty? %}
return nil
{% else %}
{
{% for var in @type.instance_vars %}
{{var.name.id}}: @{{var.name.id}},
{% end %}
}
{% end %}
end
def to_hash
{% if @type.instance_vars.empty? %}
return nil
{% else %}
{
{% for var in @type.instance_vars %}
:{{var.name.id}} => @{{var.name.id}},
{% end %}
}
{% end %}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment