| 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) |
| } |
| } |