syntax = "proto3";

message ObjectUnionExplicitPointer {
  repeated IPointer_lt_ObjectUnionExplicitPointer.Shape_gt_ value = 1;
  message Discriminator_lt__doublequote_point_doublequote__comma__space_ObjectUnionExplicitPointer {
    message IPoint_gt_ {
      required double x = 1;
      required double y = 2;
      required string type = 3;
    }
  }

  message Discriminator_lt__doublequote_line_doublequote__comma__space_ObjectUnionExplicitPointer {
    message ILine_gt_ {
      required ObjectUnionExplicitPointer.IPoint p1 = 1;
      required ObjectUnionExplicitPointer.IPoint p2 = 2;
      required string type = 3;
    }
  }

  message IPoint {
    required double x = 1;
    required double y = 2;
  }

  message Discriminator_lt__doublequote_triangle_doublequote__comma__space_ObjectUnionExplicitPointer {
    message ITriangle_gt_ {
      required ObjectUnionExplicitPointer.IPoint p1 = 1;
      required ObjectUnionExplicitPointer.IPoint p2 = 2;
      required ObjectUnionExplicitPointer.IPoint p3 = 3;
      required string type = 4;
    }
  }

  message Discriminator_lt__doublequote_rectangle_doublequote__comma__space_ObjectUnionExplicitPointer {
    message IRectangle_gt_ {
      required ObjectUnionExplicitPointer.IPoint p1 = 1;
      required ObjectUnionExplicitPointer.IPoint p2 = 2;
      required ObjectUnionExplicitPointer.IPoint p3 = 3;
      required ObjectUnionExplicitPointer.IPoint p4 = 4;
      required string type = 5;
    }
  }

  message Discriminator_lt__doublequote_polyline_doublequote__comma__space_ObjectUnionExplicitPointer {
    message IPolyline_gt_ {
      repeated ObjectUnionExplicitPointer.IPoint points = 1;
      required string type = 2;
    }
  }

  message Discriminator_lt__doublequote_polygon_doublequote__comma__space_ObjectUnionExplicitPointer {
    message IPolygon_gt_ {
      required ObjectUnionExplicitPointer.IPolyline outer = 1;
      repeated ObjectUnionExplicitPointer.IPolyline inner = 2;
      required string type = 3;
    }
  }

  message IPolyline {
    repeated ObjectUnionExplicitPointer.IPoint points = 1;
  }

  message Discriminator_lt__doublequote_circle_doublequote__comma__space_ObjectUnionExplicitPointer {
    message ICircle_gt_ {
      required ObjectUnionExplicitPointer.IPoint centroid = 1;
      required double radius = 2;
      required string type = 3;
    }
  }
}

message IPointer_lt_ObjectUnionExplicitPointer {
  message Shape_gt_ {
    oneof value {
      ObjectUnionExplicitPointer.Discriminator_lt__doublequote_point_doublequote__comma__space_ObjectUnionExplicitPointer.IPoint_gt_ v1 = 1;
      ObjectUnionExplicitPointer.Discriminator_lt__doublequote_line_doublequote__comma__space_ObjectUnionExplicitPointer.ILine_gt_ v2 = 2;
      ObjectUnionExplicitPointer.Discriminator_lt__doublequote_triangle_doublequote__comma__space_ObjectUnionExplicitPointer.ITriangle_gt_ v3 = 3;
      ObjectUnionExplicitPointer.Discriminator_lt__doublequote_rectangle_doublequote__comma__space_ObjectUnionExplicitPointer.IRectangle_gt_ v4 = 4;
      ObjectUnionExplicitPointer.Discriminator_lt__doublequote_polyline_doublequote__comma__space_ObjectUnionExplicitPointer.IPolyline_gt_ v5 = 5;
      ObjectUnionExplicitPointer.Discriminator_lt__doublequote_polygon_doublequote__comma__space_ObjectUnionExplicitPointer.IPolygon_gt_ v6 = 6;
      ObjectUnionExplicitPointer.Discriminator_lt__doublequote_circle_doublequote__comma__space_ObjectUnionExplicitPointer.ICircle_gt_ v7 = 7;
    }
  }
}