protected virtual void ExpandDefaultValues(int noOfRuns, IList <ITokenDescription> tokens)
        {
            foreach (var tokenDescription in Manifest.Tokens.Where(t => !string.IsNullOrEmpty(t.Default) && !t.Default.Contains("$")).ToArray())
            {
                if (Manifest.ReplacementTokens.ContainsKey(tokenDescription.Key))
                {
                    continue;
                }
                Manifest.ReplacementTokens.Add(tokenDescription.Key, tokenDescription.Default);
            }

            ReplaceTokensService = new ReplaceTokensService(Manifest.ReplacementTokens);
            foreach (var tokenDescription in Manifest.Tokens.Where(t => !string.IsNullOrEmpty(t.Default) && t.Default.Contains("$")))
            {
                tokenDescription.Default = ReplaceTokensService.Replace(tokenDescription.Default);
            }

            if (!Manifest.Tokens.Any(t => t.Default.Contains("$")) || noOfRuns >= tokens.Count)
            {
                return;
            }
            noOfRuns++;

            ExpandDefaultValues(noOfRuns, tokens);
        }
        public virtual void ReplaceTokens(object scopeResult)
        {
            var result = (FileTokenReplaceResult)scopeResult;

            result.FilePath = FilePath;

            if (!File.Exists(FilePath) || !CanModify(FilePath))
            {
                result.Status = FileTokenReplacementStatus.Failed;
                _doneEvent.Set();
                return;
            }
            if (FileTypeIsIgnored(FilePath))
            {
                result.Status = FileTokenReplacementStatus.Skipped;
                _doneEvent.Set();
                return;
            }

            var fileContent   = File.ReadAllText(FilePath);
            var parsedContent = _tokensService.Replace(fileContent, out var replacementsCounter);

            File.WriteAllText(FilePath, parsedContent);

            result.ReplacementCounter = replacementsCounter;
            result.Status             = FileTokenReplacementStatus.Success;

            _doneEvent.Set();
        }
        public virtual void ReplaceTokens(object threadContext)
        {
            if (!File.Exists(FilePath) || !CanModify(FilePath))
            {
                Success = false;
                _doneEvent.Set();
                return;
            }
            if (FileTypeIsIgnored(FilePath))
            {
                Success = true;
                _doneEvent.Set();
                return;
            }
            var fileContent   = File.ReadAllText(FilePath);
            var parsedContent = _tokensService.Replace(fileContent, out IDictionary <string, int> replacementsCount);

            File.WriteAllText(FilePath, parsedContent);
            ReplacementCounter = replacementsCount;
            _doneEvent.Set();
        }