A Pure Elixir Thrift Implementation
Go to file
Jon Parise aec78ba97d Fix main reference to the README document (#123)
This appears to be case-sensitive, and I wasn't noticing because the
macOS's file system isn't.

Also, remove the Apache License batch from the README because it doesn't
render that well as part of the generated documentation. We may want to
remove the other badges later too if we continue to use the README as a
key part of our Hex-published docs.
2016-12-31 11:46:14 -08:00
bench Remove UnionSerializationBenchmark (#101) 2016-12-29 14:10:37 -08:00
ci Remove tng thrift (#67) 2016-12-09 11:17:08 -08:00
config Disable Logger console output in the test env 2016-12-26 16:48:52 -08:00
lib Add missing :union data type (#119) 2016-12-31 09:50:49 -08:00
src Remove tng thrift (#67) 2016-12-09 11:17:08 -08:00
test Shorten binary expression in test (#121) 2016-12-30 23:12:18 -08:00
.credo.exs Add a custom Credo configuration file 2016-12-23 14:09:27 -08:00
.ebert.yml Remove the Apache Thrift Erlang runtime library (#122) 2016-12-31 09:02:51 -08:00
.gitignore Remove tng thrift (#67) 2016-12-09 11:17:08 -08:00
.travis.yml Simplify the Travis build matrix (#87) 2016-12-29 09:18:26 -08:00
coveralls.json Remove the Apache Thrift Erlang runtime library (#122) 2016-12-31 09:02:51 -08:00
LICENSE Remove license appendix text 2016-09-22 08:06:09 -07:00
mix.exs Fix main reference to the README document (#123) 2016-12-31 11:46:14 -08:00
mix.lock Clean up some dialyzer warnings (#110) 2016-12-30 13:12:41 -08:00
README.md Fix main reference to the README document (#123) 2016-12-31 11:46:14 -08:00
TODO.md Remove tng thrift (#67) 2016-12-09 11:17:08 -08:00

Thrift Utilities for Elixir

Build Status Coverage Status

This package contains a handful of useful utilities for working with Thrift in Elixir.

Setup

Start by adding this package to your project as a dependency:

{:thrift, "~> 1.3"}

Or to track the GitHub master branch:

{:thrift, github: "pinterest/elixir-thrift"}

Mix

This package includes a Mix compiler task that can be used to automate Thrift code generation. Start by adding :thrift to your project's :compilers list. For example:

compilers: [:thrift | Mix.compilers]

It's important to add :thrift before the :erlang entry. The Thrift compiler will generate Erlang source files, and we currently rely on this ordering to ensure those generated source files get compiled.

Next, define the list of :thrift_files that should be compiled. In this example, we gather all of the .thrift files under the thrift directory:

thrift_files: Mix.Utils.extract_files(["thrift"], [:thrift])

By default, the generated source files will be written to the src directory, but you can change that using the thrift_output option.

You can also pass additional options to the Thrift compiler by listing them in the thrift_options option:

thrift_options: ~w[-I my/include/dir]

If you require a specific version of the Thrift compiler, you can specify a version requirement using the thrift_version option. Version requirements use the SemVer 2.0 schema. For example:

thrift_version: ">= 0.9.3"  # Erlang maps support

You can also override the name of the Thrift compiler executable itself:

thrift_executable: "thrift-0.9.3"

If you get something like type set() undefined when compiling the generated files you can try:

thrift_options: ~w[--gen erl:maps]

Thrift IDL Parsing

This package also contains experimental support for parsing Thrift IDL files. It is built on a low-level Erlang lexer and parser:

{:ok, tokens, _} = :thrift_lexer.string('enum Colors { RED, GREEN, BLUE}')
{:ok,
 [{:enum, 1}, {:ident, 1, 'Colors'}, {:symbol, 1, '{'}, {:ident, 1, 'RED'},
  {:symbol, 1, ','}, {:ident, 1, 'GREEN'}, {:symbol, 1, ','},
  {:ident, 1, 'BLUE'}, {:symbol, 1, '}'}], 1}

{:ok, schema} = :thrift_parser.parse(tokens)
{:ok,
 %Thrift.Parser.Models.Schema{constants: %{},
  enums: %{Colors: %Thrift.Parser.Models.TEnum{name: :Colors,
     values: [RED: 1, GREEN: 2, BLUE: 3]}}, exceptions: %{}, includes: [],
  namespaces: %{}, services: %{}, structs: %{}, thrift_namespace: nil,
  typedefs: %{}, unions: %{}}}

But also provides a high-level Elixir parsing interface:

Thrift.Parser.parse("enum Colors { RED, GREEN, BLUE}")
%Thrift.Parser.Models.Schema{constants: %{},
 enums: %{Colors: %Thrift.Parser.Models.TEnum{name: :Colors,
    values: [RED: 1, GREEN: 2, BLUE: 3]}}, exceptions: %{}, includes: [],
 namespaces: %{}, services: %{}, structs: %{}, thrift_namespace: nil,
 typedefs: %{}, unions: %{}}