public IOData Process(IOData input, MimeLanguage preferredOutput)
        {
            _log.Debug("Processing Output...");
            //return new IOData("application/vnd.limitless.intent+json", "asdsad");
            if (preferredOutput.Language == "en-ZA")
            {
                return(new IOData(new MimeLanguage("text/plain", "en-ZA"), input.Data + " to ZA"));
            }
            if (preferredOutput.Language == "en-GB")
            {
                return(new IOData(new MimeLanguage("text/plain", "en-GB"), input.Data + " to GB"));
            }

            return(new IOData(new MimeLanguage("text/plain", "en"), input.Data + " EN"));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Recursively processes the input until a usable data type is extracted
        /// or LimitlessSettings MaxResolveAttempts is reached
        /// </summary>
        /// <param name="input">The input data</param>
        /// <param name="preferredOutput">The preferred output Mime and Language</param>
        /// <param name="providers">The providers available to process input</param>
        /// <param name="resolveAttempts">The maximum attempts to extract usable data from input</param>
        /// <returns>The processed data from the pipeline</returns>
        private IOData Resolve(IOData input, MimeLanguage preferredOutput, List <IIOProcessor> providers, int resolveAttempts = 0)
        {
            /* Resolving the input provider to use happens in the following order
             * 1. Use the first provider that matches both input and preferredOutput
             * 2. Use the first provider that matches input and preferredOutput.Language[0,2]
             * 3. Use the first provider that matches input.Language[0,2] and preferredOutput.Language[0,2]
             * 4. Use the first provider that matched input and output Mimes
             * 5. Fail
             */

            // TODO: Add support for wildcard mime and language */*
            // Get a copy of the list so that we don't change the instance list
            providers = new List <IIOProcessor>(providers);
            if (resolveAttempts >= CoreContainer.Instance.Settings.Core.MaxResolveAttempts)
            {
                throw new NotSupportedException("Maximum attempts reached for providing data in the preferred format");
            }

            //Use the first provider that matches both input and preferredOutput
            var availableProviders = providers.Where(
                x => x.GetSupportedIOCombinations().Count
                (
                    y => y.SupportedInput.Mime == input.MimeLanguage.Mime && y.SupportedInput.Language == input.MimeLanguage.Language &&
                    y.SupportedOutput.Mime == preferredOutput.Mime && y.SupportedOutput.Language == preferredOutput.Language
                ) > 0);

            if (availableProviders.Count <IIOProcessor>() == 0)
            {
                availableProviders = providers.Where(
                    x => x.GetSupportedIOCombinations().Count
                    (
                        y => y.SupportedInput.Mime == input.MimeLanguage.Mime && y.SupportedInput.Language == input.MimeLanguage.Language &&
                        y.SupportedOutput.Mime == preferredOutput.Mime && y.SupportedOutput.Language == preferredOutput.Language.Substring(0, 2)
                    ) > 0);
            }
            if (availableProviders.Count <IIOProcessor>() == 0)
            {
                availableProviders = providers.Where(
                    x => x.GetSupportedIOCombinations().Count
                    (
                        y => y.SupportedInput.Mime == input.MimeLanguage.Mime && y.SupportedInput.Language == input.MimeLanguage.Language.Substring(0, 2) &&
                        y.SupportedOutput.Mime == preferredOutput.Mime && y.SupportedOutput.Language == preferredOutput.Language.Substring(0, 2)
                    ) > 0);
            }
            if (availableProviders.Count <IIOProcessor>() == 0)
            {
                availableProviders = providers.Where(
                    x => x.GetSupportedIOCombinations().Count
                    (
                        y => y.SupportedInput.Mime == input.MimeLanguage.Mime && y.SupportedOutput.Mime == preferredOutput.Mime
                    ) > 0);
            }
            // Nothing matched
            if (availableProviders.Count <IIOProcessor>() == 0)
            {
                _log.Trace($"No provider available for input types '{input.MimeLanguage}' providing output types '{preferredOutput}'. Returning current");
                return(input);
            }

            _log.Trace($"Found {availableProviders.Count<IIOProcessor>()} provider(s) for input {input.MimeLanguage} and output {preferredOutput}");

            var provider = availableProviders.First();

            // After process is done the output becomes the
            // input for the next provider
            input = provider.Process(input, preferredOutput);
            if (input == null)
            {
                throw new NullReferenceException($"Provider '{provider.GetType().Name}' returned a null result for input '{input.MimeLanguage}'");
            }

            resolveAttempts++;
            if (providers.Remove(provider))
            {
                Resolve(input, preferredOutput, providers, resolveAttempts);
            }
            else
            {
                throw new InvalidOperationException($"The provider '{provider.GetType().Name}' could not be removed from the available list");
            }

            // In theory this will never be reached
            // Why?
            //  If the mime type is not supported, we return
            //  If the output is null, we return
            return(input);
        }