使用基于枚举名称的宏创建方法

Creating methods with a macro based on the names of an enum

具有具有以下枚举的结构:

struct Payment
  enum Status
    Open
    Paid
    Failed

    def to_s
      super.downcase
    end
  end

  getter status : String
end

如何访问宏中的枚举名称以创建方法,如 open?paid?failed?

解决方案

根据@Jonne Haß 的提议,这就是我想要实现的目标:

{% for value in Status.constants %}
  {% downcased = value.stringify.downcase %}
  def {{ downcased.id }}?
    {{ downcased }} == status
  end
{% end %}

TypeNode#constants:

struct Payment
  enum Status
    Open
    Paid
    Failed
  end

  getter status : Status = Status::Open

  {% begin %}
    delegate({{Status.constants.map {|value| value.stringify.downcase + "?" }.join(", ").id}}, to: status)
  {% end %}
end