chore: introduces golangci-lint (#32)

* refactor: fix code with golangci-lint
* ci: configure golangci-lint
* Closes #13
This commit is contained in:
Shunsuke Suzuki 2020-12-20 19:04:51 +09:00 committed by GitHub
parent f10da47da8
commit 554797dfd9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 123 additions and 75 deletions

17
.github/workflows/golangci-lint.yaml vendored Normal file
View file

@ -0,0 +1,17 @@
---
name: golangci-lint
on:
push:
branches:
- master
pull_request:
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: golangci-lint
uses: golangci/golangci-lint-action@v2
with:
version: v1.33

7
.golangci.yml Normal file
View file

@ -0,0 +1,7 @@
linters-settings:
errcheck:
# https://github.com/hashicorp/terraform-provider-aws/blob/9c9a116a857fb838a0e7d1cfbf420c2524f0abe1/.golangci.yml#L37-L39
ignore: github.com/hashicorp/terraform-plugin-sdk/helper/schema:ForceNew|Set,fmt:.*,io:Close
run:
timeout: 10m

View file

@ -38,7 +38,7 @@ func buildHTTPClientFromBytes(caPEMCert, certPEMBlock, keyPEMBlock []byte) (*htt
tlsConfig.Certificates = []tls.Certificate{tlsCert}
}
if caPEMCert == nil || len(caPEMCert) == 0 {
if len(caPEMCert) == 0 {
tlsConfig.InsecureSkipVerify = true
} else {
caPool := x509.NewCertPool()

View file

@ -110,7 +110,7 @@ func dataSourceDockerNetworkRead(d *schema.ResourceData, meta interface{}) error
"ip_range": config.IPRange,
}
}
err = d.Set("ipam_config", ipam)
d.Set("ipam_config", ipam)
return nil
}

View file

@ -559,7 +559,9 @@ func resourceDockerContainerRead(d *schema.ResourceData, meta interface{}) error
if finishTime.After(creationTime) {
// It exited immediately, so error out so dependent containers
// aren't started
resourceDockerContainerDelete(d, meta)
if err := resourceDockerContainerDelete(d, meta); err != nil {
log.Printf("[ERROR] Container %s failed to be deleted: %v", apiContainer.ID, err)
}
return fmt.Errorf("Container %s exited after creation, error was: %s", apiContainer.ID, container.State.Error)
}
@ -568,7 +570,9 @@ func resourceDockerContainerRead(d *schema.ResourceData, meta interface{}) error
// Handle the case of the for loop above running its course
if !container.State.Running && d.Get("must_run").(bool) {
resourceDockerContainerDelete(d, meta)
if err := resourceDockerContainerDelete(d, meta); err != nil {
log.Printf("[ERROR] Container %s failed to be deleted: %v", apiContainer.ID, err)
}
return fmt.Errorf("Container %s failed to be in running state", apiContainer.ID)
}

View file

