| // 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 |