public async Task ProcessDocument(Document document, [FromServices] IConfiguration config, [FromServices] DaprClient dapr, [FromServices] ILogger <Create> logger)
        {
            logger.LogInformation("Revieved Document: {id} from Service: {service} at {time}", document.Id, document.ExternalServiceName, document.ProcessedUtc);

            if (DateTime.UtcNow.Second % 2 == 0)
            {
                var errorDoc = document with {
                    Body = Array.Empty <byte>()
                };
                var data = JsonSerializer.Serialize(errorDoc);
                throw new ApplicationException($"Error while receiving document {data}");
            }


            var state = await dapr.GetStateEntryAsync <Document>(config.GetValue <string>("DocumentStore"), document.Id.ToString());

            DocumentProcessResult result = state.Value switch
            {
                null => new(document, ProcessType.Insert),
                { } d when !d.Equals(document) => new(document, ProcessType.Update),
                _ => new(state.Value, ProcessType.Unchanged)
            };

            state.Value = result.Document;
            await state.SaveAsync();

            logger.LogInformation("Updated state for Document: {id} - {processType}", result.Document.Id, result.ProcessType.ToString());

            await dapr.PublishEventAsync(config.GetValue <string>("DocumentPubSub"), config.GetValue <string>("DocumentProcessedTopic"), result);
        }
        public DocumentProcessResult Apply(ICollection <CodeSnippet> snippets)
        {
            var result = new DocumentProcessResult();

            var inputFiles = new[] { "*.md", "*.mdown", "*.markdown" }.SelectMany(
                extension => Directory.GetFiles(docsFolder, extension, SearchOption.AllDirectories))
            .ToArray();

            result.Count = inputFiles.Count();

            foreach (var inputFile in inputFiles)
            {
                var fileResult = Apply(snippets, inputFile);

                if (fileResult.RequiredSnippets.Any())
                {
                    // give up if we can't continue
                    result.Include(fileResult.RequiredSnippets);
                    return(result);
                }

                result.Include(fileResult.Snippets);

                File.WriteAllText(inputFile, fileResult.Text);
            }

            return(result);
        }