blob: 826ba0e939f5a4f933be2995e5d4978020f79a51 [file] [log] [blame]
// 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 "gn/err.h"
#include "gn/functions.h"
#include "gn/parse_tree.h"
#include "gn/value.h"
namespace functions {
Value RunLen(Scope* scope,
const FunctionCallNode* function,
const std::vector<Value>& args,
Err* err) {
if (args.size() != 1) {
*err = Err(function->function(), "Expecting exactly one argument.");
return Value();
}
const Value& value = args[0];
if (value.type() == Value::STRING) {
return Value(function, static_cast<int64_t>(value.string_value().size()));
}
if (value.type() == Value::LIST) {
return Value(function, static_cast<int64_t>(value.list_value().size()));
}
*err = Err(
value.origin(), "len() expects a string or a list.",
"Got " + std::string(Value::DescribeType(value.type())) + " instead.");
return Value();
}
const char kLen[] = "len";
const char kLen_HelpShort[] = "len: Returns the length of a string or a list.";
const char kLen_Help[] =
R"(len: Returns the length of a string or a list.
len(item)
The argument can be a string or a list.
Examples:
len("foo") # 3
len([ "a", "b", "c" ]) # 3
)";
} // namespace functions