2 Thrift IDL Support.
Support for Thrift format definitions
> (require thrift thrift/idl/language) > (define-thrift-namespace parquet) 
> (define-thrift-enum parquet-type 0 (boolean int32 int64 int96 float double byte-array fixed-len-byte-arrary)) 
> (define-thrift-struct file-metadata ([1 version required type-int32] [2 schema required list-of schema-element] [3 num-rows required type-int64] [4 row-groups required list-of row-group] [5 key-value-metadata optional list-of key-value] [6 created-by optional type-string] [7 column-orders optional list-of column-order])) 
2.1 Type System
| (require thrift/idl/common) | package: thrift | 
2.1.1 Core Types
procedure
v : any/c 
value
value
value
value
value
value
value
value
value
value
value
value
value
value
value
value
value
value
procedure
(integer->type n) → type?
n : exact-nonnegative-integer? 
procedure
(type/decode d) → type?
d : decoder? 
procedure
(type/names) → (listof string?)
2.1.2 Field Type Information
procedure
(required-type? v) → boolean?
v : any/c 
value
value
value
procedure
n : exact-nonnegative-integer? 
procedure
d : decoder? 
procedure
(required-type/names) → (listof string?)
procedure
(container-type? v) → boolean?
v : any/c 
value
value
value
value
procedure
n : exact-nonnegative-integer? 
procedure
d : decoder? 
procedure
struct
(struct thrift-field ( id name required container major-type minor-type position) #:mutable) id : identifier? name : string? required : symbol? container : symbol? major-type : symbol? minor-type : symbol? position : exact-nonnegative-integer? 
2.2 IDL Language
| (require thrift/idl/language) | package: thrift | 
syntax
namespace : string? 
syntax
id = string? maybe-start = 
| exact-nonnegative-integer? value-expr = identifier? | [identifier? exact-nonnegative-integer?] 
syntax
field = (index name maybe-req maybe-con elem-type) | (index name maybe-req map-of elem-type key-type) maybe-required = 
| required-type? maybe-container = 
| container-type? 
index : exact-nonnegative-integer? 
name : identifier? 
elem-type : identifier? 
key-type : identifier? 
2.3 Code Generator
| (require thrift/idl/generator) | package: thrift | 
procedure
(process-file [ file-path module-prefix over-write?]) → void? file-path : string? = "." module-prefix : string? = "" over-write? : boolean? = #f 
2.3.1 Command-Line Launcher
The parquet/idl/generator module is also used to create a launcher, rthrift that wraps process-file to generate bindings for an IDL file from a Racket description.
| rthrift [ <option> ... ] <file-path> | 
| where <option> is one of | 
| -v, --verbose : Compile with verbose messages | 
| -V, --very-verbose : Compile with very verbose messages | 
| -o <path>, --output-path <path> : Directory to write the output into | 
| -m <module>, --module-prefix <module> : Prefix generated modules with a module path | 
| -f, --force-overwrite : Over-write any existing files | 
| --help, -h : Show this help | 
| -- : Do not treat any remaining argument as a switch (at this level) | 
| Multiple single-letter switches can be combined after one `-'; for | 
| example: `-h-' is the same as `-h --' | 
To generate the files used in the module parquet, we use the following command.
$ rthrift -o parquet/generated -m parquet/generated parquet/format.rkt
This generates the following files, in the parquet/generated directory.
- parquet.rkt - The core types, expanded, used by the following. 
- parquet-encode.rkt - All the encoder functions for the types above. 
- parquet-decode.rkt - All the decoder functions for the types above. 
- parquet.scrbl - Documentation for the three modules above.