func validate[T any]()

in common/build_settings.go [147:215]


func validate[T any](variables JobVariables, name string, value *T, def T) error {
	raw := variables.Value(name)
	var err error

	switch v := any(value).(type) {
	case *SubmoduleStrategy:
		switch strategy := SubmoduleStrategy(raw); strategy {
		case SubmoduleNormal, SubmoduleRecursive, SubmoduleNone:
			*v = strategy
		case "":
			*v = SubmoduleNone
		default:
			*value = def
			return fmt.Errorf("%s: expected either 'normal', 'recursive' or 'none' got %q", name, raw)
		}
		return nil

	case *GitStrategy:
		switch strategy := GitStrategy(raw); strategy {
		case GitClone, GitFetch, GitNone, GitEmpty:
			*v = strategy
		case "":
			*value = def
		default:
			*value = def
			return fmt.Errorf("%s: expected either 'clone', 'fetch', 'none' or 'empty' got %q, using default value '%v'", name, raw, def)
		}
		return nil
	}

	// all cases below use a default when the value is empty
	if raw == "" {
		*value = def
		return nil
	}

	switch v := any(value).(type) {
	case *bool:
		*v, err = strconv.ParseBool(raw)
		if err != nil {
			*value = def
			return fmt.Errorf("%s: expected bool got %q, using default value: %v", name, raw, def)
		}

	case *int:
		i, err := strconv.ParseInt(raw, 10, 64)
		*v = int(i)
		if err != nil {
			*value = def
			return fmt.Errorf("%s: expected int got %q, using default value: %v", name, raw, def)
		}

	case *string:
		*v = raw

	case *cmdFlags:
		switch raw {
		case "none":
			*v = cmdFlags{}
		default:
			*v = cmdFlags(strings.Fields(raw))
		}

	case *[]string:
		*v = strings.Fields(raw)
	}

	return nil
}