private void WriteKeywordDefinitionBody(string armKey, TypeBase schema, int arrayDepth) { switch (schema) { case ArrayType array: WriteKeywordDefinitionBody(armKey, array, arrayDepth); return; case BuiltInType builtin: WriteKeywordDefinitionBody(armKey, builtin, arrayDepth); return; case DiscriminatedObjectType discriminatedType: WriteKeywordDefinitionBody(armKey, discriminatedType, arrayDepth); return; case ObjectType objectType: WriteKeywordDefinitionBody(armKey, objectType, arrayDepth); return; case ResourceType resource: WriteKeywordDefinitionBody(armKey, resource, arrayDepth); return; case StringLiteralType stringLiteral: WriteKeywordDefinitionBody(armKey, stringLiteral, arrayDepth); return; case UnionType union: WriteKeywordDefinitionBody(armKey, union, arrayDepth); return; default: throw new ArgumentException($"Unknown resource schema type: {schema.GetType()}"); } }
private IReadOnlyDictionary <string, DslKeywordSchema> BuildDiscriminatedKeywordDictionary(string discriminatorValue) { TypeBase discriminatedType = BicepType.Elements[discriminatorValue].Type; if (discriminatedType is not ObjectType objectType) { throw new ArgumentException($"Discriminated schema element has non-object type '{discriminatedType.GetType()}'"); } var dict = new Dictionary <string, DslKeywordSchema>(_commonKeywords.Value, StringComparer.OrdinalIgnoreCase); foreach (KeyValuePair <string, ObjectProperty> discriminatedProperty in objectType.Properties) { dict[discriminatedProperty.Key] = BicepKeywordSchemaBuilder.GetKeywordSchemaForBicepType(discriminatedProperty.Value.Type.Type); } return(dict); }
private bool TryGetObjectSchema(TypeBase typeBase, out ObjectType objectType) { if (typeBase is null) { objectType = null; return(false); } if (typeBase is ObjectType obj) { objectType = obj; return(true); } throw new ArgumentException($"Expected ObjectType schema but instead got schema of type '{typeBase.GetType()}'"); }
private void WriteDiscriminatedKeywordDefinitions(string discriminatorVariable, string discriminatorKey, IReadOnlyDictionary <string, ITypeReference> discriminatedElements) { // Conditionally define the functions in a switch statement if (discriminatedElements.Count == 0) { return; } _writer .WriteLine() .Write("switch (") .WriteVariable(discriminatorVariable) .Write(")") .OpenBlock(); bool needNewline = false; foreach (KeyValuePair <string, ITypeReference> discriminatedSchemaEntry in discriminatedElements) { if (needNewline) { _writer.WriteLine(); } TypeBase discriminatedSchema = discriminatedSchemaEntry.Value.Type; switch (discriminatedSchema) { case ObjectType objectType: if (objectType.Properties.Count == 0) { continue; } _writer.WriteValue(discriminatedSchemaEntry.Key) .OpenBlock(); foreach (KeyValuePair <string, ObjectProperty> discriminatedProperty in objectType.Properties) { if (discriminatedProperty.Key.Equals(discriminatorKey)) { continue; } if (needNewline) { _writer.WriteLine(); } WriteKeywordDefinition(discriminatedProperty.Key, discriminatedProperty.Value.Type.Type); needNewline = true; } _writer .WriteLine() .Write("break") .CloseBlock(); break; default: throw new InvalidOperationException($"Unsupported discriminated schema entry of type '{discriminatedSchema.GetType()}'"); } needNewline = true; } _writer .CloseBlock() .WriteLine(); }