private void RunMacros(JProperty macro, JObject variablesSection, IParameterSet parameters)
        {
            RunnableProjectGenerator.ParameterSet set = (RunnableProjectGenerator.ParameterSet)parameters;
            string  variableName = macro.Name;
            JObject def          = (JObject)macro.Value;

            switch (def["type"].ToString())
            {
            case "guid":
                HandleGuidAction(variableName, def, set);
                break;

            case "random":
                HandleRandomAction(variableName, def, set);
                break;

            case "now":
                HandleNowAction(variableName, def, set);
                break;

            case "evaluate":
                HandleEvaluateAction(variableName, variablesSection, def, set);
                break;

            case "constant":
                HandleConstantAction(variableName, def, set);
                break;

            case "regex":
                HandleRegexAction(variableName, variablesSection, def, set);
                break;
            }
        }
        private static void HandleConstantAction(string variableName, JObject def, RunnableProjectGenerator.ParameterSet parameters)
        {
            string    value = def["action"].ToString();
            Parameter p     = new Parameter
            {
                IsVariable = true,
                Name       = variableName
            };

            parameters.AddParameter(p);
            parameters.ParameterValues[p] = value;
        }
        private static void HandleGuidAction(string variableName, JObject def, RunnableProjectGenerator.ParameterSet parameters)
        {
            switch (def["action"].ToString())
            {
            case "new":
                string fmt = def["format"]?.ToString();
                if (fmt != null)
                {
                    Guid      g     = Guid.NewGuid();
                    string    value = char.IsUpper(fmt[0]) ? g.ToString(fmt[0].ToString()).ToUpperInvariant() : g.ToString(fmt[0].ToString()).ToLowerInvariant();
                    Parameter p     = new Parameter
                    {
                        IsVariable = true,
                        Name       = variableName
                    };

                    parameters.AddParameter(p);
                    parameters.ParameterValues[p] = value;
                }
                else
                {
                    Guid         g           = Guid.NewGuid();
                    const string guidFormats = "ndbpxNDPBX";
                    for (int i = 0; i < guidFormats.Length; ++i)
                    {
                        Parameter p = new Parameter
                        {
                            IsVariable = true,
                            Name       = variableName + "-" + guidFormats[i]
                        };

                        string rplc = char.IsUpper(guidFormats[i]) ? g.ToString(guidFormats[i].ToString()).ToUpperInvariant() : g.ToString(guidFormats[i].ToString()).ToLowerInvariant();
                        parameters.AddParameter(p);
                        parameters.ParameterValues[p] = rplc;
                    }

                    Parameter pd = new Parameter
                    {
                        IsVariable = true,
                        Name       = variableName
                    };

                    parameters.AddParameter(pd);
                    parameters.ParameterValues[pd] = g.ToString("D");
                }

                break;
            }
        }
        private static void HandleNowAction(string variableName, JObject def, RunnableProjectGenerator.ParameterSet parameters)
        {
            string    format = def["action"]?.ToString();
            bool      utc    = bool.Parse(def["utc"]?.ToString() ?? "False");
            DateTime  time   = utc ? DateTime.UtcNow : DateTime.Now;
            string    value  = time.ToString(format);
            Parameter p      = new Parameter
            {
                IsVariable = true,
                Name       = variableName
            };

            parameters.AddParameter(p);
            parameters.ParameterValues[p] = value;
        }
        private static void HandleRandomAction(string variableName, JObject def, RunnableProjectGenerator.ParameterSet parameters)
        {
            switch (def["action"].ToString())
            {
            case "new":
                int       low   = int.Parse(def["low"]?.ToString() ?? "0");
                int       high  = int.Parse(def["high"]?.ToString() ?? int.MaxValue.ToString());
                Random    rnd   = new Random();
                int       val   = rnd.Next(low, high);
                string    value = val.ToString();
                Parameter p     = new Parameter
                {
                    IsVariable = true,
                    Name       = variableName
                };

                parameters.AddParameter(p);
                parameters.ParameterValues[p] = value;
                break;
            }
        }
        private void HandleEvaluateAction(string variableName, JObject variablesSection, JObject def, RunnableProjectGenerator.ParameterSet parameters)
        {
            ConditionEvaluator evaluator = CppStyleEvaluatorDefinition.CppStyleEvaluator;
            VariableCollection vars      = HandleVariables(parameters, variablesSection, null, true);

            switch (def["evaluator"]?.ToString() ?? "C++")
            {
            case "C++":
                evaluator = CppStyleEvaluatorDefinition.CppStyleEvaluator;
                break;
            }

            byte[]          data  = Encoding.UTF8.GetBytes(def["action"].ToString());
            int             len   = data.Length;
            int             pos   = 0;
            IProcessorState state = new ProcessorState(vars, data, Encoding.UTF8);
            bool            res   = evaluator(state, ref len, ref pos);

            Parameter p = new Parameter
            {
                IsVariable = true,
                Name       = variableName
            };

            parameters.AddParameter(p);
            parameters.ParameterValues[p] = res.ToString();
        }
        private void HandleRegexAction(string variableName, JObject variablesSection, JObject def, RunnableProjectGenerator.ParameterSet parameters)
        {
            VariableCollection vars   = HandleVariables(parameters, variablesSection, null, true);
            string             action = def["action"]?.ToString();
            string             value  = null;

            switch (action)
            {
            case "replace":
                string sourceVar = def["source"]?.ToString();
                JArray steps     = def["steps"] as JArray;
                object working;
                if (!vars.TryGetValue(sourceVar, out working))
                {
                    ITemplateParameter param;
                    if (!parameters.TryGetParameter(sourceVar, out param) || !parameters.ParameterValues.TryGetValue(param, out value))
                    {
                        value = string.Empty;
                    }
                }
                else
                {
                    value = working?.ToString() ?? "";
                }

                if (steps != null)
                {
                    foreach (JToken child in steps)
                    {
                        JObject map         = (JObject)child;
                        string  regex       = map["regex"]?.ToString();
                        string  replaceWith = map["replacement"]?.ToString();

                        value = Regex.Replace(value, regex, replaceWith);
                    }
                }
                break;
            }

            Parameter p = new Parameter
            {
                IsVariable = true,
                Name       = variableName
            };

            parameters.AddParameter(p);
            parameters.ParameterValues[p] = value;
        }