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}