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")); }
/// <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); }