ValidateStruct can receive any kind of type and it should never panic, even if the configuration is not right. If the received type is not a struct, any validation should be skipped and nil must be returned. If the received type is a struct or pointer to a struct, the validation should be performed. If the struct is not valid or the validation itself fails, a descriptive error should be returned. Otherwise nil must be returned.