public class HttpTriggerAttribute()

in PluginsAndFeatures/azure-toolkit-for-rider/src/dotnet/ReSharper.Azure/Azure.Psi/FunctionApp/HttpTriggerAttribute.cs [11:90]


public class HttpTriggerAttribute(IAttributeInstance attributeInstance)
{
    private static readonly ILogger OurLogger = Logger.GetLogger(typeof(HttpTriggerAttribute));
    
    private static readonly ClrTypeName DefaultWorkerName = new("Microsoft.Azure.WebJobs.HttpTriggerAttribute");
    private static readonly ClrTypeName IsolatedWorkerName = new("Microsoft.Azure.Functions.Worker.HttpTriggerAttribute");

    public static IEnumerable<string> Names { get; } = [DefaultWorkerName.FullName, IsolatedWorkerName.FullName];
    
    public static HttpTriggerAttribute? Get(IParameter parameter)
    {
        var httpTriggerAttributes = parameter.GetAttributeInstances(DefaultWorkerName, false)
            .Union(parameter.GetAttributeInstances(IsolatedWorkerName, false))
            .ToList();

        if (httpTriggerAttributes.IsEmpty())
        {
            if (OurLogger.IsTraceEnabled())
            {
                OurLogger.Trace($"No HttpTriggerAttribute was found for parameter '{parameter.ShortName}'.");
            }

            return null;
        }

        if (httpTriggerAttributes.Count > 1)
        {
            OurLogger.Info(
                $"Found more than one HttpTriggerAttribute attribute for parameter '{parameter.ShortName}'. Return the first match.");
        }

        return new HttpTriggerAttribute(httpTriggerAttributes.First());
    }

    public HttpTriggerAttributeProperties RetrieveProperties()
    {
        var httpTriggerAttributeProperties = new HttpTriggerAttributeProperties();

        // Try with positional parameters (known signatures)
        var positionParameters = attributeInstance.PositionParameters().ToArray();
        if (positionParameters.Length == 1 && positionParameters[0].IsArray)
        {
            // HttpTriggerAttribute(params string[] methods)
            httpTriggerAttributeProperties.Methods =
                positionParameters[0].ArrayValue?.Select(it => it.ConstantValue.StringValue).AsArray();
        }
        else if (positionParameters.Length == 1)
        {
            // HttpTriggerAttribute(AuthLevel AuthLevel)
            httpTriggerAttributeProperties.AuthLevel = positionParameters[0].ConstantValue.AsString();
        }
        else if (positionParameters.Length == 2 && positionParameters[1].IsArray)
        {
            // HttpTriggerAttribute(AuthLevel, params string[] methods)
            httpTriggerAttributeProperties.AuthLevel = positionParameters[0].ConstantValue.AsString();
            httpTriggerAttributeProperties.Methods =
                positionParameters[1].ArrayValue?.Select(it => it.ConstantValue.StringValue).AsArray();
        }

        // Try with named parameters
        foreach (var (name, value) in attributeInstance.NamedParameters())
        {
            if (string.Equals(name, "Route", StringComparison.OrdinalIgnoreCase) && value.IsConstant)
            {
                httpTriggerAttributeProperties.Route = value.ConstantValue.StringValue;
            }
            else if (string.Equals(name, "Methods", StringComparison.OrdinalIgnoreCase) && value.IsArray)
            {
                httpTriggerAttributeProperties.Methods =
                    value.ArrayValue?.Select(it => it.ConstantValue.StringValue).AsArray();
            }
            else if (string.Equals(name, "AuthLevel", StringComparison.OrdinalIgnoreCase))
            {
                httpTriggerAttributeProperties.AuthLevel = value.ConstantValue.AsString();
            }
        }

        return httpTriggerAttributeProperties;
    }
}