blob: c4ab36c354cdf313a8abd0107ff29d24e2c245a3 [file] [log] [blame]
package cquery
import (
"strings"
)
var (
GetOutputFiles RequestType = &getOutputFilesRequestType{}
GetOutputFilesAndCcObjectFiles RequestType = &getOutputFilesAndCcObjectFilesType{}
)
type GetOutputFilesAndCcObjectFiles_Result struct {
OutputFiles []string
CcObjectFiles []string
}
var RequestTypes []RequestType = []RequestType{
GetOutputFiles,
GetOutputFilesAndCcObjectFiles,
}
type RequestType interface {
// Name returns a string name for this request type. Such request type names must be unique,
// and must only consist of alphanumeric characters.
Name() string
// StarlarkFunctionBody returns a straark function body to process this request type.
// The returned string is the body of a Starlark function which obtains
// all request-relevant information about a target and returns a string containing
// this information.
// The function should have the following properties:
// - `target` is the only parameter to this function (a configured target).
// - The return value must be a string.
// - The function body should not be indented outside of its own scope.
StarlarkFunctionBody() string
// ParseResult returns a value obtained by parsing the result of the request's Starlark function.
// The given rawString must correspond to the string output which was created by evaluating the
// Starlark given in StarlarkFunctionBody.
// The type of this value depends on the request type; it is up to the caller to
// cast to the correct type.
ParseResult(rawString string) interface{}
}
type getOutputFilesRequestType struct{}
func (g getOutputFilesRequestType) Name() string {
return "getOutputFiles"
}
func (g getOutputFilesRequestType) StarlarkFunctionBody() string {
return "return ', '.join([f.path for f in target.files.to_list()])"
}
func (g getOutputFilesRequestType) ParseResult(rawString string) interface{} {
return strings.Split(rawString, ", ")
}
type getOutputFilesAndCcObjectFilesType struct{}
func (g getOutputFilesAndCcObjectFilesType) Name() string {
return "getOutputFilesAndCcObjectFiles"
}
func (g getOutputFilesAndCcObjectFilesType) StarlarkFunctionBody() string {
return `
outputFiles = [f.path for f in target.files.to_list()]
ccObjectFiles = []
linker_inputs = providers(target)["CcInfo"].linking_context.linker_inputs.to_list()
for linker_input in linker_inputs:
for library in linker_input.libraries:
for object in library.objects:
ccObjectFiles += [object.path]
return ', '.join(outputFiles) + "|" + ', '.join(ccObjectFiles)`
}
func (g getOutputFilesAndCcObjectFilesType) ParseResult(rawString string) interface{} {
var outputFiles []string
var ccObjects []string
splitString := strings.Split(rawString, "|")
outputFilesString := splitString[0]
ccObjectsString := splitString[1]
outputFiles = splitOrEmpty(outputFilesString, ", ")
ccObjects = splitOrEmpty(ccObjectsString, ", ")
return GetOutputFilesAndCcObjectFiles_Result{outputFiles, ccObjects}
}
// splitOrEmpty is a modification of strings.Split() that returns an empty list
// if the given string is empty.
func splitOrEmpty(s string, sep string) []string {
if len(s) < 1 {
return []string{}
} else {
return strings.Split(s, sep)
}
}