/*
 * 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_
