/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

namespace rb SpecNamespace

struct Hello {
  1: string greeting = "hello world"
}

enum SomeEnum {
  ONE
  TWO
}

struct StructWithSomeEnum {
  1: SomeEnum some_enum;
}

union TestUnion {
  /**
   * A doc string
   */
  1: string string_field;
  2: i32 i32_field;
  3: i32 other_i32_field;
  4: SomeEnum enum_field;
  5: binary binary_field;
  6: uuid uuid_field;
}

struct Foo {
  1: i32 simple = 53,
  2: string words = "words",
  3: Hello hello = {'greeting' : "hello, world!"},
  4: list<i32> ints = [1, 2, 2, 3],
  5: map<i32, map<string, double>> complex,
  6: set<i16> shorts = [5, 17, 239],
  7: optional string opt_string
  8: bool my_bool
  9: optional uuid opt_uuid
}

struct Foo2 {
  1: binary my_binary
}

struct BoolStruct {
  1: bool yesno = 1
}

struct SimpleList {
  1: list<bool> bools,
  2: list<byte> bytes,
  3: list<i16> i16s,
  4: list<i32> i32s,
  5: list<i64> i64s,
  6: list<double> doubles,
  7: list<string> strings,
  8: list<map<i16, i16>> maps,
  9: list<list<i16>> lists,
  10: list<set<i16>> sets,
  11: list<Hello> hellos,
  12: list<uuid> uuids
}

exception Xception {
  1: string message,
  2: i32 code = 1
}

service NonblockingService {
  Hello greeting(1:bool english)
  bool block()
  oneway void unblock(1:i32 n)
  oneway void shutdown()
  void sleep(1:double seconds)
}

union My_union {
  1: bool im_true,
  2: byte a_bite,
  3: i16 integer16,
  4: i32 integer32,
  5: i64 integer64,
  6: double double_precision,
  7: string some_characters,
  8: i32 other_i32
  9: SomeEnum some_enum;
  10: map<SomeEnum, list<SomeEnum>> my_map;
  11: uuid unique_id;
}

struct Struct_with_union {
  1: My_union fun_union
  2: i32 integer32
  3: string some_characters
}

struct StructWithEnumMap {
  1: map<SomeEnum, list<SomeEnum>> my_map;
}

# Nested lists
struct NestedListInList {
  1: list<list<byte>> value
}

struct NestedListInSet {
  1: set<list<byte>> value
}

struct NestedListInMapKey {
  1: map<list<byte>, byte> value
}

struct NestedListInMapValue {
  1: map<byte, list<byte>> value
}

# Nested sets
struct NestedSetInList {
  1: list<set<byte>> value
}

struct NestedSetInSet {
  1: set<set<byte>> value
}

struct NestedSetInMapKey {
  1: map<set<byte>, byte> value
}

struct NestedSetInMapValue {
  1: map<byte, set<byte>> value
}

# Nested maps
struct NestedMapInList {
  1: list<map<byte, byte>> value
}

struct NestedMapInSet {
  1: set<map<byte, byte>> value
}

struct NestedMapInMapKey {
  2: map<map<byte, byte>, byte> value
}

struct NestedMapInMapValue {
  2: map<byte, map<byte, byte>> value
}

# Recursive types for the struct/union/exception recursion-depth limit specs (THRIFT-6045).
struct RecTree {
  1: list<RecTree> children
  2: i16 item
}

union RecUnion {
  1: list<RecUnion> children
  2: i32 leaf
}

exception RecError {
  1: list<RecError> children
  2: i32 leaf
}
