Ссылки на перечисления C в библиотеке Crystal

Я пытаюсь написать оболочку Crystal вокруг libevent, и мне было интересно, как подойти к его перечислениям, которые названы как все в нижнем регистре, например:

enum http://www.wangafu.net/~nickm/libevent-2.1/doxygen/html/http_8h.html#a01f921a909d1504f873222b1d29c2b4a:

Я пробовал следующее:

@[Link("event")]
lib LibEvent
  # <snip>
  enum evhttp_request_error
    EVREQ_HTTP_TIMEOUT,
    EVREQ_HTTP_EOF,
    EVREQ_HTTP_INVALID_HEADER,
    EVREQ_HTTP_BUFFER_ERROR,
    EVREQ_HTTP_DATA_TOO_LONG
  end
end

но это не удается, потому что evhttp_request_error не соответствует грамматике константы Crystal. Как мне решить эту проблему?


person andrewdotnich    schedule 23.08.2017    source источник


Ответы (2)


Вы можете назвать это как хотите. Но когда вы используете enum внутри вашей библиотеки-оболочки, вы просто объявляете новое перечисление C:

@[Link("event")]
lib LibEvent
   enum EvHTTPRequestError
     EVREQ_HTTP_TIMEOUT
     EVREQ_HTTP_EOF
     EVREQ_HTTP_INVALID_HEADER
     EVREQ_HTTP_BUFFER_ERROR
     EVREQ_HTTP_DATA_TOO_LONG
  end
end

Это фактически то же самое, что и:

@[Link("event")]
lib LibEvent
   enum EvHTTPRequestError
     EVREQ_HTTP_TIMEOUT = 0
     EVREQ_HTTP_EOF = 1
     EVREQ_HTTP_INVALID_HEADER = 2
     EVREQ_HTTP_BUFFER_ERROR = 3
     EVREQ_HTTP_DATA_TOO_LONG = 4
  end
end

и значения в этом перечислении не будут соответствовать значениям из исходной библиотеки C.

Вам необходимо вручную установить (дублировать) правильные значения в вашем перечислении.

Поскольку Crystal привязывается только к файлу общей библиотеки, нет другого варианта, кроме как вручную (иногда автоматически) дублировать их как константы в коде Crystal.

Пример проверки в Crystal stdlib

person Vitalii Elenhaupt    schedule 23.08.2017

Короче говоря, это не имеет значения. Имя не обязательно должно точно совпадать с именем C (в любом случае это прославленный int), поэтому при условии, что значения совпадают со своими аналогами в C-land, имя Crystal для этого типа может быть любым. ты хочешь :)

person andrewdotnich    schedule 23.08.2017