#
# Autogenerated by Thrift Compiler (0.7.0)
#
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
#


module SomeEnum
  ONE = 1
  TWO = 2
  VALUE_MAP = {1 => "ONE", 2 => "TWO"}
  VALID_VALUES = Set.new([ONE, TWO]).freeze
end

class Doubles
  include ::Thrift::Struct, ::Thrift::Struct_Union
  NAN = 1
  INF = 2
  NEGINF = 3
  REPEATING = 4
  BIG = 5
  SMALL = 6
  ZERO = 7
  NEGZERO = 8

  FIELDS = {
    NAN => {:type => ::Thrift::Types::DOUBLE, :name => 'nan'},
    INF => {:type => ::Thrift::Types::DOUBLE, :name => 'inf'},
    NEGINF => {:type => ::Thrift::Types::DOUBLE, :name => 'neginf'},
    REPEATING => {:type => ::Thrift::Types::DOUBLE, :name => 'repeating'},
    BIG => {:type => ::Thrift::Types::DOUBLE, :name => 'big'},
    SMALL => {:type => ::Thrift::Types::DOUBLE, :name => 'small'},
    ZERO => {:type => ::Thrift::Types::DOUBLE, :name => 'zero'},
    NEGZERO => {:type => ::Thrift::Types::DOUBLE, :name => 'negzero'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class OneOfEach
  include ::Thrift::Struct, ::Thrift::Struct_Union
  IM_TRUE = 1
  IM_FALSE = 2
  A_BITE = 3
  INTEGER16 = 4
  INTEGER32 = 5
  INTEGER64 = 6
  DOUBLE_PRECISION = 7
  SOME_CHARACTERS = 8
  ZOMG_UNICODE = 9
  WHAT_WHO = 10
  BASE64 = 11
  BYTE_LIST = 12
  I16_LIST = 13
  I64_LIST = 14

  FIELDS = {
    IM_TRUE => {:type => ::Thrift::Types::BOOL, :name => 'im_true'},
    IM_FALSE => {:type => ::Thrift::Types::BOOL, :name => 'im_false'},
    A_BITE => {:type => ::Thrift::Types::BYTE, :name => 'a_bite', :default => 127},
    INTEGER16 => {:type => ::Thrift::Types::I16, :name => 'integer16', :default => 32767},
    INTEGER32 => {:type => ::Thrift::Types::I32, :name => 'integer32'},
    INTEGER64 => {:type => ::Thrift::Types::I64, :name => 'integer64', :default => 10000000000},
    DOUBLE_PRECISION => {:type => ::Thrift::Types::DOUBLE, :name => 'double_precision'},
    SOME_CHARACTERS => {:type => ::Thrift::Types::STRING, :name => 'some_characters'},
    ZOMG_UNICODE => {:type => ::Thrift::Types::STRING, :name => 'zomg_unicode'},
    WHAT_WHO => {:type => ::Thrift::Types::BOOL, :name => 'what_who'},
    BASE64 => {:type => ::Thrift::Types::STRING, :name => 'base64', :binary => true},
    BYTE_LIST => {:type => ::Thrift::Types::LIST, :name => 'byte_list', :default => [
      1,
      2,
      3,
    ], :element => {:type => ::Thrift::Types::BYTE}},
    I16_LIST => {:type => ::Thrift::Types::LIST, :name => 'i16_list', :default => [
      1,
      2,
      3,
    ], :element => {:type => ::Thrift::Types::I16}},
    I64_LIST => {:type => ::Thrift::Types::LIST, :name => 'i64_list', :default => [
      1,
      2,
      3,
    ], :element => {:type => ::Thrift::Types::I64}}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class Bonk
  include ::Thrift::Struct, ::Thrift::Struct_Union
  TYPE = 1
  MESSAGE = 2

  FIELDS = {
    TYPE => {:type => ::Thrift::Types::I32, :name => 'type'},
    MESSAGE => {:type => ::Thrift::Types::STRING, :name => 'message'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class Nesting
  include ::Thrift::Struct, ::Thrift::Struct_Union
  MY_BONK = 1
  MY_OOE = 2

  FIELDS = {
    MY_BONK => {:type => ::Thrift::Types::STRUCT, :name => 'my_bonk', :class => Bonk},
    MY_OOE => {:type => ::Thrift::Types::STRUCT, :name => 'my_ooe', :class => OneOfEach}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class HolyMoley
  include ::Thrift::Struct, ::Thrift::Struct_Union
  BIG = 1
  CONTAIN = 2
  BONKS = 3

  FIELDS = {
    BIG => {:type => ::Thrift::Types::LIST, :name => 'big', :element => {:type => ::Thrift::Types::STRUCT, :class => OneOfEach}},
    CONTAIN => {:type => ::Thrift::Types::SET, :name => 'contain', :element => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::STRING}}},
    BONKS => {:type => ::Thrift::Types::MAP, :name => 'bonks', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::STRUCT, :class => Bonk}}}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class Backwards
  include ::Thrift::Struct, ::Thrift::Struct_Union
  FIRST_TAG2 = 2
  SECOND_TAG1 = 1

  FIELDS = {
    FIRST_TAG2 => {:type => ::Thrift::Types::I32, :name => 'first_tag2'},
    SECOND_TAG1 => {:type => ::Thrift::Types::I32, :name => 'second_tag1'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class Empty
  include ::Thrift::Struct, ::Thrift::Struct_Union

  FIELDS = {

  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class Wrapper
  include ::Thrift::Struct, ::Thrift::Struct_Union
  FOO = 1

  FIELDS = {
    FOO => {:type => ::Thrift::Types::STRUCT, :name => 'foo', :class => Empty}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class RandomStuff
  include ::Thrift::Struct, ::Thrift::Struct_Union
  A = 1
  B = 2
  C = 3
  D = 4
  MYINTLIST = 5
  MAPS = 6
  BIGINT = 7
  TRIPLE = 8

  FIELDS = {
    A => {:type => ::Thrift::Types::I32, :name => 'a'},
    B => {:type => ::Thrift::Types::I32, :name => 'b'},
    C => {:type => ::Thrift::Types::I32, :name => 'c'},
    D => {:type => ::Thrift::Types::I32, :name => 'd'},
    MYINTLIST => {:type => ::Thrift::Types::LIST, :name => 'myintlist', :element => {:type => ::Thrift::Types::I32}},
    MAPS => {:type => ::Thrift::Types::MAP, :name => 'maps', :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::STRUCT, :class => Wrapper}},
    BIGINT => {:type => ::Thrift::Types::I64, :name => 'bigint'},
    TRIPLE => {:type => ::Thrift::Types::DOUBLE, :name => 'triple'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class Base64
  include ::Thrift::Struct, ::Thrift::Struct_Union
  A = 1
  B1 = 2
  B2 = 3
  B3 = 4
  B4 = 5
  B5 = 6
  B6 = 7

  FIELDS = {
    A => {:type => ::Thrift::Types::I32, :name => 'a'},
    B1 => {:type => ::Thrift::Types::STRING, :name => 'b1', :binary => true},
    B2 => {:type => ::Thrift::Types::STRING, :name => 'b2', :binary => true},
    B3 => {:type => ::Thrift::Types::STRING, :name => 'b3', :binary => true},
    B4 => {:type => ::Thrift::Types::STRING, :name => 'b4', :binary => true},
    B5 => {:type => ::Thrift::Types::STRING, :name => 'b5', :binary => true},
    B6 => {:type => ::Thrift::Types::STRING, :name => 'b6', :binary => true}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class CompactProtoTestStruct
  include ::Thrift::Struct, ::Thrift::Struct_Union
  A_BYTE = 1
  A_I16 = 2
  A_I32 = 3
  A_I64 = 4
  A_DOUBLE = 5
  A_STRING = 6
  A_BINARY = 7
  TRUE_FIELD = 8
  FALSE_FIELD = 9
  EMPTY_STRUCT_FIELD = 10
  BYTE_LIST = 11
  I16_LIST = 12
  I32_LIST = 13
  I64_LIST = 14
  DOUBLE_LIST = 15
  STRING_LIST = 16
  BINARY_LIST = 17
  BOOLEAN_LIST = 18
  STRUCT_LIST = 19
  BYTE_SET = 20
  I16_SET = 21
  I32_SET = 22
  I64_SET = 23
  DOUBLE_SET = 24
  STRING_SET = 25
  BINARY_SET = 26
  BOOLEAN_SET = 27
  STRUCT_SET = 28
  BYTE_BYTE_MAP = 29
  I16_BYTE_MAP = 30
  I32_BYTE_MAP = 31
  I64_BYTE_MAP = 32
  DOUBLE_BYTE_MAP = 33
  STRING_BYTE_MAP = 34
  BINARY_BYTE_MAP = 35
  BOOLEAN_BYTE_MAP = 36
  BYTE_I16_MAP = 37
  BYTE_I32_MAP = 38
  BYTE_I64_MAP = 39
  BYTE_DOUBLE_MAP = 40
  BYTE_STRING_MAP = 41
  BYTE_BINARY_MAP = 42
  BYTE_BOOLEAN_MAP = 43
  LIST_BYTE_MAP = 44
  SET_BYTE_MAP = 45
  MAP_BYTE_MAP = 46
  BYTE_MAP_MAP = 47
  BYTE_SET_MAP = 48
  BYTE_LIST_MAP = 49

  FIELDS = {
    A_BYTE => {:type => ::Thrift::Types::BYTE, :name => 'a_byte'},
    A_I16 => {:type => ::Thrift::Types::I16, :name => 'a_i16'},
    A_I32 => {:type => ::Thrift::Types::I32, :name => 'a_i32'},
    A_I64 => {:type => ::Thrift::Types::I64, :name => 'a_i64'},
    A_DOUBLE => {:type => ::Thrift::Types::DOUBLE, :name => 'a_double'},
    A_STRING => {:type => ::Thrift::Types::STRING, :name => 'a_string'},
    A_BINARY => {:type => ::Thrift::Types::STRING, :name => 'a_binary', :binary => true},
    TRUE_FIELD => {:type => ::Thrift::Types::BOOL, :name => 'true_field'},
    FALSE_FIELD => {:type => ::Thrift::Types::BOOL, :name => 'false_field'},
    EMPTY_STRUCT_FIELD => {:type => ::Thrift::Types::STRUCT, :name => 'empty_struct_field', :class => Empty},
    BYTE_LIST => {:type => ::Thrift::Types::LIST, :name => 'byte_list', :element => {:type => ::Thrift::Types::BYTE}},
    I16_LIST => {:type => ::Thrift::Types::LIST, :name => 'i16_list', :element => {:type => ::Thrift::Types::I16}},
    I32_LIST => {:type => ::Thrift::Types::LIST, :name => 'i32_list', :element => {:type => ::Thrift::Types::I32}},
    I64_LIST => {:type => ::Thrift::Types::LIST, :name => 'i64_list', :element => {:type => ::Thrift::Types::I64}},
    DOUBLE_LIST => {:type => ::Thrift::Types::LIST, :name => 'double_list', :element => {:type => ::Thrift::Types::DOUBLE}},
    STRING_LIST => {:type => ::Thrift::Types::LIST, :name => 'string_list', :element => {:type => ::Thrift::Types::STRING}},
    BINARY_LIST => {:type => ::Thrift::Types::LIST, :name => 'binary_list', :element => {:type => ::Thrift::Types::STRING, :binary => true}},
    BOOLEAN_LIST => {:type => ::Thrift::Types::LIST, :name => 'boolean_list', :element => {:type => ::Thrift::Types::BOOL}},
    STRUCT_LIST => {:type => ::Thrift::Types::LIST, :name => 'struct_list', :element => {:type => ::Thrift::Types::STRUCT, :class => Empty}},
    BYTE_SET => {:type => ::Thrift::Types::SET, :name => 'byte_set', :element => {:type => ::Thrift::Types::BYTE}},
    I16_SET => {:type => ::Thrift::Types::SET, :name => 'i16_set', :element => {:type => ::Thrift::Types::I16}},
    I32_SET => {:type => ::Thrift::Types::SET, :name => 'i32_set', :element => {:type => ::Thrift::Types::I32}},
    I64_SET => {:type => ::Thrift::Types::SET, :name => 'i64_set', :element => {:type => ::Thrift::Types::I64}},
    DOUBLE_SET => {:type => ::Thrift::Types::SET, :name => 'double_set', :element => {:type => ::Thrift::Types::DOUBLE}},
    STRING_SET => {:type => ::Thrift::Types::SET, :name => 'string_set', :element => {:type => ::Thrift::Types::STRING}},
    BINARY_SET => {:type => ::Thrift::Types::SET, :name => 'binary_set', :element => {:type => ::Thrift::Types::STRING, :binary => true}},
    BOOLEAN_SET => {:type => ::Thrift::Types::SET, :name => 'boolean_set', :element => {:type => ::Thrift::Types::BOOL}},
    STRUCT_SET => {:type => ::Thrift::Types::SET, :name => 'struct_set', :element => {:type => ::Thrift::Types::STRUCT, :class => Empty}},
    BYTE_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_byte_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BYTE}},
    I16_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'i16_byte_map', :key => {:type => ::Thrift::Types::I16}, :value => {:type => ::Thrift::Types::BYTE}},
    I32_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'i32_byte_map', :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::BYTE}},
    I64_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'i64_byte_map', :key => {:type => ::Thrift::Types::I64}, :value => {:type => ::Thrift::Types::BYTE}},
    DOUBLE_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'double_byte_map', :key => {:type => ::Thrift::Types::DOUBLE}, :value => {:type => ::Thrift::Types::BYTE}},
    STRING_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'string_byte_map', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::BYTE}},
    BINARY_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'binary_byte_map', :key => {:type => ::Thrift::Types::STRING, :binary => true}, :value => {:type => ::Thrift::Types::BYTE}},
    BOOLEAN_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'boolean_byte_map', :key => {:type => ::Thrift::Types::BOOL}, :value => {:type => ::Thrift::Types::BYTE}},
    BYTE_I16_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_i16_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::I16}},
    BYTE_I32_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_i32_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::I32}},
    BYTE_I64_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_i64_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::I64}},
    BYTE_DOUBLE_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_double_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::DOUBLE}},
    BYTE_STRING_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_string_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::STRING}},
    BYTE_BINARY_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_binary_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::STRING, :binary => true}},
    BYTE_BOOLEAN_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_boolean_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BOOL}},
    LIST_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'list_byte_map', :key => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::BYTE}}, :value => {:type => ::Thrift::Types::BYTE}},
    SET_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'set_byte_map', :key => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::BYTE}}, :value => {:type => ::Thrift::Types::BYTE}},
    MAP_BYTE_MAP => {:type => ::Thrift::Types::MAP, :name => 'map_byte_map', :key => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BYTE}}, :value => {:type => ::Thrift::Types::BYTE}},
    BYTE_MAP_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_map_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::BYTE}}},
    BYTE_SET_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_set_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::BYTE}}},
    BYTE_LIST_MAP => {:type => ::Thrift::Types::MAP, :name => 'byte_list_map', :key => {:type => ::Thrift::Types::BYTE}, :value => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::BYTE}}}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class ExceptionWithAMap < ::Thrift::Exception
  include ::Thrift::Struct, ::Thrift::Struct_Union
  BLAH = 1
  MAP_FIELD = 2

  FIELDS = {
    BLAH => {:type => ::Thrift::Types::STRING, :name => 'blah'},
    MAP_FIELD => {:type => ::Thrift::Types::MAP, :name => 'map_field', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class BlowUp
  include ::Thrift::Struct, ::Thrift::Struct_Union
  B1 = 1
  B2 = 2
  B3 = 3
  B4 = 4

  FIELDS = {
    B1 => {:type => ::Thrift::Types::MAP, :name => 'b1', :key => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::I32}}, :value => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::STRING}}}},
    B2 => {:type => ::Thrift::Types::MAP, :name => 'b2', :key => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::I32}}, :value => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::STRING}}}},
    B3 => {:type => ::Thrift::Types::MAP, :name => 'b3', :key => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::I32}}, :value => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::STRING}}}},
    B4 => {:type => ::Thrift::Types::MAP, :name => 'b4', :key => {:type => ::Thrift::Types::LIST, :element => {:type => ::Thrift::Types::I32}}, :value => {:type => ::Thrift::Types::SET, :element => {:type => ::Thrift::Types::MAP, :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::STRING}}}}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class ReverseOrderStruct
  include ::Thrift::Struct, ::Thrift::Struct_Union
  FIRST = 4
  SECOND = 3
  THIRD = 2
  FOURTH = 1

  FIELDS = {
    FIRST => {:type => ::Thrift::Types::STRING, :name => 'first'},
    SECOND => {:type => ::Thrift::Types::I16, :name => 'second'},
    THIRD => {:type => ::Thrift::Types::I32, :name => 'third'},
    FOURTH => {:type => ::Thrift::Types::I64, :name => 'fourth'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class StructWithSomeEnum
  include ::Thrift::Struct, ::Thrift::Struct_Union
  BLAH = 1

  FIELDS = {
    BLAH => {:type => ::Thrift::Types::I32, :name => 'blah', :enum_class => SomeEnum}
  }

  def struct_fields; FIELDS; end

  def validate
    unless @blah.nil? || SomeEnum::VALID_VALUES.include?(@blah)
      raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field blah!')
    end
  end

  ::Thrift::Struct.generate_accessors self
end

class TestUnion < ::Thrift::Union
  include ::Thrift::Struct_Union
  class << self
    def string_field(val)
      TestUnion.new(:string_field, val)
    end

    def i32_field(val)
      TestUnion.new(:i32_field, val)
    end

    def struct_field(val)
      TestUnion.new(:struct_field, val)
    end

    def struct_list(val)
      TestUnion.new(:struct_list, val)
    end

    def other_i32_field(val)
      TestUnion.new(:other_i32_field, val)
    end

    def enum_field(val)
      TestUnion.new(:enum_field, val)
    end

    def i32_set(val)
      TestUnion.new(:i32_set, val)
    end

    def i32_map(val)
      TestUnion.new(:i32_map, val)
    end
  end

  STRING_FIELD = 1
  I32_FIELD = 2
  STRUCT_FIELD = 3
  STRUCT_LIST = 4
  OTHER_I32_FIELD = 5
  ENUM_FIELD = 6
  I32_SET = 7
  I32_MAP = 8

  FIELDS = {
    # A doc string
    STRING_FIELD => {:type => ::Thrift::Types::STRING, :name => 'string_field'},
    I32_FIELD => {:type => ::Thrift::Types::I32, :name => 'i32_field'},
    STRUCT_FIELD => {:type => ::Thrift::Types::STRUCT, :name => 'struct_field', :class => OneOfEach},
    STRUCT_LIST => {:type => ::Thrift::Types::LIST, :name => 'struct_list', :element => {:type => ::Thrift::Types::STRUCT, :class => RandomStuff}},
    OTHER_I32_FIELD => {:type => ::Thrift::Types::I32, :name => 'other_i32_field'},
    ENUM_FIELD => {:type => ::Thrift::Types::I32, :name => 'enum_field', :enum_class => SomeEnum},
    I32_SET => {:type => ::Thrift::Types::SET, :name => 'i32_set', :element => {:type => ::Thrift::Types::I32}},
    I32_MAP => {:type => ::Thrift::Types::MAP, :name => 'i32_map', :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::I32}}
  }

  def struct_fields; FIELDS; end

  def validate
    raise(StandardError, 'Union fields are not set.') if get_set_field.nil? || get_value.nil?
    if get_set_field == :enum_field
      raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field enum_field!') unless SomeEnum::VALID_VALUES.include?(get_value)
    end
  end

  ::Thrift::Union.generate_accessors self
end

class TestUnionMinusStringField < ::Thrift::Union
  include ::Thrift::Struct_Union
  class << self
    def i32_field(val)
      TestUnionMinusStringField.new(:i32_field, val)
    end

    def struct_field(val)
      TestUnionMinusStringField.new(:struct_field, val)
    end

    def struct_list(val)
      TestUnionMinusStringField.new(:struct_list, val)
    end

    def other_i32_field(val)
      TestUnionMinusStringField.new(:other_i32_field, val)
    end

    def enum_field(val)
      TestUnionMinusStringField.new(:enum_field, val)
    end

    def i32_set(val)
      TestUnionMinusStringField.new(:i32_set, val)
    end

    def i32_map(val)
      TestUnionMinusStringField.new(:i32_map, val)
    end
  end

  I32_FIELD = 2
  STRUCT_FIELD = 3
  STRUCT_LIST = 4
  OTHER_I32_FIELD = 5
  ENUM_FIELD = 6
  I32_SET = 7
  I32_MAP = 8

  FIELDS = {
    I32_FIELD => {:type => ::Thrift::Types::I32, :name => 'i32_field'},
    STRUCT_FIELD => {:type => ::Thrift::Types::STRUCT, :name => 'struct_field', :class => OneOfEach},
    STRUCT_LIST => {:type => ::Thrift::Types::LIST, :name => 'struct_list', :element => {:type => ::Thrift::Types::STRUCT, :class => RandomStuff}},
    OTHER_I32_FIELD => {:type => ::Thrift::Types::I32, :name => 'other_i32_field'},
    ENUM_FIELD => {:type => ::Thrift::Types::I32, :name => 'enum_field', :enum_class => SomeEnum},
    I32_SET => {:type => ::Thrift::Types::SET, :name => 'i32_set', :element => {:type => ::Thrift::Types::I32}},
    I32_MAP => {:type => ::Thrift::Types::MAP, :name => 'i32_map', :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::I32}}
  }

  def struct_fields; FIELDS; end

  def validate
    raise(StandardError, 'Union fields are not set.') if get_set_field.nil? || get_value.nil?
    if get_set_field == :enum_field
      raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Invalid value of field enum_field!') unless SomeEnum::VALID_VALUES.include?(get_value)
    end
  end

  ::Thrift::Union.generate_accessors self
