bin/projects/dbatools/dbatools/Configuration/Config.cs

using System;
using System.Management.Automation;

namespace Sqlcollaborative.Dbatools.Configuration
{
    /// <summary>
    /// Configuration Manager as well as individual configuration object.
    /// </summary>
    [Serializable]
    public class Config
    {
        /// <summary>
        /// The Name of the setting
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// The full name of the configuration entry, comprised of both Module and Name.
        /// </summary>
        public string FullName
        {
            get { return Module + "." + Name; }
        }

        /// <summary>
        /// The module of the setting. Helps being able to group configurations.
        /// </summary>
        public string Module { get; set; }

        /// <summary>
        /// A description of the specific setting
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// The data type of the value stored in the configuration element.
        /// </summary>
        public string Type
        {
            get
            {
                if (Value == null)
                    return null;
                return Value.GetType().FullName;
            }
        }

        /// <summary>
        /// The value stored in the configuration element
        /// </summary>
        public Object Value { get; set; }

        /// <summary>
        /// The handler script that is run whenever the configuration value is set.
        /// </summary>
        public ScriptBlock Handler { get; set; }

        /// <summary>
        /// Validates the user input
        /// </summary>
        public ScriptBlock Validation { get; set; }

        /// <summary>
        /// Setting this to true will cause the element to not be discovered unless using the '-Force' parameter on "Get-DbaConfig"
        /// </summary>
        public bool Hidden { get; set; }

        /// <summary>
        /// Whether the setting has been initialized. This handles module imports and avoids modules overwriting settings when imported in multiple runspaces.
        /// </summary>
        public bool Initialized { get; set; }

        /// <summary>
        /// Whether this setting was set by policy
        /// </summary>
        public bool PolicySet { get; set; }

        /// <summary>
        /// Whether this setting was set by policy and forbids deletion.
        /// </summary>
        public bool PolicyEnforced
        {
            get { return _PolicyEnforced; }
            set
            {
                if (_PolicyEnforced == false) { _PolicyEnforced = value; }
            }
        }
        private bool _PolicyEnforced = false;

        /// <summary>
        /// The finalized value to put into the registry value when using policy to set this setting.
        /// </summary>
        public string RegistryData
        {
            get
            {
                switch (Type)
                {
                    case "System.Boolean":
                        if ((bool)Value)
                            return "bool:true";
                        return "bool:false";
                    case "System.Int16":
                        return String.Format("int:{0}", Value);
                    case "System.Int32":
                        return String.Format("int:{0}", Value);
                    case "System.Int64":
                        return String.Format("long:{0}", Value);
                    case "System.UInt16":
                        return String.Format("int:{0}", Value);
                    case "System.UInt32":
                        return String.Format("long:{0}", Value);
                    case "System.UInt64":
                        return String.Format("long:{0}", Value);
                    case "System.Double":
                        return String.Format("double:{0}", Value);
                    case "System.String":
                        return String.Format("string:{0}", Value);
                    case "System.TimeSpan":
                        return String.Format("timespan:{0}", ((TimeSpan)Value).Ticks);
                    case "System.DateTime":
                        return String.Format("datetime:{0}", ((DateTime)Value).Ticks);
                    case "System.ConsoleColor":
                        return String.Format("consolecolor:{0}", Value);
                    default:
                        return "<type not supported>";
                }
            }
        }
    }
}