in smithy-model/src/main/java/software/amazon/smithy/model/loader/IdlModelParser.java [336:429]
private void parseShape(List<TraitEntry> traits) {
SourceLocation location = currentLocation();
// Do a check here to give better parsing error messages.
String shapeType = ParserUtils.parseIdentifier(this);
if (!SHAPE_TYPES.contains(shapeType)) {
switch (shapeType) {
case "use":
throw syntax("A use statement must come before any shape definition");
case "namespace":
throw syntax("Only a single namespace can be declared per/file");
case "metadata":
throw syntax("Metadata statements must appear before a namespace statement");
default:
throw syntax("Unexpected shape type: " + shapeType);
}
}
ws();
ShapeId id = parseShapeName();
switch (shapeType) {
case "service":
parseServiceStatement(id, location);
break;
case "resource":
parseResourceStatement(id, location);
break;
case "operation":
parseOperationStatement(id, location);
break;
case "structure":
parseStructuredShape(id, location, StructureShape.builder());
break;
case "union":
parseStructuredShape(id, location, UnionShape.builder());
break;
case "list":
parseCollection(id, location, ListShape.builder());
break;
case "set":
parseCollection(id, location, SetShape.builder());
break;
case "map":
parseMapStatement(id, location);
break;
case "boolean":
parseSimpleShape(id, location, BooleanShape.builder());
break;
case "string":
parseSimpleShape(id, location, StringShape.builder());
break;
case "blob":
parseSimpleShape(id, location, BlobShape.builder());
break;
case "byte":
parseSimpleShape(id, location, ByteShape.builder());
break;
case "short":
parseSimpleShape(id, location, ShortShape.builder());
break;
case "integer":
parseSimpleShape(id, location, IntegerShape.builder());
break;
case "long":
parseSimpleShape(id, location, LongShape.builder());
break;
case "float":
parseSimpleShape(id, location, FloatShape.builder());
break;
case "document":
parseSimpleShape(id, location, DocumentShape.builder());
break;
case "double":
parseSimpleShape(id, location, DoubleShape.builder());
break;
case "bigInteger":
parseSimpleShape(id, location, BigIntegerShape.builder());
break;
case "bigDecimal":
parseSimpleShape(id, location, BigDecimalShape.builder());
break;
case "timestamp":
parseSimpleShape(id, location, TimestampShape.builder());
break;
default:
// Unreachable.
throw syntax("Unexpected shape type: " + shapeType);
}
addTraits(id, traits);
clearPendingDocs();
br();
}