public bool IsOptionSettingModified()

in src/AWS.Deploy.Orchestration/OptionSettingHandler.cs [367:435]


        public bool IsOptionSettingModified(Recommendation recommendation, OptionSettingItem optionSetting)
        {
            // If the option setting is not displayable, that means its dependencies are not satisfied and it does not play any role in the deployment.
            // We do not need to evaluate whether it has been modified or not.
            if (!IsOptionSettingDisplayable(recommendation, optionSetting))
            {
                return false;
            }

            if (optionSetting.Type.Equals(OptionSettingValueType.List))
            {
                var currentSet = GetOptionSettingValue<SortedSet<string>>(recommendation, optionSetting) ?? new SortedSet<string>();
                var defaultSet = GetOptionSettingDefaultValue<SortedSet<string>>(recommendation, optionSetting) ?? new SortedSet<string>();

                // return true if both have different lengths or all elements in currentSet are not present in defaultSet
                return defaultSet.Count != currentSet.Count || !currentSet.All(x => defaultSet.Contains(x));
            }

            if (optionSetting.Type.Equals(OptionSettingValueType.KeyValue))
            {
                var currentDict = GetOptionSettingValue<Dictionary<string, string>>(recommendation, optionSetting) ?? new Dictionary<string, string>();
                var defaultDict = GetOptionSettingDefaultValue<Dictionary<string, string>>(recommendation, optionSetting) ?? new Dictionary<string, string>();

                // return true if both have different lengths or all keyValue pairs are not equal between currentDict and defaultDict
                return defaultDict.Count != currentDict.Count ||
                    !currentDict.All(keyPair => defaultDict.ContainsKey(keyPair.Key) && string.Equals(defaultDict[keyPair.Key], currentDict[keyPair.Key]));
            }

            if (optionSetting.Type.Equals(OptionSettingValueType.Int))
            {
                var currentValue = GetOptionSettingValue<int>(recommendation, optionSetting);
                var defaultValue = GetOptionSettingDefaultValue<int>(recommendation, optionSetting);
                return defaultValue != currentValue;
            }

            if (optionSetting.Type.Equals(OptionSettingValueType.Double))
            {
                var currentValue = GetOptionSettingValue<double>(recommendation, optionSetting);
                var defaultValue = GetOptionSettingDefaultValue<double>(recommendation, optionSetting);
                return defaultValue != currentValue;
            }

            if (optionSetting.Type.Equals(OptionSettingValueType.Bool))
            {
                var currentValue = GetOptionSettingValue<bool>(recommendation, optionSetting);
                var defaultValue = GetOptionSettingDefaultValue<bool>(recommendation, optionSetting);
                return defaultValue != currentValue;
            }

            if (optionSetting.Type.Equals(OptionSettingValueType.String))
            {
                var currentValue = GetOptionSettingValue<string>(recommendation, optionSetting);
                var defaultValue = GetOptionSettingDefaultValue<string>(recommendation, optionSetting);

                if (string.IsNullOrEmpty(currentValue) && string.IsNullOrEmpty(defaultValue))
                    return false;

                return !string.Equals(currentValue, defaultValue);
            }

            // The option setting is of type Object and it has nested child settings.
            // return true is any of the child settings are modified.
            foreach (var childSetting in optionSetting.ChildOptionSettings)
            {
                if (IsOptionSettingModified(recommendation, childSetting))
                    return true;
            }
            return false;
        }