github.com/hrntknr/ntf@v1.0.2-0.20220725163249-d52a7861d93d/utils.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"os"
     7  	"os/user"
     8  	"strings"
     9  	"time"
    10  
    11  	"github.com/adrg/xdg"
    12  	"gopkg.in/yaml.v2"
    13  )
    14  
    15  func getConfig() (map[string]interface{}, error) {
    16  	homeDir, err := os.UserHomeDir()
    17  	if err != nil {
    18  		return nil, err
    19  	}
    20  	configPath := []string{
    21  		homeDir + "/.ntf.yml",
    22  		xdg.ConfigHome + "/.ntf.yml",
    23  	}
    24  	for _, path := range configPath {
    25  		cfg, err := tryConfig(path)
    26  		if err != nil {
    27  			log.Fatal(err)
    28  		}
    29  		if cfg != nil {
    30  			return cfg, nil
    31  		}
    32  	}
    33  	return map[string]interface{}{}, nil
    34  }
    35  
    36  func tryConfig(configPath string) (map[string]interface{}, error) {
    37  	if _, err := os.Stat(configPath); os.IsNotExist(err) {
    38  		return nil, nil
    39  	}
    40  	fp, err := os.Open(configPath)
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  	defer fp.Close()
    45  
    46  	var config map[string]interface{}
    47  	if err := yaml.NewDecoder(fp).Decode(&config); err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	return config, nil
    52  }
    53  
    54  func getContext() (string, error) {
    55  	user, err := user.Current()
    56  	if err != nil {
    57  		return "", err
    58  	}
    59  	hostname, err := os.Hostname()
    60  	if err != nil {
    61  		return "", err
    62  	}
    63  	path, err := os.Getwd()
    64  	if err != nil {
    65  		return "", err
    66  	}
    67  	homeDir, err := os.UserHomeDir()
    68  	if err != nil {
    69  		return "", err
    70  	}
    71  	if strings.HasPrefix(path, homeDir) {
    72  		path = "~" + path[len(homeDir):]
    73  	}
    74  	return fmt.Sprintf("%s@%s:%s", user.Username, hostname, path), nil
    75  }
    76  
    77  func formatDuration(d time.Duration) string {
    78  	if d.Seconds() < 60 {
    79  		return fmt.Sprintf("%ds", int(d.Seconds()))
    80  	}
    81  	if d.Minutes() < 60 {
    82  		return fmt.Sprintf("%dm %ds", int(d.Minutes()), int(d.Seconds())-int(d.Minutes())*60)
    83  	}
    84  	if d.Hours() < 24 {
    85  		return fmt.Sprintf("%dh %dm %ds", int(d.Hours()), int(d.Minutes())-int(d.Hours())*60, int(d.Seconds())-int(d.Minutes())*60)
    86  	}
    87  	return fmt.Sprintf("%dd %dh %dm %ds", int(d.Hours())/24, int(d.Hours())-int(d.Hours())/24*24, int(d.Minutes())-int(d.Hours())*60, int(d.Seconds())-int(d.Minutes())*60)
    88  }