@ -97,7 +97,7 @@ func updateV0ToV1PortsOrder(is *terraform.InstanceState, meta interface{}) error
// map the sorted ports to an output structure tf can write
outputPorts := make([]interface{}, 0)
for _, mappedPort := range portsMapped {
outputPort := make(map[string]interface{}, 0)
outputPort := make(map[string]interface{})
outputPort["internal"] = mappedPort.internal
outputPort["external"] = mappedPort.external
outputPort["ip"] = mappedPort.ip

View file

@ -667,7 +667,9 @@ func TestAccDockerContainer_upload(t *testing.T) {
}
fbuf := new(bytes.Buffer)
fbuf.ReadFrom(tr)
if _, err := fbuf.ReadFrom(tr); err != nil {
return err
}
content := fbuf.String()
if content != "foo" {
@ -729,7 +731,9 @@ func TestAccDockerContainer_uploadSource(t *testing.T) {
}
fbuf := new(bytes.Buffer)
fbuf.ReadFrom(tr)
if _, err := fbuf.ReadFrom(tr); err != nil {
return err
}
content := fbuf.String()
if content != string(testFileContent) {
return fmt.Errorf("file content is invalid")
@ -831,7 +835,9 @@ func TestAccDockerContainer_uploadAsBase64(t *testing.T) {
}
fbuf := new(bytes.Buffer)
fbuf.ReadFrom(tr)
if _, err := fbuf.ReadFrom(tr); err != nil {
return err
}
gotContent := fbuf.String()
if wantedContent != gotContent {
@ -982,7 +988,9 @@ func TestAccDockerContainer_device(t *testing.T) {
}
fbuf := new(bytes.Buffer)
fbuf.ReadFrom(tr)
if _, err := fbuf.ReadFrom(tr); err != nil {
return err
}
content := fbuf.Bytes()
if len(content) != 10 {

View file

@ -39,7 +39,9 @@ func decodeBuildMessages(response types.ImageBuildResponse) (string, error) {
return buf.String(), fmt.Errorf("Problem decoding message from docker daemon: %s", err)
}
m.Display(buf, false)
if err := m.Display(buf, false); err != nil {
return "", err
}
if m.Error != nil {
buildErr = fmt.Errorf("Unable to build image")
@ -126,7 +128,6 @@ func searchLocalImages(data Data, imageName string) *types.ImageSummary {
}
if apiImage, ok := data.DockerImages[imageName+":latest"]; ok {
log.Printf("[DEBUG] found local image via imageName + latest: %v", imageName)
imageName = imageName + ":latest"
return apiImage
}
return nil
@ -218,7 +219,9 @@ func pullImage(data *Data, client *client.Client, authConfig *AuthConfigs, image
defer out.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(out)
if _, err := buf.ReadFrom(out); err != nil {
return err
}
s := buf.String()
log.Printf("[DEBUG] pulled image %v: %v", image, s)

View file

@ -206,7 +206,9 @@ func testAccDockerImageDestroy(s *terraform.State) error {
func TestAccDockerImage_build(t *testing.T) {
wd, _ := os.Getwd()
dfPath := path.Join(wd, "Dockerfile")
ioutil.WriteFile(dfPath, []byte(testDockerFileExample), 0o644)
if err := ioutil.WriteFile(dfPath, []byte(testDockerFileExample), 0o644); err != nil {
t.Fatalf("failed to create a Dockerfile %s for test: %+v", dfPath, err)
}
defer os.Remove(dfPath)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },

View file

@ -249,7 +249,7 @@ func resourceDockerNetworkV0() *schema.Resource {
}
}
func suppressIfIPAMConfigWithIpv6Changes() schema.SchemaDiffSuppressFunc {
func suppressIfIPAMConfigWithIpv6Changes() schema.SchemaDiffSuppressFunc { //nolint:deadcode,unused
return func(k, old, new string, d *schema.ResourceData) bool {
// the initial case when the resource is created
if old == "" && new != "" {

View file

@ -206,7 +206,7 @@ func resourceDockerNetworkRemoveRefreshFunc(
// TODO mavogel: separate structure file
// TODO 2: seems like we can replace the set hash generation with plain lists -> #219
func flattenIpamConfigSpec(in []network.IPAMConfig) *schema.Set { // []interface{} {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
log.Printf("[DEBUG] flatten ipam %d: %#v", i, v)
m := make(map[string]interface{})

View file

@ -259,7 +259,7 @@ func TestAccDockerNetwork_ipv6(t *testing.T) {
})
}
func testAccNetworkIPv6(network *types.NetworkResource, internal bool) resource.TestCheckFunc {
func testAccNetworkIPv6(network *types.NetworkResource, internal bool) resource.TestCheckFunc { //nolint:unused
return func(s *terraform.State) error {
if !network.EnableIPv6 {
return fmt.Errorf("Bad value for attribute 'ipv6': %t", network.EnableIPv6)
@ -317,7 +317,7 @@ func TestAccDockerNetwork_labels(t *testing.T) {
})
}
func testAccNetworkLabel(network *types.NetworkResource, name string, value string) resource.TestCheckFunc {
func testAccNetworkLabel(network *types.NetworkResource, name string, value string) resource.TestCheckFunc { //nolint:deadcode,unused
return func(s *terraform.State) error {
if network.Labels[name] != value {
return fmt.Errorf("Bad value for label '%s': %s", name, network.Labels[name])

View file

@ -178,6 +178,9 @@ func buildDockerRegistryImage(client *client.Client, buildOptions map[string]int
}
defer os.Remove(dockerContextTarPath)
dockerBuildContext, err := os.Open(dockerContextTarPath)
if err != nil {
return err
}
defer dockerBuildContext.Close()
buildResponse, err := client.ImageBuild(context.Background(), dockerBuildContext, imageBuildOptions)
@ -210,7 +213,7 @@ func buildDockerImageContextTar(buildContext string) (string, error) {
tw := tar.NewWriter(tmpFile)
defer tw.Close()
err = filepath.Walk(buildContext, func(file string, info os.FileInfo, err error) error {
if err := filepath.Walk(buildContext, func(file string, info os.FileInfo, err error) error {
// return on any error
if err != nil {
return err
@ -251,7 +254,9 @@ func buildDockerImageContextTar(buildContext string) (string, error) {
f.Close()
return nil
})
}); err != nil {
return "", err
}
return tmpFile.Name(), nil
}
@ -262,7 +267,9 @@ func getDockerImageContextTarHash(dockerContextTarPath string) (string, error) {
if err != nil {
return "", err
}
hasher.Write(s)
if _, err := hasher.Write(s); err != nil {
return "", err
}
contextHash := hex.EncodeToString(hasher.Sum(nil))
return contextHash, nil
}
@ -295,7 +302,9 @@ func pushDockerRegistryImage(client *client.Client, pushOpts internalPushImageOp
if err == io.EOF {
break
}
json.Unmarshal(streamBytes, &errorMessage)
if err := json.Unmarshal(streamBytes, &errorMessage); err != nil {
return err
}
if errorMessage.Error != "" {
return fmt.Errorf("Error pushing image: %s", errorMessage.Error)
}
@ -401,6 +410,9 @@ func deleteDockerRegistryImage(pushOpts internalPushImageOptions, sha256Digest,
req.Header.Set("Authorization", "Bearer "+token.Token)
oauthResp, err := client.Do(req)
if err != nil {
return err
}
switch oauthResp.StatusCode {
case http.StatusOK, http.StatusAccepted, http.StatusNotFound:
return nil

View file

@ -1135,7 +1135,8 @@ func createLogDriver(v interface{}) (*swarm.Driver, error) {
if rawOptions, ok := rawLogging["options"]; ok {
logDriver.Options = mapTypeMapValsToString(rawOptions.(map[string]interface{}))
}
return &logDriver, nil
// TODO SA4004: the surrounding loop is unconditionally terminated (staticcheck)
return &logDriver, nil //nolint:staticcheck
}
}
return nil, nil
@ -1329,7 +1330,7 @@ func fromRegistryAuth(image string, authConfigs map[string]types.AuthConfig) typ
// retrieveAndMarshalAuth retrieves and marshals the service registry auth
func retrieveAndMarshalAuth(d *schema.ResourceData, meta interface{}, stageType string) []byte {
auth := types.AuthConfig{}
var auth types.AuthConfig
if v, ok := d.GetOk("auth"); ok {
auth = authToServiceAuth(v.(map[string]interface{}))
} else {
@ -1407,8 +1408,6 @@ var (
swarm.TaskStateFailed: 12,
swarm.TaskStateRejected: 13,
}
longestState int
)
// serviceCreatePendingStates are the pending states for the creation of a service

View file

@ -63,12 +63,10 @@ func TestDockerSecretFromRegistryAuth_multiple(t *testing.T) {
checkAttribute(t, "ServerAddress", foundAuthConfig.ServerAddress, "")
}
func checkAttribute(t *testing.T, name, actual, expected string) error {
func checkAttribute(t *testing.T, name, actual, expected string) {
if actual != expected {
t.Fatalf("bad authconfig attribute for '%q'\nExpected: %s\n Got: %s", name, expected, actual)
}
return nil
}
func TestDockerImageNameSuppress(t *testing.T) {

View file

@ -92,7 +92,7 @@ func TestAccDockerVolume_labels(t *testing.T) {
})
}
func testAccVolumeLabel(volume *types.Volume, name string, value string) resource.TestCheckFunc {
func testAccVolumeLabel(volume *types.Volume, name string, value string) resource.TestCheckFunc { //nolint:deadcode,unused
return func(s *terraform.State) error {
if volume.Labels[name] != value {
return fmt.Errorf("Bad value for label '%s': %s", name, volume.Labels[name])

View file

@ -25,9 +25,7 @@ func flattenTaskSpec(in swarm.TaskSpec) []interface{} {
if in.Placement != nil {
m["placement"] = flattenTaskPlacement(in.Placement)
}
if in.ForceUpdate >= 0 {
m["force_update"] = in.ForceUpdate
}
m["force_update"] = in.ForceUpdate
if len(in.Runtime) > 0 {
m["runtime"] = in.Runtime
}
@ -56,7 +54,7 @@ func flattenServiceMode(in swarm.ServiceMode) []interface{} {
}
func flattenReplicated(in *swarm.ReplicatedService) []interface{} {
out := make([]interface{}, 0, 0)
out := make([]interface{}, 0)
m := make(map[string]interface{})
if in != nil {
if in.Replicas != nil {
@ -69,7 +67,7 @@ func flattenReplicated(in *swarm.ReplicatedService) []interface{} {
}
func flattenServiceUpdateOrRollbackConfig(in *swarm.UpdateConfig) []interface{} {
out := make([]interface{}, 0, 0)
out := make([]interface{}, 0)
if in == nil {
return out
}
@ -86,7 +84,7 @@ func flattenServiceUpdateOrRollbackConfig(in *swarm.UpdateConfig) []interface{}
}
func flattenServiceEndpoint(in swarm.Endpoint) []interface{} {
out := make([]interface{}, 0, 0)
out := make([]interface{}, 0)
m := make(map[string]interface{})
m["mode"] = string(in.Spec.Mode)
m["ports"] = flattenServicePorts(in.Ports)
@ -96,7 +94,7 @@ func flattenServiceEndpoint(in swarm.Endpoint) []interface{} {
}
func flattenServiceEndpointSpec(in *swarm.EndpointSpec) []interface{} {
out := make([]interface{}, 0, 0)
out := make([]interface{}, 0)
m := make(map[string]interface{})
m["mode"] = string(in.Mode)
m["ports"] = flattenServicePorts(in.Ports)
@ -107,7 +105,7 @@ func flattenServiceEndpointSpec(in *swarm.EndpointSpec) []interface{} {
///// start TaskSpec
func flattenContainerSpec(in *swarm.ContainerSpec) []interface{} {
out := make([]interface{}, 0, 0)
out := make([]interface{}, 0)
m := make(map[string]interface{})
if len(in.Image) > 0 {
m["image"] = in.Image
@ -175,14 +173,14 @@ func flattenContainerSpec(in *swarm.ContainerSpec) []interface{} {
func flattenPrivileges(in *swarm.Privileges) []interface{} {
if in == nil {
return make([]interface{}, 0, 0)
return make([]interface{}, 0)
}
out := make([]interface{}, 1, 1)
out := make([]interface{}, 1)
m := make(map[string]interface{})
if in.CredentialSpec != nil {
credSpec := make([]interface{}, 1, 1)
credSpec := make([]interface{}, 1)
internal := make(map[string]interface{})
internal["file"] = in.CredentialSpec.File
internal["registry"] = in.CredentialSpec.Registry
@ -190,7 +188,7 @@ func flattenPrivileges(in *swarm.Privileges) []interface{} {
m["credential_spec"] = credSpec
}
if in.SELinuxContext != nil {
seLinuxContext := make([]interface{}, 1, 1)
seLinuxContext := make([]interface{}, 1)
internal := make(map[string]interface{})
internal["disable"] = in.SELinuxContext.Disable
internal["user"] = in.SELinuxContext.User
@ -205,7 +203,7 @@ func flattenPrivileges(in *swarm.Privileges) []interface{} {
}
func flattenServiceMounts(in []mount.Mount) *schema.Set {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
m := make(map[string]interface{})
m["target"] = v.Target
@ -213,8 +211,8 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set {
m["type"] = string(v.Type)
m["read_only"] = v.ReadOnly
if v.BindOptions != nil {
bindOptions := make([]interface{}, 0, 0)
bindOptionsItem := make(map[string]interface{}, 0)
bindOptions := make([]interface{}, 0)
bindOptionsItem := make(map[string]interface{})
if len(v.BindOptions.Propagation) > 0 {
bindOptionsItem["propagation"] = string(v.BindOptions.Propagation)
@ -225,8 +223,8 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set {
}
if v.VolumeOptions != nil {
volumeOptions := make([]interface{}, 0, 0)
volumeOptionsItem := make(map[string]interface{}, 0)
volumeOptions := make([]interface{}, 0)
volumeOptionsItem := make(map[string]interface{})
volumeOptionsItem["no_copy"] = v.VolumeOptions.NoCopy
volumeOptionsItem["labels"] = mapToLabelSet(v.VolumeOptions.Labels)
@ -242,8 +240,8 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set {
}
if v.TmpfsOptions != nil {
tmpfsOptions := make([]interface{}, 0, 0)
tmpfsOptionsItem := make(map[string]interface{}, 0)
tmpfsOptions := make([]interface{}, 0)
tmpfsOptionsItem := make(map[string]interface{})
tmpfsOptionsItem["size_bytes"] = int(v.TmpfsOptions.SizeBytes)
tmpfsOptionsItem["mode"] = v.TmpfsOptions.Mode.Perm
@ -263,10 +261,10 @@ func flattenServiceMounts(in []mount.Mount) *schema.Set {
func flattenServiceHealthcheck(in *container.HealthConfig) []interface{} {
if in == nil {
return make([]interface{}, 0, 0)
return make([]interface{}, 0)
}
out := make([]interface{}, 1, 1)
out := make([]interface{}, 1)
m := make(map[string]interface{})
if len(in.Test) > 0 {
m["test"] = in.Test
@ -280,7 +278,7 @@ func flattenServiceHealthcheck(in *container.HealthConfig) []interface{} {
}
func flattenServiceHosts(in []string) *schema.Set {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
m := make(map[string]interface{})
split := strings.Split(v, ":")
@ -297,10 +295,10 @@ func flattenServiceHosts(in []string) *schema.Set {
func flattenServiceDNSConfig(in *swarm.DNSConfig) []interface{} {
if in == nil {
return make([]interface{}, 0, 0)
return make([]interface{}, 0)
}
out := make([]interface{}, 1, 1)
out := make([]interface{}, 1)
m := make(map[string]interface{})
if len(in.Nameservers) > 0 {
m["nameservers"] = in.Nameservers
@ -316,7 +314,7 @@ func flattenServiceDNSConfig(in *swarm.DNSConfig) []interface{} {
}
func flattenServiceSecrets(in []*swarm.SecretReference) *schema.Set {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
m := make(map[string]interface{})
m["secret_id"] = v.SecretID
@ -343,7 +341,7 @@ func flattenServiceSecrets(in []*swarm.SecretReference) *schema.Set {
}
func flattenServiceConfigs(in []*swarm.ConfigReference) *schema.Set {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
m := make(map[string]interface{})
m["config_id"] = v.ConfigID
@ -370,7 +368,7 @@ func flattenServiceConfigs(in []*swarm.ConfigReference) *schema.Set {
}
func flattenTaskResources(in *swarm.ResourceRequirements) []interface{} {
out := make([]interface{}, 0, 0)
out := make([]interface{}, 0)
if in != nil {
m := make(map[string]interface{})
m["limits"] = flattenResourceLimitsOrReservations(in.Limits)
@ -381,7 +379,7 @@ func flattenTaskResources(in *swarm.ResourceRequirements) []interface{} {
}
func flattenResourceLimitsOrReservations(in *swarm.Resources) []interface{} {
out := make([]interface{}, 0, 0)
out := make([]interface{}, 0)
if in != nil {
m := make(map[string]interface{})
m["nano_cpus"] = in.NanoCPUs
@ -393,8 +391,8 @@ func flattenResourceLimitsOrReservations(in *swarm.Resources) []interface{} {
}
func flattenResourceGenericResource(in []swarm.GenericResource) []interface{} {
out := make([]interface{}, 0, 0)
if in != nil && len(in) > 0 {
out := make([]interface{}, 0)
if len(in) > 0 {
m := make(map[string]interface{})
named := make([]string, 0)
discrete := make([]string, 0)
@ -433,9 +431,9 @@ func flattenTaskRestartPolicy(in *swarm.RestartPolicy) map[string]interface{} {
func flattenTaskPlacement(in *swarm.Placement) []interface{} {
if in == nil {
return make([]interface{}, 0, 0)
return make([]interface{}, 0)
}
out := make([]interface{}, 1, 1)
out := make([]interface{}, 1)
m := make(map[string]interface{})
if len(in.Constraints) > 0 {
m["constraints"] = newStringSet(schema.HashString, in.Constraints)
@ -451,11 +449,11 @@ func flattenTaskPlacement(in *swarm.Placement) []interface{} {
}
func flattenPlacementPrefs(in []swarm.PlacementPreference) *schema.Set {
if in == nil || len(in) == 0 {
return schema.NewSet(schema.HashString, make([]interface{}, 0, 0))
if len(in) == 0 {
return schema.NewSet(schema.HashString, make([]interface{}, 0))
}
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
out[i] = v.Spread.SpreadDescriptor
}
@ -463,7 +461,7 @@ func flattenPlacementPrefs(in []swarm.PlacementPreference) *schema.Set {
}
func flattenPlacementPlatforms(in []swarm.Platform) *schema.Set {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
m := make(map[string]interface{})
m["architecture"] = v.Architecture
@ -477,7 +475,7 @@ func flattenPlacementPlatforms(in []swarm.Platform) *schema.Set {
}
func flattenTaskNetworks(in []swarm.NetworkAttachmentConfig) *schema.Set {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
out[i] = v.Target
}
@ -486,10 +484,10 @@ func flattenTaskNetworks(in []swarm.NetworkAttachmentConfig) *schema.Set {
func flattenTaskLogDriver(in *swarm.Driver) []interface{} {
if in == nil {
return make([]interface{}, 0, 0)
return make([]interface{}, 0)
}
out := make([]interface{}, 1, 1)
out := make([]interface{}, 1)
m := make(map[string]interface{})
m["name"] = in.Name
if len(in.Options) > 0 {
@ -502,7 +500,7 @@ func flattenTaskLogDriver(in *swarm.Driver) []interface{} {
///// end TaskSpec
///// start EndpointSpec
func flattenServicePorts(in []swarm.PortConfig) []interface{} {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
m := make(map[string]interface{})
m["name"] = v.Name
@ -530,7 +528,7 @@ func shortDur(d time.Duration) string {
}
func newStringSet(f schema.SchemaSetFunc, in []string) *schema.Set {
out := make([]interface{}, len(in), len(in))
out := make([]interface{}, len(in))
for i, v := range in {
out[i] = v
}
@ -555,8 +553,8 @@ func mapStringSliceToMap(in []string) map[string]string {
// mapStringStringToMapStringInterface maps a string string map to a string interface map
func mapStringStringToMapStringInterface(in map[string]string) map[string]interface{} {
if in == nil || len(in) == 0 {
return make(map[string]interface{}, 0)
if len(in) == 0 {
return make(map[string]interface{})
}
mapped := make(map[string]interface{}, len(in))

View file

@ -49,9 +49,9 @@ func validateFloatRatio() schema.SchemaValidateFunc {
func validateStringIsFloatRatio() schema.SchemaValidateFunc {
return func(v interface{}, k string) (ws []string, errors []error) {
switch v.(type) {
switch t := v.(type) {
case string:
stringValue := v.(string)
stringValue := t
value, err := strconv.ParseFloat(stringValue, 64)
if err != nil {
errors = append(errors, fmt.Errorf(
@ -62,7 +62,7 @@ func validateStringIsFloatRatio() schema.SchemaValidateFunc {
"%q has to be between 0.0 and 1.0", k))
}
case int:
value := float64(v.(int))
value := float64(t)
if value < 0.0 || value > 1.0 {
errors = append(errors, fmt.Errorf(
"%q has to be between 0.0 and 1.0", k))