blob: 8004c6ef03f337d27c71a644879a3ecc87b2fc1c [file] [log] [blame]
// Copyright 2022 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.starlarkbuildapi;
import com.google.devtools.build.docgen.annot.DocCategory;
import com.google.devtools.build.lib.collect.nestedset.Depset;
import net.starlark.java.annot.Param;
import net.starlark.java.annot.ParamType;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.NoneType;
import net.starlark.java.eval.StarlarkCallable;
import net.starlark.java.eval.StarlarkThread;
import net.starlark.java.eval.StarlarkValue;
/** Template expansion dict module. */
@StarlarkBuiltin(
name = "TemplateDict",
category = DocCategory.BUILTIN,
doc =
"An Args-like structure for use in ctx.actions.expand_template(), which allows for"
+ " deferring evaluation of values till the execution phase.")
public interface TemplateDictApi extends StarlarkValue {
@StarlarkMethod(
name = "add",
doc = "Add a String value",
parameters = {
@Param(name = "key", doc = "A String key"),
@Param(name = "value", doc = "A String value")
},
useStarlarkThread = true)
TemplateDictApi addArgument(String key, String value, StarlarkThread thread) throws EvalException;
@StarlarkMethod(
name = "add_joined",
doc = "Add depset of values",
parameters = {
@Param(name = "key", doc = "A String key"),
@Param(
name = "values",
allowedTypes = {
@ParamType(type = Depset.class),
},
doc = "The depset whose items will be joined."),
@Param(
name = "join_with",
named = true,
positional = false,
doc =
"A delimiter string used to join together the strings obtained from applying "
+ "<code>map_each</code>, in the same manner as "
+ "<a href='../core/string.html#join'><code>string.join()</code></a>."),
@Param(
name = "map_each",
allowedTypes = {
@ParamType(type = StarlarkCallable.class),
},
named = true,
positional = false,
doc =
"A Starlark function accepting a single argument and returning either a string, "
+ "<code>None</code>, or a list of strings. This function is applied to each "
+ "item of the depset specified in the <code>values</code> parameter"),
@Param(
name = "uniquify",
named = true,
positional = false,
defaultValue = "False",
doc =
"If true, duplicate strings derived from <code>values</code> will be omitted. Only "
+ "the first occurrence of each string will remain. Usually this feature is "
+ "not needed because depsets already omit duplicates, but it can be useful "
+ "if <code>map_each</code> emits the same string for multiple items."),
@Param(
name = "format_joined",
allowedTypes = {
@ParamType(type = String.class),
@ParamType(type = NoneType.class),
},
named = true,
positional = false,
defaultValue = "None",
doc =
"An optional format string pattern applied to the joined string. "
+ "The format string must have exactly one '%s' placeholder."),
@Param(
name = "allow_closure",
named = true,
positional = false,
defaultValue = "False",
doc =
"If true, allows the use of closures in function parameters like "
+ "<code>map_each</code>. Usually this isn't necessary and it risks retaining "
+ "large analysis-phase data structures into the execution phase."),
},
useStarlarkThread = true)
TemplateDictApi addJoined(
String key,
Depset values,
String joinWith,
StarlarkCallable mapEach,
Boolean uniquify,
Object formatJoined,
Boolean allowClosure,
StarlarkThread thread)
throws EvalException;
}