github.com/defang-io/defang/src@v0.0.0-20240505002154-bdf411911834/pkg/cmd/common.go (about) 1 package cmd 2 3 import ( 4 "os" 5 "strconv" 6 "strings" 7 8 "github.com/defang-io/defang/src/pkg/clouds/aws" 9 "github.com/defang-io/defang/src/pkg/term" 10 ) 11 12 type Region = aws.Region 13 14 func ParseMemory(memory string) uint64 { 15 i := strings.IndexAny(memory, "BKMGIbkmgi") 16 var memUnit uint64 = 1 17 if i > 0 { 18 switch strings.ToUpper(memory[i:]) { 19 default: 20 term.Fatal("invalid suffix: " + memory) 21 case "G", "GIB": 22 memUnit = 1024 * 1024 * 1024 23 case "GB": 24 memUnit = 1000 * 1000 * 1000 25 case "M", "MIB": 26 memUnit = 1024 * 1024 27 case "MB": 28 memUnit = 1000 * 1000 29 case "K", "KIB": 30 memUnit = 1024 31 case "KB": 32 memUnit = 1000 33 case "B": 34 } 35 memory = memory[:i] 36 } 37 memoryB, err := strconv.ParseUint(memory, 10, 64) 38 if err != nil { 39 term.Fatal(err.Error()) 40 } 41 return memoryB * memUnit 42 } 43 44 func ParseEnvLine(line string) (key string, value string) { 45 parts := strings.SplitN(line, "=", 2) 46 key = strings.TrimSpace(parts[0]) // FIXME: docker only trims leading whitespace 47 if key == "" || key[0] == '#' { 48 return "", "" 49 } 50 if len(parts) == 1 { 51 var ok bool 52 if value, ok = os.LookupEnv(key); !ok { // exclude missing env vars, like docker does 53 return "", "" 54 } 55 } else { 56 value = parts[1] 57 } 58 return 59 } 60 61 func parseEnvFile(content string, env map[string]string) map[string]string { 62 if env == nil { 63 env = make(map[string]string) 64 } 65 for _, line := range strings.Split(content, "\n") { 66 key, value := ParseEnvLine(strings.TrimSuffix(line, "\r")) // handle CRLF 67 if key == "" { 68 continue 69 } 70 env[key] = value 71 } 72 return env 73 } 74 75 func ParseEnvFile(filename string, env map[string]string) (map[string]string, error) { 76 bytes, err := os.ReadFile(filename) 77 if err != nil { 78 return nil, err 79 } 80 return parseEnvFile(string(bytes), env), nil 81 }