// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'message.dart';
import 'find.dart';

/// Sets [text] in a text input widget.
class SetInputText extends CommandWithTarget {
  @override
  final String kind = 'setInputText';

  /// Creates a command.
  ///
  /// [finder] identifies the text input widget. [text] is the string that is
  /// set as the value of the text input.
  SetInputText(SerializableFinder finder, this.text) : super(finder);

  /// The value of the text input to set.
  final String text;

  /// Deserializes this command from JSON generated by [serialize].
  SetInputText.deserialize(Map<String, dynamic> json)
      : this.text = json['text'],
        super.deserialize(json);

  @override
  Map<String, String> serialize() {
    Map<String, String> json = super.serialize();
    json['text'] = text;
    return json;
  }
}

/// The result of a [SetInputText] command.
class SetInputTextResult extends Result {
  /// Deserializes this result from JSON.
  static SetInputTextResult fromJson(Map<String, dynamic> json) {
    return new SetInputTextResult();
  }

  @override
  Map<String, dynamic> toJson() => <String, dynamic>{};
}

/// Submits text entered in a text input widget.
///
/// The definition of submitting input text can be found
/// [here](https://docs.flutter.io/flutter/material/Input/onSubmitted.html).
class SubmitInputText extends CommandWithTarget {
  @override
  final String kind = 'submitInputText';

  /// Create a command that submits text on input widget identified by [finder].
  SubmitInputText(SerializableFinder finder) : super(finder);

  /// Deserializes this command from JSON generated by [serialize].
  SubmitInputText.deserialize(Map<String, dynamic> json)
      : super.deserialize(json);
}

/// The result of a [SubmitInputText] command.
class SubmitInputTextResult extends Result {
  /// Creates a result with [text] as the submitted value.
  SubmitInputTextResult(this.text);

  /// The submitted value.
  final String text;

  /// Deserializes this result from JSON.
  static SubmitInputTextResult fromJson(Map<String, dynamic> json) {
    return new SubmitInputTextResult(json['text']);
  }

  @override
  Map<String, dynamic> toJson() => <String, dynamic>{
    'text': text
  };
}
