github.com/wtfutil/wtf@v0.43.0/modules/power/battery_linux.go (about) 1 //go:build linux 2 3 package power 4 5 import ( 6 "fmt" 7 "os/exec" 8 "strconv" 9 "strings" 10 11 "github.com/wtfutil/wtf/utils" 12 ) 13 14 var batteryState string 15 16 type Battery struct { 17 result string 18 19 Charge string 20 Remaining string 21 } 22 23 func NewBattery() *Battery { 24 return &Battery{} 25 } 26 27 /* -------------------- Exported Functions -------------------- */ 28 29 func (battery *Battery) Refresh() { 30 data := battery.execute() 31 battery.result = battery.parse(data) 32 } 33 34 func (battery *Battery) String() string { 35 return battery.result 36 } 37 38 /* -------------------- Unexported Functions -------------------- */ 39 40 func (battery *Battery) execute() string { 41 cmd := exec.Command("upower", "-e") 42 lines := strings.Split(utils.ExecuteCommand(cmd), "\n") 43 var target string 44 for _, l := range lines { 45 if strings.Contains(l, "/battery") { 46 target = l 47 break 48 } 49 } 50 cmd = exec.Command("upower", "-i", target) 51 return utils.ExecuteCommand(cmd) 52 } 53 54 func (battery *Battery) parse(data string) string { 55 lines := strings.Split(data, "\n") 56 if len(lines) < 2 { 57 return "unknown" 58 } 59 table := make(map[string]string) 60 for _, line := range lines { 61 parts := strings.Split(line, ":") 62 if len(parts) < 2 { 63 continue 64 } 65 table[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1]) 66 } 67 if s := table["time to empty"]; s == "" { 68 table["time to empty"] = "∞" 69 } 70 str := fmt.Sprintf(" %14s: %s\n", "Charge", battery.formatCharge(table["percentage"])) 71 str += fmt.Sprintf(" %14s: %s\n", "Remaining", table["time to empty"]) 72 str += fmt.Sprintf(" %14s: %s\n", "State", battery.formatState(table["state"])) 73 if s := table["time to full"]; s != "" { 74 str += fmt.Sprintf(" %10s: %s\n", "TimeToFull", table["time to full"]) 75 } 76 batteryState = table["state"] 77 return str 78 } 79 80 func (battery *Battery) formatCharge(data string) string { 81 percent, _ := strconv.ParseFloat(strings.ReplaceAll(data, "%", ""), 32) 82 return utils.ColorizePercent(percent) 83 } 84 85 func (battery *Battery) formatState(data string) string { 86 color := "" 87 88 switch data { 89 case "charging": 90 color = "[green]" 91 case "discharging": 92 color = "[yellow]" 93 default: 94 color = "[white]" 95 } 96 97 return color + data + "[white]" 98 }