Example #1
0
        public CompositeKernel()
        {
            Name             = nameof(CompositeKernel);
            _extensionLoader = new CompositeKernelExtensionLoader();
            Pipeline.AddMiddleware(async(command, context, next) =>
            {
                if (command is AddPackage _)
                {
                    var packageAddedEvents = new List <PackageAdded>();
                    using var _            = context.KernelEvents.OfType <PackageAdded>().Subscribe(packageAddedEvents.Add);

                    await next(command, context);

                    foreach (var packageRoot in packageAddedEvents.Select(p => p.PackageReference.PackageRoot)
                             .Distinct())
                    {
                        var loadExtensionsInDirectory = new LoadExtensionsInDirectory(packageRoot, Name);
                        await this.SendAsync(loadExtensionsInDirectory);
                    }
                }
                else
                {
                    await next(command, context);
                }
            });
        }
Example #2
0
        public void Add(IKernel kernel)
        {
            if (kernel == null)
            {
                throw new ArgumentNullException(nameof(kernel));
            }

            if (ChildKernels.Any(k => k.Name == kernel.Name))
            {
                throw new ArgumentException($"Kernel \"{kernel.Name}\" already registered", nameof(kernel));
            }

            _childKernels.Add(kernel);

            if (kernel is KernelBase kernelBase)
            {
                kernelBase.Pipeline.AddMiddleware(async(command, context, next) =>
                {
                    await next(command, context);
                    while (_packages.TryDequeue(out var packageAdded))
                    {
                        var loadExtensionsInDirectory =
                            new LoadExtensionsInDirectory(packageAdded.PackageReference.PackageRoot, Name);
                        await this.SendAsync(loadExtensionsInDirectory);
                    }
                });
            }

            var chooseKernelCommand = new Command($"%%{kernel.Name}")
            {
                Handler = CommandHandler.Create <KernelInvocationContext>(
                    context => { context.HandlingKernel = kernel; })
            };

            AddDirective(chooseKernelCommand);
            RegisterForDisposal(kernel.KernelEvents.Subscribe(PublishEvent));
            RegisterForDisposal(kernel);
        }
Example #3
0
        private void AddDirectiveMiddlewareAndCommonCommandHandlers()
        {
            Pipeline.AddMiddleware(
                (command, context, next) =>
                command switch
            {
                SubmitCode submitCode =>
                HandleDirectivesAndSubmitCode(
                    submitCode,
                    context,
                    next),

                LoadExtension loadExtension =>
                HandleLoadExtension(
                    loadExtension,
                    context,
                    next),

                DisplayValue displayValue =>
                HandleDisplayValue(
                    displayValue,
                    context,
                    next),

                UpdateDisplayedValue updateDisplayValue =>
                HandleUpdateDisplayValue(
                    updateDisplayValue,
                    context,
                    next),

                LoadExtensionsInDirectory loadExtensionsInDirectory =>
                HandleLoadExtensionsInDirectory(
                    loadExtensionsInDirectory,
                    context,
                    next),

                _ => next(command, context)
            });