// Copyright 2021 The Cobalt Authors. 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.

#include "cobalt/web/cobalt_ua_data_values_interface.h"

namespace cobalt {
namespace web {

CobaltUADataValuesInterface::CobaltUADataValuesInterface(
    const CobaltUADataValues& init_dict) {
  // In many cases, |init_dict| will not have all its fields initialized, only
  // the ones specified when calling NavigatorUAData::getHighEntropyValues().
  // Thus, we first must check whether the fields have been initialized.
  if (init_dict.has_brands()) {
    brands_ = init_dict.brands();
  }
  if (init_dict.has_mobile()) {
    mobile_ = init_dict.mobile();
  }
  if (init_dict.has_platform()) {
    platform_ = init_dict.platform();
  }
  if (init_dict.has_architecture()) {
    architecture_ = init_dict.architecture();
  }
  if (init_dict.has_bitness()) {
    bitness_ = init_dict.bitness();
  }
  if (init_dict.has_model()) {
    model_ = init_dict.model();
  }
  if (init_dict.has_platform()) {
    platform_ = init_dict.platform();
  }
  if (init_dict.has_ua_full_version()) {
    ua_full_version_ = init_dict.ua_full_version();
  }
  if (init_dict.has_cobalt_build_number()) {
    cobalt_build_number_ = init_dict.cobalt_build_number();
  }
  if (init_dict.has_cobalt_build_configuration()) {
    cobalt_build_configuration_ = init_dict.cobalt_build_configuration();
  }
  if (init_dict.has_js_engine_version()) {
    js_engine_version_ = init_dict.js_engine_version();
  }
  if (init_dict.has_rasterizer()) {
    rasterizer_ = init_dict.rasterizer();
  }
  if (init_dict.has_evergreen_type()) {
    evergreen_type_ = init_dict.evergreen_type();
  }
  if (init_dict.has_evergreen_file_type()) {
    evergreen_file_type_ = init_dict.evergreen_file_type();
  }
  if (init_dict.has_evergreen_version()) {
    evergreen_version_ = init_dict.evergreen_version();
  }
  if (init_dict.has_starboard_version()) {
    starboard_version_ = init_dict.starboard_version();
  }
  if (init_dict.has_original_design_manufacturer()) {
    original_design_manufacturer_ = init_dict.original_design_manufacturer();
  }
  if (init_dict.has_device_type()) {
    device_type_ = init_dict.device_type();
  }
  if (init_dict.has_chipset()) {
    chipset_ = init_dict.chipset();
  }
  if (init_dict.has_model_year()) {
    model_year_ = init_dict.model_year();
  }
  if (init_dict.has_device_brand()) {
    device_brand_ = init_dict.device_brand();
  }
  if (init_dict.has_connection_type()) {
    connection_type_ = init_dict.connection_type();
  }
  if (init_dict.has_aux()) {
    aux_ = init_dict.aux();
  }
}

}  // namespace web
}  // namespace cobalt
