创建构建并使用简单的 .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 将使用 Person.hs 在当前目录中创建一个新的文件夹 Protocol,我们可以将其导入到我们的 haskell 项目中:

import Protocol (Person)

下一步,如果使用 Stack add

   protocol-buffers
 , protocol-buffers-descriptor

build-depends:

Protocol

你的 .cabal 文件中的 exposed-modules

如果我们现在从流中获得传入消息,则消息将具有 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