Home | History | Annotate | Download | only in gn
      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 "tools/gn/functions.h"
      6 #include "tools/gn/parse_tree.h"
      7 #include "tools/gn/scope.h"
      8 #include "tools/gn/value.h"
      9 
     10 namespace functions {
     11 
     12 const char kDefineRule[] = "define_rule";
     13 const char kDefileRule_Help[] =
     14     "TODO(brettw) write this.";
     15 
     16 Value RunDefineRule(Scope* scope,
     17                     const FunctionCallNode* function,
     18                     const std::vector<Value>& args,
     19                     BlockNode* block,
     20                     Err* err) {
     21   // TODO(brettw) determine if the function is built-in and throw an error if
     22   // it is.
     23   if (args.size() != 1) {
     24     *err = Err(function->function(),
     25                "Need exactly one string arg to define_rule.");
     26     return Value();
     27   }
     28   if (!args[0].VerifyTypeIs(Value::STRING, err))
     29     return Value();
     30   std::string rule_name = args[0].string_value();
     31 
     32   const FunctionCallNode* existing_rule = scope->GetRule(rule_name);
     33   if (existing_rule) {
     34     *err = Err(function, "Duplicate rule definition.",
     35                "A rule with this name was already defined.");
     36     err->AppendSubErr(Err(existing_rule->function(), "Previous definition."));
     37     return Value();
     38   }
     39 
     40   scope->AddRule(rule_name, function);
     41   return Value();
     42 }
     43 
     44 }  // namespace functions
     45