text: // Copyright 2020 The Fuchsia Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef SRC_DIAGNOSTICS_EXAMPLES_INSPECT_CPP_PART_3_REVERSER_H_
  #define SRC_DIAGNOSTICS_EXAMPLES_INSPECT_CPP_PART_3_REVERSER_H_
  
  #include <fuchsia/examples/inspect/cpp/fidl.h>
  #include <lib/inspect/cpp/inspect.h>
  
  // Reverser stats encapsulates all stat input to the Reverser.
  struct ReverserStats {
    // The node for an individual connection to the Reverser service.
    inspect::Node connection_node;
  
    // Global property for request count.
    // Updating properties is thread-safe.
    std::shared_ptr<inspect::UintProperty> global_request_count;
  
    // Creates a default ReverserStats on which all operations are no-ops.
    static ReverserStats CreateDefault() {
      return ReverserStats{.connection_node = inspect::Node(),
                           .global_request_count = std::make_shared<inspect::UintProperty>()};
    }
  };
  
  // Implementation of the fuchsia.examples.inspect.Reverser protocol.
  //
  // Each instantiation of this class handles a single connection to Reverser.
  class Reverser final : public fuchsia::examples::inspect::Reverser {
   public:
    // Construct a new reverser that exposes stats.
    Reverser(ReverserStats stats);
  
    // Implementation of Reverser.Reverse().
    void Reverse(std::string input, ReverseCallback callback) override;
  
    // Return a request handler for the Reverser protocol that binds incoming requests to new
    // Reversers.
    //
    // |node| is an inspect Node to store stat information under.
    static fidl::InterfaceRequestHandler<fuchsia::examples::inspect::Reverser> CreateDefaultHandler(
        inspect::Node node);
  
   private:
    // The incoming stats nodes for this property.
    ReverserStats stats_;
  
    // Local request and response counts.
    inspect::UintProperty request_count_, response_count_;
  };
  
  #endif  // SRC_DIAGNOSTICS_EXAMPLES_INSPECT_CPP_PART_3_REVERSER_H_
  