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  }