/// <summary>
 /// Method that cna be override to control how an individual <see cref="SnippetGroup"/> is rendered.
 /// </summary>
 public void AppendGroup(SnippetGroup snippetGroup, TextWriter writer)
 {
     Guard.AgainstNull(snippetGroup, "snippetGroup");
     Guard.AgainstNull(writer, "writer");
     foreach (var versionGroup in snippetGroup)
     {
         AppendVersionGroup(writer, versionGroup,snippetGroup.Language);
     }
 }
        static bool TryGetGroup(string key, List<ReadSnippet> readSnippets, out SnippetGroup snippetGroup, out string error)
        {
            var requiredLanguage = readSnippets.Select(x => x.Language).First();
            if (readSnippets.Any(x => x.Language != requiredLanguage))
            {
                error = $"All languages of a give key must be equivalent. Key='{key}'.";
                snippetGroup = null;
                return false;
            }

            foreach (var snippet in readSnippets)
            {
                var snippetVersion = snippet.Version;
                var snippets = readSnippets.Where(x => x.Version.Equals(snippetVersion))
                    .ToList();
                if (snippets.Count > 1)
                {
                    var files = string.Join("\r\n", snippets.Select(x => x.FileLocation));
                    error = $"Duplicate key detected. Key='{key}'. Version='{snippets.First().Version.PrettyPrint()}'. Files=\r\n{files}";
                    snippetGroup = null;
                    return false;
                }
            }

            var containsAllVersionRanges = readSnippets.Any(x=>x.Version.Equals(VersionRange.All));
            var containsNonAllVersionRanges = readSnippets.Any(x=>!x.Version.Equals(VersionRange.All));

            if (containsAllVersionRanges && containsNonAllVersionRanges)
            {
                var files = string.Join("\r\n", readSnippets.Select(x => x.FileLocation));
                error = $"Cannot mix 'all' versions and specific versions. Key='{key}'. Files=\r\n{files}";
                snippetGroup = null;
                return false;
            }


            var keyGroup = ProcessKeyGroup(readSnippets)
                .OrderByDescending(x => x.Version.VersionForCompare());

            snippetGroup = new SnippetGroup(
                key: key,
                language: requiredLanguage,
                versions: keyGroup);
            error = null;
            return true;
        }