main amadaluzia/webfetch / internal / memory.go
 1package internal
 2
 3import (
 4	"bufio"
 5	"bytes"
 6	"fmt"
 7	"strconv"
 8	"strings"
 9)
10
11// MemoryInfo mirroing the contents of /proc/meminfo
12type MemoryInfo map[string]int
13
14func (info MemoryInfo) UnmarshalText(data []byte) error {
15	var b bytes.Buffer
16	if _, err := b.Write(data); err != nil {
17		return fmt.Errorf("malformed data in meminfo: %v", err)
18	}
19	var scanner = bufio.NewScanner(&b)
20	line := 1
21	for scanner.Scan() {
22		var key string
23		var value int
24		if k, v, ok := strings.Cut(scanner.Text(), ":"); !ok {
25			return fmt.Errorf("failed to parse line %d of meminfo: expected ':'", line)
26		} else {
27			key = k
28			v = strings.TrimSuffix(strings.TrimSpace(v), " kB")
29			if size, err := strconv.Atoi(v); err != nil {
30				return fmt.Errorf("failed to parse line %d of meminfo: %v", line, err)
31			} else {
32				value = size
33			}
34		}
35		info[key] = value
36	}
37	return nil
38}