// Copyright 2018 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 TOOLS_GN_METADATA_H_
#define TOOLS_GN_METADATA_H_

#include <memory>

#include "gn/build_settings.h"
#include "gn/scope.h"
#include "gn/source_dir.h"

extern const char kMetadata_Help[];

// Metadata about a particular target.
//
// Metadata is a collection of keys and values relating to a particular target.
// Generally, these keys will include three categories of strings: ordinary
// strings, filenames intended to be rebased according to their particular
// source directory, and target labels intended to be used as barriers to the
// walk. Verification of these categories occurs at walk time, not creation
// time (since it is not clear until the walk which values are intended for
// which purpose).
//
// Represented as a scope in the expression language, here it is reduced to just
// the KeyValueMap (since it doesn't need the logical overhead of a full scope).
// Values must be lists of strings, as the walking collection logic contatenates
// their values across targets.
class Metadata {
 public:
  using Contents = Scope::KeyValueMap;

  Metadata() = default;

  const ParseNode* origin() const { return origin_; }
  void set_origin(const ParseNode* origin) { origin_ = origin; }

  // The contents of this metadata varaiable.
  const Contents& contents() const { return contents_; }
  Contents& contents() { return contents_; }
  void set_contents(Contents&& contents) { contents_ = std::move(contents); }

  // The relative source directory to use when rebasing.
  const SourceDir& source_dir() const { return source_dir_; }
  SourceDir& source_dir() { return source_dir_; }
  void set_source_dir(const SourceDir& d) { source_dir_ = d; }

  // Collect the specified metadata from this instance.
  //
  // Calling this will populate `next_walk_keys` with the values of targets to
  // be walked next (with the empty string "" indicating that the target should
  // walk all of its deps and data_deps).
  bool WalkStep(const BuildSettings* settings,
                const std::vector<std::string>& keys_to_extract,
                const std::vector<std::string>& keys_to_walk,
                const SourceDir& rebase_dir,
                std::vector<Value>* next_walk_keys,
                std::vector<Value>* result,
                Err* err) const;

 private:
  const ParseNode* origin_ = nullptr;
  Contents contents_;
  SourceDir source_dir_;

  std::pair<Value, bool> RebaseValue(const BuildSettings* settings,
                                     const SourceDir& rebase_dir,
                                     const Value& value,
                                     Err* err) const;

  std::pair<Value, bool> RebaseStringValue(const BuildSettings* settings,
                                           const SourceDir& rebase_dir,
                                           const Value& value,
                                           Err* err) const;

  std::pair<Value, bool> RebaseListValue(const BuildSettings* settings,
                                         const SourceDir& rebase_dir,
                                         const Value& value,
                                         Err* err) const;

  std::pair<Value, bool> RebaseScopeValue(const BuildSettings* settings,
                                          const SourceDir& rebase_dir,
                                          const Value& value,
                                          Err* err) const;

  DISALLOW_COPY_AND_ASSIGN(Metadata);
};

#endif  // TOOLS_GN_METADATA_H_
