private bool LoadSources()

in Amazon.KinesisTap.DiagnosticTool.Core/ConfigValidator.cs [117:194]


        private bool LoadSources(IDictionary<string, string> sources, IConfigurationRoot config, IList<string> messages)
        {
            var sourcesSection = config.GetSection("Sources");
            var sourceSections = sourcesSection.GetChildren();

            foreach (var sourceSection in sourceSections)
            {
                string id = sourceSection["Id"];
                string sourceType = sourceSection["SourceType"];
                string initialPosition = sourceSection["InitialPosition"];

                ISourceValidator sourceValidator;
                if (sourceType.Equals("DirectorySource"))
                {
                    if (_sourceValidators.TryGetValue("DirectorySource", out sourceValidator))
                    {
                        if (!sourceValidator.ValidateSource(sourceSection, id, messages))
                        {
                            return false;
                        }
                    }
                }
                else if (sourceType.Equals("WindowsEventLogSource"))
                {
                    if (_sourceValidators.TryGetValue("WindowsEventLogSource", out sourceValidator))
                    {
                        if (!sourceValidator.ValidateSource(sourceSection, id, messages))
                        {
                            return false;
                        }
                    }
                }
                else if (sourceType.Equals("WindowsPerformanceCounterSource"))
                {
                    if (_sourceValidators.TryGetValue("WindowsPerformanceCounterSource", out sourceValidator))
                    {
                        if (!sourceValidator.ValidateSource(sourceSection, id, messages))
                        {
                            return false;
                        }
                    }
                }

                if (!string.IsNullOrEmpty(initialPosition))
                {
                    initialPosition = initialPosition.ToLower();
                    if (!_initialPositions.Contains(initialPosition))
                    {
                        messages.Add($"{initialPosition} is not a valid InitialPosition in source ID: {id}.");
                        return false;
                    }

                    if (initialPosition.Equals("timestamp"))
                    {
                        string initialPositionTimestamp = sourceSection["InitialPositionTimestamp"];
                        if (string.IsNullOrEmpty(initialPositionTimestamp))
                        {
                            messages.Add($"InitialPosition 'Timestamp' is required in source ID: {id}.");
                            return false;
                        }
                        else
                        {
                            string timestampFormat = "yyyy-MM-dd HH:mm:ss.ffff";
                            if (!DateTime.TryParseExact(initialPositionTimestamp, timestampFormat, new CultureInfo("en-US"),
                                DateTimeStyles.None, out DateTime expectedDate))
                            {
                                messages.Add($"Timestamp doesn't match the DateTime format: {timestampFormat} in source {id}.");
                                return false;
                            }
                        }
                    }
                }

                sources.Add(id, sourceType);
            }

            return true;
        }