Beispiel #1
0
        private async void OnStart()
        {
            output.WriteSplash();
            while (true)
            {
                historyProvider.Reset();
                output.WriteScopeBegin(hostEnv);
                string command = hostInput.ReadCommandLine();
                if (command == null)
                {
                    break;
                }
                IInputCollection inputCollection = Input.Internal.Input.Parse(command);
                if (inputCollection.ContainsError)
                {
                    output.WriteError(inputCollection.ErrorMessage);
                }
                else
                {
                    foreach (var desc in pool.GetDescriptors())
                    {
                        desc.EnterScope();
                    }

                    object      inputObject       = null;
                    int         index             = 0;
                    int         changeIndex       = inputCollection.Inputs.Count - 1;
                    bool        isInPipe          = inputCollection.Inputs.Count > 1;
                    bool        writeDefaultValue = !isInPipe;
                    HostContext context           = null;
                    foreach (IInput input in inputCollection.Inputs)
                    {
                        context = new HostContext(input, inputObject, isInPipe, index, writeDefaultValue);
                        AppDelegate app = appBuilder.Build();
                        await app(context);

                        if (context.ErrorOccured)
                        {
                            output.WriteError(context.Exception);
                            break;
                        }

                        if (context.WriteResult)
                        {
                            output.WriteObject(context.Result);
                        }
                        inputObject = context.Result;
                        if (inputObject != null)
                        {
                            inputObject = ObjectHelper.TryGetValue(inputObject);
                        }
                        index++;
                        if (index >= changeIndex)
                        {
                            writeDefaultValue = true;
                        }
                    }

                    foreach (var desc in pool.GetDescriptors())
                    {
                        desc.LeaveScope();
                    }
                }
                historyProvider.Add(inputCollection.Raw);
            }
        }