// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_WEBDRIVER_PROTOCOL_SESSION_ID_H_
#define COBALT_WEBDRIVER_PROTOCOL_SESSION_ID_H_

#include <string>

#include "base/values.h"

namespace cobalt {
namespace webdriver {
namespace protocol {

// sessionId is mentioned in the spec describing WebDriver responses:
// https://code.google.com/p/selenium/wiki/JsonWireProtocol#Responses
//
class SessionId {
 public:
  static scoped_ptr<base::Value> ToValue(const SessionId& session_id) {
    return make_scoped_ptr<base::Value>(new base::StringValue(session_id.id_));
  }

  explicit SessionId(const std::string& id) : id_(id) {}
  const std::string& id() const { return id_; }
  bool operator==(const SessionId& rhs) const { return id_ == rhs.id_; }

 private:
  std::string id_;
};

}  // namespace protocol
}  // namespace webdriver
}  // namespace cobalt
#endif  // COBALT_WEBDRIVER_PROTOCOL_SESSION_ID_H_
