src/Service.GraphQLBuilder/Queries/EnumTypeBuilder.cs (71 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using Azure.DataApiBuilder.Service.GraphQLBuilder.Sql; using HotChocolate.Language; namespace Azure.DataApiBuilder.Service.GraphQLBuilder.Queries { public static class EnumTypeBuilder { private static readonly string _numericAggregateFieldsSuffix = "NumericAggregateFields"; private static readonly string _scalarFieldsSuffix = "ScalarFields"; /// <summary> /// Returns the numeric aggregate fields enum name for the given entity name. /// </summary> /// <param name="entityName">input entity name.</param> /// <returns>{entityName}NumericAggregateFields</returns> public static string GenerateNumericAggregateFieldsEnumName(string entityName) { return $"{entityName}{_numericAggregateFieldsSuffix}"; } /// <summary> /// Returns the scalar fields enum name for the given entity name. /// </summary> /// <param name="entityName">input entity name.</param> /// <returns>{entityName}ScalarFields</returns> public static string GenerateScalarFieldsEnumName(string entityName) { return $"{entityName}{_scalarFieldsSuffix}"; } /// <summary> /// Generates an enum type for fields of the given object type based on a field selector. /// </summary> /// <param name="node">The object type definition node.</param> /// <param name="enumTypes">Dictionary to store the generated enum types.</param> /// <param name="fieldSelector">Function to select which fields to include in the enum.</param> /// <param name="enumNameSuffix">Suffix to append to the enum type name.</param> /// <param name="description">Description for the generated enum type.</param> /// <returns>True if the enum type was generated, false otherwise.</returns> public static bool TryGenerateEnum( ObjectTypeDefinitionNode node, IDictionary<string, EnumTypeDefinitionNode> enumTypes, Func<FieldDefinitionNode, bool> fieldSelector, string enumNameSuffix, string description) { List<FieldDefinitionNode> selectedFields = node.Fields.Where(fieldSelector).ToList(); if (selectedFields.Any()) { string enumTypeName = $"{node.Name.Value}{enumNameSuffix}"; EnumTypeDefinitionNode enumType = new( location: null, name: new NameNode(enumTypeName), description: new StringValueNode(string.Format(description, node.Name.Value)), directives: new List<DirectiveNode>(), values: selectedFields .Select(f => new EnumValueDefinitionNode( location: null, name: f.Name, description: null, directives: new List<DirectiveNode>() )).ToList() ); enumTypes.Add(enumTypeName, enumType); return true; } return false; } /// <summary> /// Generates an enum type containing numeric fields for aggregation. /// </summary> public static bool GenerateAggregationNumericEnumForObjectType( ObjectTypeDefinitionNode node, IDictionary<string, EnumTypeDefinitionNode> enumTypes) { return TryGenerateEnum( node, enumTypes, f => SchemaConverter.IsNumericField(f.Type), _numericAggregateFieldsSuffix, "Fields available for aggregation in {0}" ); } /// <summary> /// Generates an enum type containing all scalar fields. /// </summary> public static bool GenerateScalarFieldsEnumForObjectType( ObjectTypeDefinitionNode node, IDictionary<string, EnumTypeDefinitionNode> enumTypes) { return TryGenerateEnum( node, enumTypes, f => GraphQLUtils.IsBuiltInType(f.Type), _scalarFieldsSuffix, "Scalar fields available in {0}" ); } } }