// Copyright 2014 The Flutter 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';

/// A Flutter Driver command that sends a string to the application and expects a
/// string response.
class RequestData extends Command {
  /// Create a command that sends a message.
  const RequestData(this.message, { Duration? timeout }) : super(timeout: timeout);

  /// Deserializes this command from the value generated by [serialize].
  RequestData.deserialize(Map<String, String> params)
    : message = params['message'],
      super.deserialize(params);

  /// The message being sent from the test to the application.
  final String? message;

  @override
  String get kind => 'request_data';

  @override
  bool get requiresRootWidgetAttached => false;

  @override
  Map<String, String> serialize() => super.serialize()..addAll(<String, String>{
    if (message != null)
      'message': message!,
  });
}

/// The result of the [RequestData] command.
class RequestDataResult extends Result {
  /// Creates a result with the given [message].
  const RequestDataResult(this.message);

  /// The text extracted by the [RequestData] command.
  final String message;

  /// Deserializes the result from JSON.
  static RequestDataResult fromJson(Map<String, dynamic> json) {
    return RequestDataResult(json['message'] as String);
  }

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