public async ValueTask ConvertAsync()

in src/DotNetWorker.Core/Context/Features/DefaultInputConversionFeature.cs [39:90]


        public async ValueTask<ConversionResult> ConvertAsync(ConverterContext converterContext)
        {
            // Check a converter is explicitly specified via the converter context. If so, use that.
            IInputConverter? converterFromContext = GetConverterFromContext(converterContext);

            if (converterFromContext is not null)
            {
                var conversionResult = await ConvertAsyncUsingConverter(converterFromContext, converterContext);

                if (conversionResult.Status != ConversionStatus.Unhandled)
                {
                    return conversionResult;
                }
            }

            // Get all converters advertised by the Binding Attribute along with supported types by each converter
            Dictionary<IInputConverter, List<Type>>? advertisedConverterTypes = GetExplicitConverterTypes(converterContext);

            if (advertisedConverterTypes is not null)
            {
                foreach (var converterType in advertisedConverterTypes)
                {
                    if (IsTargetTypeSupportedByConverter(converterType.Value, converterContext.TargetType))
                    {
                        var conversionResult = await ConvertAsyncUsingConverter(converterType.Key, converterContext);

                        if (conversionResult.Status != ConversionStatus.Unhandled)
                        {
                            return conversionResult;
                        }
                    }
                }
            }

            if (IsConverterFallbackAllowed(converterContext))
            {
                // Use the registered converters. The first converter which can handle the conversion wins.
                foreach (var converter in _inputConverterProvider.RegisteredInputConverters)
                {
                    var conversionResult = await ConvertAsyncUsingConverter(converter, converterContext);

                    if (conversionResult.Status != ConversionStatus.Unhandled)
                    {
                        return conversionResult;
                    }

                    // If "Status" is Unhandled, we move on to the next converter and try to convert with that.
                }
            }

            return ConversionResult.Unhandled();
        }