// Copyright 2016 The Chromium 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 UI_BASE_MOJO_WINDOW_OPEN_DISPOSITION_STRUCT_TRAITS_H_
#define UI_BASE_MOJO_WINDOW_OPEN_DISPOSITION_STRUCT_TRAITS_H_

#include "base/logging.h"
#include "mojo/public/cpp/bindings/enum_traits.h"
#include "ui/base/mojo/window_open_disposition.mojom.h"
#include "ui/base/window_open_disposition.h"

namespace mojo {

template <>
struct EnumTraits<ui::mojom::WindowOpenDisposition, WindowOpenDisposition> {
  static ui::mojom::WindowOpenDisposition ToMojom(
      WindowOpenDisposition disposition) {
    switch (disposition) {
      case WindowOpenDisposition::UNKNOWN:
        return ui::mojom::WindowOpenDisposition::UNKNOWN;
      case WindowOpenDisposition::CURRENT_TAB:
        return ui::mojom::WindowOpenDisposition::CURRENT_TAB;
      case WindowOpenDisposition::SINGLETON_TAB:
        return ui::mojom::WindowOpenDisposition::SINGLETON_TAB;
      case WindowOpenDisposition::NEW_FOREGROUND_TAB:
        return ui::mojom::WindowOpenDisposition::NEW_FOREGROUND_TAB;
      case WindowOpenDisposition::NEW_BACKGROUND_TAB:
        return ui::mojom::WindowOpenDisposition::NEW_BACKGROUND_TAB;
      case WindowOpenDisposition::NEW_POPUP:
        return ui::mojom::WindowOpenDisposition::NEW_POPUP;
      case WindowOpenDisposition::NEW_WINDOW:
        return ui::mojom::WindowOpenDisposition::NEW_WINDOW;
      case WindowOpenDisposition::SAVE_TO_DISK:
        return ui::mojom::WindowOpenDisposition::SAVE_TO_DISK;
      case WindowOpenDisposition::OFF_THE_RECORD:
        return ui::mojom::WindowOpenDisposition::OFF_THE_RECORD;
      case WindowOpenDisposition::IGNORE_ACTION:
        return ui::mojom::WindowOpenDisposition::IGNORE_ACTION;
      default:
        NOTREACHED();
        return ui::mojom::WindowOpenDisposition::UNKNOWN;
    }
  }

  static bool FromMojom(ui::mojom::WindowOpenDisposition disposition,
                        WindowOpenDisposition* out) {
    switch (disposition) {
      case ui::mojom::WindowOpenDisposition::UNKNOWN:
        *out = WindowOpenDisposition::UNKNOWN;
        return true;
      case ui::mojom::WindowOpenDisposition::CURRENT_TAB:
        *out = WindowOpenDisposition::CURRENT_TAB;
        return true;
      case ui::mojom::WindowOpenDisposition::SINGLETON_TAB:
        *out = WindowOpenDisposition::SINGLETON_TAB;
        return true;
      case ui::mojom::WindowOpenDisposition::NEW_FOREGROUND_TAB:
        *out = WindowOpenDisposition::NEW_FOREGROUND_TAB;
        return true;
      case ui::mojom::WindowOpenDisposition::NEW_BACKGROUND_TAB:
        *out = WindowOpenDisposition::NEW_BACKGROUND_TAB;
        return true;
      case ui::mojom::WindowOpenDisposition::NEW_POPUP:
        *out = WindowOpenDisposition::NEW_POPUP;
        return true;
      case ui::mojom::WindowOpenDisposition::NEW_WINDOW:
        *out = WindowOpenDisposition::NEW_WINDOW;
        return true;
      case ui::mojom::WindowOpenDisposition::SAVE_TO_DISK:
        *out = WindowOpenDisposition::SAVE_TO_DISK;
        return true;
      case ui::mojom::WindowOpenDisposition::OFF_THE_RECORD:
        *out = WindowOpenDisposition::OFF_THE_RECORD;
        return true;
      case ui::mojom::WindowOpenDisposition::IGNORE_ACTION:
        *out = WindowOpenDisposition::IGNORE_ACTION;
        return true;
      default:
        NOTREACHED();
        return false;
    }
  }
};

}  // namespace mojo

#endif  // UI_BASE_MOJO_WINDOW_OPEN_DISPOSITION_STRUCT_TRAITS_H_
