public override async Task BeginDialogAsync()

in libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Actions/EditArray.cs [167:254]


        public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (options is CancellationToken)
            {
                throw new ArgumentException($"{nameof(options)} cannot be a cancellation token");
            }

            if (Disabled != null && Disabled.GetValue(dc.State))
            {
                return await dc.EndDialogAsync(cancellationToken: cancellationToken).ConfigureAwait(false);
            }

            var changeType = ChangeType.GetValue(dc.State);

            if (this.ItemsProperty == null)
            {
                throw new InvalidOperationException($"EditArray: \"{changeType}\" operation couldn't be performed because the {nameof(ItemsProperty)} wasn't specified.");
            }

            var property = this.ItemsProperty.GetValue(dc.State);
            var array = dc.State.GetValue<JArray>(property, () => new JArray());

            object item = null;
            object result = null;

            switch (changeType)
            {
                case ArrayChangeType.Pop:
                    item = array[array.Count - 1];
                    array.RemoveAt(array.Count - 1);
                    result = item;
                    break;

                case ArrayChangeType.Push:
                    EnsureValue();
                    var (itemResult, error) = this.Value.TryGetValue(dc.State);
                    if (error == null && itemResult != null)
                    {
                        array.Add(itemResult);
                    }

                    break;

                case ArrayChangeType.Take:
                    if (array.Count == 0)
                    {
                        break;
                    }

                    item = array[0];
                    array.RemoveAt(0);
                    result = item;
                    break;

                case ArrayChangeType.Remove:
                    EnsureValue();
                    (itemResult, error) = this.Value.TryGetValue(dc.State);
                    if (error == null && itemResult != null)
                    {
                        result = false;
                        for (var i = 0; i < array.Count; ++i)
                        {
                            if (array[i].ToString() == itemResult.ToString() || JToken.DeepEquals(array[i], JToken.FromObject(itemResult)))
                            {
                                result = true;
                                array.RemoveAt(i);
                                break;
                            }
                        }
                    }

                    break;

                case ArrayChangeType.Clear:
                    result = array.Count > 0;
                    array.Clear();
                    break;
            }

            dc.State.SetValue(property, array);

            if (ResultProperty != null)
            {
                dc.State.SetValue(this.ResultProperty.GetValue(dc.State), result);
            }

            return await dc.EndDialogAsync(result, cancellationToken).ConfigureAwait(false);
        }