Example #1
0
        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()}");
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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()}'");
        }
Example #4
0
        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();
        }