envvar.go raw

   1  // Copyright 2022-2025 The sacloud/packages-go Authors
   2  //
   3  // Licensed under the Apache License, Version 2.0 (the "License");
   4  // you may not use this file except in compliance with the License.
   5  // You may obtain a copy of the License at
   6  //
   7  //      http://www.apache.org/licenses/LICENSE-2.0
   8  //
   9  // Unless required by applicable law or agreed to in writing, software
  10  // distributed under the License is distributed on an "AS IS" BASIS,
  11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12  // See the License for the specific language governing permissions and
  13  // limitations under the License.
  14  
  15  package envvar
  16  
  17  import (
  18  	"os"
  19  	"strconv"
  20  	"strings"
  21  )
  22  
  23  // StringFromEnv 環境変数から指定のキーの値を読み取って返す。ゼロ値だった場合はdefaultValueを返す
  24  func StringFromEnv(key, defaultValue string) string {
  25  	v := os.Getenv(key)
  26  	if v == "" {
  27  		return defaultValue
  28  	}
  29  	return v
  30  }
  31  
  32  // StringFromEnvMulti 指定の環境変数を順番に読み取り、最初に見つかった非ゼロ値を返す。すべてゼロ値だった場合はdefaultValueを返す
  33  func StringFromEnvMulti(keys []string, defaultValue string) string {
  34  	for _, key := range keys {
  35  		v := os.Getenv(key)
  36  		if v != "" {
  37  			return v
  38  		}
  39  	}
  40  	return defaultValue
  41  }
  42  
  43  // StringSliceFromEnv 環境変数から指定のキーの値を読み取って、スライスに変換して返す。
  44  //
  45  // 読み取った環境変数の値がゼロ値の場合はdefaultValueを返す。
  46  // 以外の場合はカンマで区切り、半角スペースをトリムした上でスライスに格納して返す。
  47  func StringSliceFromEnv(key string, defaultValue []string) []string {
  48  	v := os.Getenv(key)
  49  	if v == "" {
  50  		return defaultValue
  51  	}
  52  	values := strings.Split(v, ",")
  53  	for i := range values {
  54  		values[i] = strings.Trim(values[i], " ")
  55  	}
  56  	return values
  57  }
  58  
  59  // StringSliceFromEnvMulti 指定の環境変数を順番に読み取り、スライスに変換して返す。
  60  //
  61  // 読み取った環境変数の値がゼロ値の場合はdefaultValueを返す。
  62  // 以外の場合はカンマで区切り、半角スペースをトリムした上でスライスに格納して返す。
  63  func StringSliceFromEnvMulti(keys []string, defaultValue []string) []string {
  64  	for _, key := range keys {
  65  		v := os.Getenv(key)
  66  		if v != "" {
  67  			values := strings.Split(v, ",")
  68  			for i := range values {
  69  				values[i] = strings.Trim(values[i], " ")
  70  			}
  71  			return values
  72  		}
  73  	}
  74  	return defaultValue
  75  }
  76  
  77  // IntFromEnv 環境変数から指定のキーの値を読み取って返す。ゼロ値だった場合はdefaultValueを返す
  78  func IntFromEnv(key string, defaultValue int) int {
  79  	v := os.Getenv(key)
  80  	if v == "" {
  81  		return defaultValue
  82  	}
  83  	i, err := strconv.ParseInt(v, 10, 64)
  84  	if err != nil {
  85  		return defaultValue
  86  	}
  87  	return int(i)
  88  }
  89  
  90  // IntFromEnvMulti 指定の環境変数を順番に読み取り、最初に見つかった非ゼロ値を返す。すべてゼロ値だった場合はdefaultValueを返す
  91  func IntFromEnvMulti(keys []string, defaultValue int) int {
  92  	for _, key := range keys {
  93  		v := os.Getenv(key)
  94  		if v != "" {
  95  			i, err := strconv.ParseInt(v, 10, 64)
  96  			if err != nil {
  97  				return defaultValue
  98  			}
  99  			return int(i)
 100  		}
 101  	}
 102  	return defaultValue
 103  }
 104  
 105  // Int64FromEnv 環境変数から指定のキーの値を読み取って返す。ゼロ値だった場合はdefaultValueを返す
 106  func Int64FromEnv(key string, defaultValue int64) int64 {
 107  	v := os.Getenv(key)
 108  	if v == "" {
 109  		return defaultValue
 110  	}
 111  	i, err := strconv.ParseInt(v, 10, 64)
 112  	if err != nil {
 113  		return defaultValue
 114  	}
 115  	return i
 116  }
 117  
 118  // Int64FromEnvMulti 指定の環境変数を順番に読み取り、最初に見つかった非ゼロ値を返す。すべてゼロ値だった場合はdefaultValueを返す
 119  func Int64FromEnvMulti(keys []string, defaultValue int64) int64 {
 120  	for _, key := range keys {
 121  		v := os.Getenv(key)
 122  		if v != "" {
 123  			i, err := strconv.ParseInt(v, 10, 64)
 124  			if err != nil {
 125  				return defaultValue
 126  			}
 127  			return i
 128  		}
 129  	}
 130  	return defaultValue
 131  }
 132