/// <inheritdoc /> public (IMarkDocLogger logger, IReadOnlyCollection <IProcess> processes, Func <CancellationToken, ValueTask> executor) GenerateExecutor(IReadOnlyDictionary <string, IReadOnlyDictionary <string, string> > configuration) { var globalSettings = GetSettings <IGlobalSettings>(configuration); var linkerSettings = (LinkerSettings)GetSettings <ILinkerSettings>(configuration); var memberSettings = GetSettings <IMemberSettings>(configuration); var docSettings = GetSettings <IDocSettings>(configuration); var logger = TypeResolver.Resolve <IMarkDocLogger>(); var memberProcess = new DefiniteProcess("Assembly resolver", memberSettings.Paths.Count); var documentationProcess = new DefiniteProcess("Documentation resolver", docSettings.Paths.Count); var printerProcess = new IndefiniteProcess("Printer"); var processes = new IProcess[] { memberProcess, documentationProcess, printerProcess }; return(logger, processes, async _ => { var resolver = new Resolver(logger, memberProcess); var docResolver = new DocResolver(resolver, docSettings, logger, documentationProcess); await Task.WhenAll(resolver.ResolveAsync(memberSettings, globalSettings), docResolver.ResolveAsync()) .ConfigureAwait(false); var linker = new Linker(resolver, linkerSettings); var diagrams = linkerSettings.Platform.Equals("3", StringComparison.InvariantCultureIgnoreCase) ? new EmptyDiagramResolver() : new MermaidResolver(linker) as IDiagramResolver; var composer = new TypeComposer(new Creator(false, linker.GetRawUrl()), docResolver, resolver, linker, diagrams); var printer = new PrinterMarkdown(composer, linker, printerProcess); await printer.Print(resolver.Types.Value.Values.SelectMany(Linq.XtoX), globalSettings.OutputPath) .ConfigureAwait(false); }); }