// 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 requests a string representation of the layer tree.
class GetLayerTree extends Command {
  /// Create a command to request a string representation of the layer tree.
  const GetLayerTree({ Duration? timeout }) : super(timeout: timeout);

  /// Deserializes this command from the value generated by [serialize].
  GetLayerTree.deserialize(Map<String, String> json) : super.deserialize(json);

  @override
  String get kind => 'get_layer_tree';
}

/// A string representation of the layer tree, the result of a
/// [FlutterDriver.getLayerTree] method.
class LayerTree extends Result {
  /// Creates a [LayerTree] object with the given string representation.
  const LayerTree(this.tree);

  /// String representation of the layer tree.
  final String? tree;

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

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