end

class ComparableUnion < ::Thrift::Union
  include ::Thrift::Struct_Union
  class << self
    def string_field(val)
      ComparableUnion.new(:string_field, val)
    end

    def binary_field(val)
      ComparableUnion.new(:binary_field, val)
    end
  end

  STRING_FIELD = 1
  BINARY_FIELD = 2

  FIELDS = {
    STRING_FIELD => {:type => ::Thrift::Types::STRING, :name => 'string_field'},
    BINARY_FIELD => {:type => ::Thrift::Types::STRING, :name => 'binary_field', :binary => true}
  }

  def struct_fields; FIELDS; end

  def validate
    raise(StandardError, 'Union fields are not set.') if get_set_field.nil? || get_value.nil?
  end

  ::Thrift::Union.generate_accessors self
end

class StructWithAUnion
  include ::Thrift::Struct, ::Thrift::Struct_Union
  TEST_UNION = 1

  FIELDS = {
    TEST_UNION => {:type => ::Thrift::Types::STRUCT, :name => 'test_union', :class => TestUnion}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class PrimitiveThenStruct
  include ::Thrift::Struct, ::Thrift::Struct_Union
  BLAH = 1
  BLAH2 = 2
  BW = 3

  FIELDS = {
    BLAH => {:type => ::Thrift::Types::I32, :name => 'blah'},
    BLAH2 => {:type => ::Thrift::Types::I32, :name => 'blah2'},
    BW => {:type => ::Thrift::Types::STRUCT, :name => 'bw', :class => Backwards}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class StructWithASomemap
  include ::Thrift::Struct, ::Thrift::Struct_Union
  SOMEMAP_FIELD = 1

  FIELDS = {
    SOMEMAP_FIELD => {:type => ::Thrift::Types::MAP, :name => 'somemap_field', :key => {:type => ::Thrift::Types::I32}, :value => {:type => ::Thrift::Types::I32}}
  }

  def struct_fields; FIELDS; end

  def validate
    raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, 'Required field somemap_field is unset!') unless @somemap_field
  end

  ::Thrift::Struct.generate_accessors self
end

class BigFieldIdStruct
  include ::Thrift::Struct, ::Thrift::Struct_Union
  FIELD1 = 1
  FIELD2 = 45

  FIELDS = {
    FIELD1 => {:type => ::Thrift::Types::STRING, :name => 'field1'},
    FIELD2 => {:type => ::Thrift::Types::STRING, :name => 'field2'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

class BreaksRubyCompactProtocol
  include ::Thrift::Struct, ::Thrift::Struct_Union
  FIELD1 = 1
  FIELD2 = 2
  FIELD3 = 3

  FIELDS = {
    FIELD1 => {:type => ::Thrift::Types::STRING, :name => 'field1'},
    FIELD2 => {:type => ::Thrift::Types::STRUCT, :name => 'field2', :class => BigFieldIdStruct},
    FIELD3 => {:type => ::Thrift::Types::I32, :name => 'field3'}
  }

  def struct_fields; FIELDS; end

  def validate
  end

  ::Thrift::Struct.generate_accessors self
end

