/// <summary>Processes the command line input result.</summary>
        /// <param name="uiResult">The UI result.</param>
        /// <param name="result">The result.</param>
        /// <param name="choiceCount">The choices counted.</param>
        public virtual void ProcessCommandLineInputResult(UserInteractionResult uiResult, InputInterpretationResult result, Runtime.IStory runtimeStory)
        {
            if (uiResult == null || result == null)
            {
                return;
            }

            uiResult.IsExitRequested = result.requestsExit;
            uiResult.ChosenIndex     = result.choiceIdx;
            uiResult.DivertedPath    = result.divertedPath;
            uiResult.Output          = result.output;

            int choiceCount = 0;

            if (runtimeStory != null && runtimeStory.currentChoices != null)
            {
                choiceCount = runtimeStory.currentChoices.Count;
            }

            if (result.choiceIdx >= 0 && result.choiceIdx < choiceCount)
            {
                // The choice is only valid if it's a valid index.
                uiResult.IsValidChoice = true;
            }
        }
        /// <summary>Gets the user interaction result.</summary>
        /// <param name="runtimeStory"></param>
        /// <param name="parsedFiction"></param>
        /// <param name="options">The options.</param>
        /// <returns></returns>
        public virtual UserInteractionResult GetUserInteractionResult(Runtime.IStory runtimeStory, Parsed.IFiction parsedFiction, ConsoleUserInterfaceOptions options)
        {
            var uiResult = new UserInteractionResult();

            OutputManager.RequestInput(options);

            var userInput = OutputManager.GetUserInput();

            // If we have null user input, it means that we're
            // "at the end of the stream", or in other words, the input
            // stream has closed, so there's nothing more we can do.
            // We return immediately, since otherwise we get into a busy
            // loop waiting for user input.
            if (userInput == null)
            {
                OutputManager.ShowStreamError(options);
                uiResult.IsInputStreamClosed = true;
            }
            else
            {
                var result = Interpreter.InterpretCommandLineInput(userInput, parsedFiction, runtimeStory);
                if (result == null)
                {
                    return(null);
                }


                ProcessCommandLineInputResult(uiResult, result, runtimeStory);

                if (uiResult.Output != null)
                {
                    OutputManager.ShowOutputResult(result, options);
                }

                if (!uiResult.IsValidChoice)
                {
                    // The choice is only valid if it's a valid index.
                    OutputManager.ShowChoiceOutOffRange(options);
                }
            }

            return(uiResult);
        }