private static async Task <ToDoComment> GetLineNumber(ToDoComment input)
        {
            var httpClient = new HttpClient();
            var url        = $"https://raw.githubusercontent.com/{input.Repository}/{input.BranchName}/{input.Path}";
            var text       = await httpClient.GetStringAsync(url);

            var lineNumber = text.Take(input.Position).Count(c => c == '\n') + 1;

            input.LineNumber = lineNumber;
            return(input);
        }
        private static ToDoComment GetBaseToDoComment(ToDoComment input, dynamic graphQLData)
        {
            var defaultBranchRef = graphQLData.data.repository.defaultBranchRef as dynamic;
            var branchName       = defaultBranchRef.name.Value;

            return(new ToDoComment
            {
                Repository = input.Repository,
                Path = input.Path,
                Position = input.Position,
                BranchName = branchName
            });
        }
        private static async Task <dynamic> GetGraphQLData(ToDoComment input)
        {
            var owner      = input.Repository.Split("/")[0];
            var repository = input.Repository.Split("/")[1];
            var query      = "{repository(owner: \\\"" + owner + "\\\", name: \\\"" + repository + "\\\") {"
                             + " defaultBranchRef {"
                             + " name"
                             + " target {"
                             + " ... on Commit {"
                             + " history(first: 1) {"
                             + " edges {"
                             + " node {"
                             + " committedDate"
                             + "}"
                             + "}"
                             + "}"
                             + " blame(path: \\\"" + input.Path + "\\\") {"
                             + " ranges {"
                             + " startingLine"
                             + " endingLine"
                             + " commit {"
                             + " committedDate"
                             + " }"
                             + " }"
                             + " }"
                             + " }"
                             + " }"
                             + " }"
                             + " }"
                             + " }";

            var httpClient = new HttpClient();
            var url        = "https://api.github.com/graphql";
            var request    = new HttpRequestMessage
            {
                RequestUri = new Uri(url),
                Method     = HttpMethod.Post,
                Content    = new StringContent("{ \"query\": \"" + query + "\"")
            };

            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "");
            request.Headers.Add("User-Agent", "petermorlion");

            var response = await httpClient.SendAsync(request);

            var content = await response.Content.ReadAsStringAsync();

            dynamic data = JObject.Parse(content);

            return(data);
        }
        private static ToDoComment GetCommitDateAndAge(ToDoComment input, dynamic graphQLData)
        {
            var defaultBranchRef = graphQLData.data.repository.defaultBranchRef as dynamic;
            var branchName       = defaultBranchRef.name;
            var latestCommitDate = (DateTime)defaultBranchRef.target.history.edges[0].node.committedDate;
            var ranges           = defaultBranchRef.target.blame.ranges as IEnumerable <dynamic>;
            var range            = ranges.SingleOrDefault(r => (int)r.startingLine <= input.LineNumber && (int)r.endingLine >= input.LineNumber);
            var committedDate    = (DateTime)range.commit.committedDate;
            var ageInDays        = (latestCommitDate - committedDate).Days;

            input.CommitDate = committedDate;
            input.AgeInDays  = ageInDays;

            return(input);
        }