/**
         * Load config files and append roots as required.
         */
        public ConfigInclusionRules LoadConfigFiles(List <string> files, CompilerArguments arguments)
        {
            ConfigInclusionRules config = new ConfigInclusionRules();

            foreach (string file in files)
            {
                // Get the full path to the config file
                string fullPath = Path.GetFullPath(file);

                // Parse the config file as JSON
                JObject jsonConfig;
                try
                {
                    jsonConfig = JObject.Parse(File.ReadAllText(fullPath));
                }
                catch (Newtonsoft.Json.JsonReaderException e)
                {
                    throw new ConfigFileInvalidException("Invalid JSON in " + fullPath + ": " + e.Message);
                }
                catch (FileNotFoundException)
                {
                    throw new ConfigFileInvalidException("Config file not found");
                }

                includeLoader.LoadConfig(config, jsonConfig, fullPath);
                optionsLoader.LoadOptions(arguments, jsonConfig, fullPath);
            }

            return(config);
        }
        public void LoadConfig(
            ConfigInclusionRules inclusionRules,
            JObject jsonConfig,
            string fileName
            )
        {
            // Load airport data
            JToken airportData = jsonConfig.SelectToken("includes.airports");

            if (airportData != null)
            {
                IterateAirportConfig(airportData, inclusionRules, fileName);
            }

            // Load enroute data
            JToken enrouteData = jsonConfig.SelectToken("includes.enroute");

            if (enrouteData != null)
            {
                IterateConfigFileSections(
                    enrouteData,
                    EnrouteConfigFileSections.ConfigFileSections,
                    OutputGroupFactory.CreateEnroute,
                    x => inclusionRules.AddEnrouteInclusionRule(x),
                    GetFolderForConfigFile(fileName),
                    "enroute"
                    );
            }

            // Load misc data
            JToken miscData = jsonConfig.SelectToken("includes.misc");

            if (miscData != null)
            {
                IterateConfigFileSections(
                    miscData,
                    MiscConfigFileSections.ConfigFileSections,
                    OutputGroupFactory.CreateMisc,
                    x => inclusionRules.AddMiscInclusionRule(x),
                    GetFolderForConfigFile(fileName),
                    "misc"
                    );
            }
        }
        /**
         * Airports are special as there are many folders to go through for things and in some
         * cases we might want to exclude certain files from airports. So iterate through
         * each configuration of airports.
         */
        private void IterateAirportConfig(
            JToken airportConfig,
            ConfigInclusionRules config,
            string configFilePath
            )
        {
            if (airportConfig.Type != JTokenType.Object)
            {
                throw new ConfigFileInvalidException(
                          $"Invalid airport config in {configFilePath} must be an object"
                          );
            }

            foreach (KeyValuePair <string, JToken> configItem in (JObject)airportConfig)
            {
                if (configItem.Value.Type != JTokenType.Object)
                {
                    throw new ConfigFileInvalidException(
                              $"Invalid airport config[{configItem.Key}] in {configFilePath} must be an object"
                              );
                }

                // Get the airport folders
                string   configFileFolder = GetFolderForConfigFile(configFilePath);
                string[] directories      = Directory.GetDirectories(configFileFolder + Path.DirectorySeparatorChar + configItem.Key);

                // For each airport, iterate the config file sections
                foreach (string directory in directories)
                {
                    IterateConfigFileSections(
                        configItem.Value,
                        AirfieldConfigFileSections.ConfigFileSections,
                        x => OutputGroupFactory.CreateAirport(x, Path.GetFileName(directory)),
                        config.AddAirportInclusionRule,
                        directory,
                        "airport"
                        );
                }
            }
        }