github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/documentation/generator/metadata.go (about)

     1  package generator
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  
     7  	"github.com/SAP/jenkins-library/pkg/config"
     8  )
     9  
    10  // readStepMetadata reads and parses the provided step metadata file
    11  func readStepMetadata(metadataFilePath string, docuHelperData DocuHelperData) config.StepData {
    12  	stepMetadata := config.StepData{}
    13  	metadataFile, err := docuHelperData.OpenFile(metadataFilePath)
    14  	checkError(err)
    15  	defer metadataFile.Close()
    16  	fmt.Printf("Reading metadata file: %v\n", metadataFilePath)
    17  	err = stepMetadata.ReadPipelineStepData(metadataFile)
    18  	checkError(err)
    19  	return stepMetadata
    20  }
    21  
    22  // adjustDefaultValues corrects the Default value according to the Type.
    23  func adjustDefaultValues(stepMetadata *config.StepData) {
    24  	for key, parameter := range stepMetadata.Spec.Inputs.Parameters {
    25  		var typedDefault interface{} = nil
    26  		if parameter.Type == "bool" {
    27  			typedDefault = false
    28  		}
    29  		if parameter.Default != nil ||
    30  			parameter.Default == typedDefault {
    31  			continue
    32  		}
    33  		fmt.Printf("Changing default value to '%v' for parameter '%s', was '%v'.\n", typedDefault, parameter.Name, parameter.Default)
    34  		stepMetadata.Spec.Inputs.Parameters[key].Default = typedDefault
    35  	}
    36  }
    37  
    38  // adjustMandatoryFlags corrects the Mandatory flag on each parameter if a non-empty default value is provided
    39  func adjustMandatoryFlags(stepMetadata *config.StepData) {
    40  	for key, parameter := range stepMetadata.Spec.Inputs.Parameters {
    41  		if parameter.Mandatory {
    42  			if parameter.Default == nil ||
    43  				parameter.Default == "" ||
    44  				parameter.Type == "[]string" && interfaceArrayLength(parameter.Default) == 0 {
    45  				continue
    46  			}
    47  			fmt.Printf("Changing mandatory flag to '%v' for parameter '%s', default value available '%v'.\n", false, parameter.Name, parameter.Default)
    48  			stepMetadata.Spec.Inputs.Parameters[key].Mandatory = false
    49  		}
    50  	}
    51  }
    52  
    53  // applyCustomDefaultValues applies custom default values from the passed config
    54  func applyCustomDefaultValues(stepMetadata *config.StepData, stepConfiguration config.StepConfig) {
    55  	for key, parameter := range stepMetadata.Spec.Inputs.Parameters {
    56  		configValue := stepConfiguration.Config[parameter.Name]
    57  		if len(parameter.Conditions) != 0 {
    58  			fmt.Printf("Skipping custom default values for '%s' as the parameter depends on other parameter values.\n", parameter.Name)
    59  			continue
    60  		}
    61  		if configValue != nil && configValue != "" {
    62  			switch parameter.Type {
    63  			case "[]string":
    64  				if reflect.DeepEqual(parameter.Default, configValue) {
    65  					continue
    66  				}
    67  				fmt.Printf("Applying custom default value '%v' for parameter '%s', was '%v'.\n", configValue, parameter.Name, parameter.Default)
    68  				stepMetadata.Spec.Inputs.Parameters[key].Default = configValue
    69  			default:
    70  				if parameter.Default != configValue {
    71  					fmt.Printf("Applying custom default value '%v' for parameter '%s', was '%v'.\n", configValue, parameter.Name, parameter.Default)
    72  					stepMetadata.Spec.Inputs.Parameters[key].Default = configValue
    73  				}
    74  			}
    75  		}
    76  	}
    77  }
    78  
    79  // check length only if interface type is a slice
    80  func interfaceArrayLength(i interface{}) int {
    81  	switch i.(type) {
    82  	case []string:
    83  		return len(i.([]string))
    84  	case []interface{}:
    85  		return len(i.([]interface{}))
    86  	default:
    87  		return -1
    88  	}
    89  }