blob: a3cb349d6bd7f2bf36db2fbf7d84bc08002cd71d [file] [log] [blame] [edit]
// Copyright 2025 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 <stddef.h>
#include "base/files/file_util.h"
#include "gn/build_settings.h"
#include "gn/err.h"
#include "gn/functions.h"
#include "gn/parse_tree.h"
#include "gn/settings.h"
#include "gn/value.h"
namespace functions {
Value RunPathExists(Scope* scope,
const FunctionCallNode* function,
const std::vector<Value>& args,
Err* err) {
Value result;
if (args.size() != 1) {
*err = Err(function->function(), "Expecting exactly one argument.");
return result;
}
const Value& value = args[0];
if (!value.VerifyTypeIs(Value::STRING, err)) {
return result;
}
const std::string& input_string = value.string_value();
const SourceDir& cur_dir = scope->GetSourceDir();
bool as_dir =
!input_string.empty() && input_string[input_string.size() - 1] == '/';
base::FilePath system_path;
if (as_dir) {
system_path = scope->settings()->build_settings()->GetFullPath(
cur_dir.ResolveRelativeDir(
value, err, scope->settings()->build_settings()->root_path_utf8()));
} else {
system_path = scope->settings()->build_settings()->GetFullPath(
cur_dir.ResolveRelativeFile(
value, err, scope->settings()->build_settings()->root_path_utf8()));
}
if (err->has_error()) {
return value;
}
bool exists = PathExists(system_path);
return Value(function, exists);
}
const char kPathExists[] = "path_exists";
const char kPathExists_HelpShort[] =
"path_exists: Returns whether the given path exists.";
const char kPathExists_Help[] =
R"(path_exists: Returns whether the given path exists.
path_exists(path)
Examples:
path_exists("//") # true
path_exists("BUILD.gn") # true
path_exists("/abs-non-existent") # false
)";
} // namespace functions