Поиск…


замечания

Чтобы использовать протокольные буферы с Haskell, вы должны установить пакет htprotoc :

  1. Клонировать проект от Github
  2. Использовать Stack для сборки и установки

Теперь вы должны найти исполняемый файл hprotoc в $HOME/.local/bin/ .

Создание, создание и использование простого файла .proto

Давайте сначала создадим простой .proto файл person.proto

package Protocol;

message Person {
    required string firstName = 1;
    required string lastName  = 2;
    optional int32  age       = 3;
}

После сохранения мы можем теперь создавать файлы Haskell, которые мы можем использовать в нашем проекте, запустив

$HOME/.local/bin/hprotoc --proto_path=. --haskell_out=. person.proto

Мы должны получить аналогичный результат:

Loading filepath: "/<path-to-project>/person.proto"
All proto files loaded
Haskell name mangling done
Recursive modules resolved
./Protocol/Person.hs
./Protocol.hs
Processing complete, have a nice day.

hprotoc создаст новую папку Protocol в текущем каталоге с Person.hs которую мы можем просто импортировать в наш проект haskell:

import Protocol (Person)

В качестве следующего шага, если использовать Stack add

   protocol-buffers
 , protocol-buffers-descriptor

build-depends: и

Protocol

для exposed-modules в вашем файле .cabal .

Если мы получим входящее сообщение из потока, сообщение будет иметь тип ByteString .

Чтобы преобразовать ByteString (который, очевидно, должен содержать закодированные данные Person) в наш тип данных Haskell, нам нужно вызвать функцию messageGet которую мы импортируем по

import Text.ProtocolBuffers (messageGet)

который позволяет создать значение типа Person используя:

transformRawPerson :: ByteString -> Maybe Person
transformRawPerson raw = case messageGet raw of
    Left   _           -> Nothing
    Right (person, _)  -> Just person


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow