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  }