Результат команды

Каждая команда в TeleFlow возвращает CommandResult.

Результат не изменяет ChatSession напрямую. Он описывает намерение команды, а окончательное изменение состояния выполняется в цепочке интерпретаторов.

Именно через CommandResult команда управляет:

  • завершением выполнения;

  • переходом между шагами;

  • навигацией к другой команде;

  • повторным ожиданием ввода.

Базовый тип

Все результаты наследуются от базового класса:

public abstract class CommandResult
{
    public static CommandResult Exit => new ExitCommandResult();
}

Каждый конкретный тип результата имеет собственную семантику обработки.

ExitCommandResult

Завершает выполнение текущей команды.

По умолчанию интерпретатор:

  • удаляет ChatSession;

  • завершает цикл выполнения.

Используется в Stateless-командах и в завершении Stateful-команд.

GoToStatefulResult

Используется только в Stateful-командах.

public class GoToStatefulResult : CommandResult
{
    public int GoToStepNumber { get; init; }
    public bool InitializeNextStep { get; init; }
}

Позволяет:

  • изменить номер текущего шага;

  • указать, был ли инициализирован следующий шаг.

При обработке:

  • ChatSession обновляется;

  • состояние сохраняется в IChatSessionStore.

Используется для переходов внутри диалога.

HoldOnStatefulResult

Оставляет выполнение на текущем шаге.

public class HoldOnStatefulResult : CommandResult
{
    public HoldOnReason Reason { get; init; }
    public string? HoldOnMessage { get; init; }
}

Этот результат:

  • не изменяет номер шага;

  • не завершает команду;

  • не удаляет ChatSession.

Наиболее частые сценарии:

  • инициализация шага;

  • некорректный ввод пользователя;

  • необходимость повторного ввода.

Если указано HoldOnMessage, сообщение отправляется пользователю в рамках обработки результата.

Ошибки пользовательского ввода обрабатываются через HoldOn.

Системные исключения не преобразуются в CommandResult и пробрасываются как ошибки выполнения.

Как выбирать CommandResult

Команда должна возвращать результат, соответствующий текущей логике выполнения:

  • Exit — завершить команду;

  • Navigate — перейти к другой команде;

  • GoToStatefulResult — изменить шаг;

  • HoldOnStatefulResult — остаться на текущем шаге.

Результат не изменяет состояние напрямую — он лишь описывает намерение. Фактическое изменение выполняется интерпретаторами.

Связанные разделы