Создание методов с макросом на основе имен перечисления - PullRequest
0 голосов
/ 26 февраля 2020

Наличие структуры со следующим перечислением:

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 %}

1 Ответ

2 голосов
/ 27 февраля 2020

С TypeNode # константами :

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
...