// Copyright 2014 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.

#include "gn/substitution_list.h"

#include <stddef.h>
#include <string.h>

#include "gn/value.h"

SubstitutionList::SubstitutionList() = default;

SubstitutionList::SubstitutionList(const SubstitutionList& other) = default;

SubstitutionList::~SubstitutionList() = default;

bool SubstitutionList::Parse(const Value& value, Err* err) {
  if (!value.VerifyTypeIs(Value::LIST, err))
    return false;

  const std::vector<Value>& input_list = value.list_value();
  list_.resize(input_list.size());
  for (size_t i = 0; i < input_list.size(); i++) {
    if (!list_[i].Parse(input_list[i], err))
      return false;
  }

  SubstitutionBits bits;
  FillRequiredTypes(&bits);
  bits.FillVector(&required_types_);
  return true;
}

bool SubstitutionList::Parse(const std::vector<std::string>& values,
                             const ParseNode* origin,
                             Err* err) {
  list_.resize(values.size());
  for (size_t i = 0; i < values.size(); i++) {
    if (!list_[i].Parse(values[i], origin, err))
      return false;
  }

  SubstitutionBits bits;
  FillRequiredTypes(&bits);
  bits.FillVector(&required_types_);
  return true;
}

SubstitutionList SubstitutionList::MakeForTest(const char* a,
                                               const char* b,
                                               const char* c) {
  std::vector<std::string> input_strings;
  input_strings.push_back(a);
  if (b)
    input_strings.push_back(b);
  if (c)
    input_strings.push_back(c);

  Err err;
  SubstitutionList result;
  CHECK(result.Parse(input_strings, nullptr, &err))
      << err.message() << "\n" << err.help_text();
  return result;
}

void SubstitutionList::FillRequiredTypes(SubstitutionBits* bits) const {
  for (const auto& item : list_)
    item.FillRequiredTypes(bits);
}
