# Copyright (c) 2018 Cloudflare, Inc. and contributors
# Licensed under the MIT License:
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

@0xc9d405cf4333e4c9;

using Json = import "/capnp/compat/json.capnp";

$import "/capnp/c++.capnp".namespace("capnp");

struct TestJsonAnnotations {
  someField @0 :Text $Json.name("names-can_contain!anything Really");

  aGroup :group $Json.flatten() {
    flatFoo @1 :UInt32;
    flatBar @2 :Text;
    flatBaz :group $Json.name("renamed-flatBaz") {
      hello @3 :Bool;
    }
    doubleFlat :group $Json.flatten() {
      flatQux @4 :Text;
    }
  }

  prefixedGroup :group $Json.flatten(prefix = "pfx.") {
    foo @5 :Text;
    bar @6 :UInt32 $Json.name("renamed-bar");
    baz :group {
      hello @7 :Bool;
    }
    morePrefix :group $Json.flatten(prefix = "xfp.") {
      qux @8 :Text;
    }
  }

  aUnion :union $Json.flatten() $Json.discriminator(name = "union-type") {
    foo :group $Json.flatten() {
      fooMember @9 :Text;
      multiMember @10 :UInt32;
    }
    bar :group $Json.flatten() $Json.name("renamed-bar") {
      barMember @11 :UInt32;
      multiMember @12 :Text;
    }
  }

  dependency @13 :TestJsonAnnotations2;
  # To test that dependencies are loaded even if not flattened.

  simpleGroup :group {
    # To test that group types are loaded even if not flattened.
    grault @14 :Text $Json.name("renamed-grault");
  }

  enums @15 :List(TestJsonAnnotatedEnum);

  innerJson @16 :Json.Value;

  customFieldHandler @17 :Text;

  testBase64 @18 :Data $Json.base64;
  testHex @19 :Data $Json.hex;

  bUnion :union $Json.flatten() $Json.discriminator(valueName = "bValue") {
    foo @20 :Text;
    bar @21 :UInt32 $Json.name("renamed-bar");
  }

  externalUnion @22 :TestJsonAnnotations3;

  unionWithVoid :union $Json.discriminator(name = "type") {
    intValue @23 :UInt32;
    voidValue @24 :Void;
    textValue @25 :Text;
  }
}

struct TestJsonAnnotations2 {
  foo @0 :Text $Json.name("renamed-foo");
  cycle @1 :TestJsonAnnotations;
}

struct TestJsonAnnotations3 $Json.discriminator(name = "type") {
  union {
    foo @0 :UInt32;
    bar @1 :TestFlattenedStruct $Json.flatten();
  }
}

struct TestFlattenedStruct {
  value @0 :Text;
}

enum TestJsonAnnotatedEnum {
  foo @0;
  bar @1 $Json.name("renamed-bar");
  baz @2 $Json.name("renamed-baz");
  qux @3;
}