1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/file_util.h" 6#include "tools/gn/err.h" 7#include "tools/gn/filesystem_utils.h" 8#include "tools/gn/functions.h" 9#include "tools/gn/input_conversion.h" 10#include "tools/gn/input_file.h" 11#include "tools/gn/scheduler.h" 12 13// TODO(brettw) consider removing this. I originally wrote it for making the 14// WebKit bindings but misundersood what was required, and didn't need to 15// use this. This seems to have a high potential for misuse. 16 17namespace functions { 18 19const char kReadFile[] = "read_file"; 20const char kReadFile_Help[] = 21 "read_file: Read a file into a variable.\n" 22 "\n" 23 " read_file(filename, how_to_read)\n" 24 "\n" 25 " Whitespace will be trimmed from the end of the file. Throws an error\n" 26 " if the file can not be opened.\n" 27 "\n" 28 "Arguments:\n" 29 "\n" 30 " filename\n" 31 " Filename to read, relative to the build file.\n" 32 "\n" 33 " input_conversion\n" 34 " Controls how the file is read and parsed.\n" 35 " See \"gn help input_conversion\".\n" 36 "\n" 37 "Example:\n" 38 " lines = read_file(\"foo.txt\", \"list lines\")\n"; 39 40Value RunReadFile(Scope* scope, 41 const FunctionCallNode* function, 42 const std::vector<Value>& args, 43 Err* err) { 44 if (args.size() != 2) { 45 *err = Err(function->function(), "Wrong number of args to read_file", 46 "I expected two arguments."); 47 return Value(); 48 } 49 if (!args[0].VerifyTypeIs(Value::STRING, err)) 50 return Value(); 51 52 // Compute the file name. 53 const SourceDir& cur_dir = SourceDirForFunctionCall(function); 54 SourceFile source_file = cur_dir.ResolveRelativeFile(args[0].string_value()); 55 base::FilePath file_path = 56 scope->settings()->build_settings()->GetFullPath(source_file); 57 58 // Ensure that everything is recomputed if the read file changes. 59 g_scheduler->AddGenDependency(source_file); 60 61 // Read contents. 62 std::string file_contents; 63 if (!file_util::ReadFileToString(file_path, &file_contents)) { 64 *err = Err(args[0], "Could not read file.", 65 "I resolved this to \"" + FilePathToUTF8(file_path) + "\"."); 66 return Value(); 67 } 68 69 return ConvertInputToValue(file_contents, function, args[1], err); 70} 71 72} // namespace functions 73