main amadaluzia/webfetch / internal / os_release.go
 1package internal
 2
 3import (
 4	"bufio"
 5	"bytes"
 6	"fmt"
 7	"strings"
 8)
 9
10// OsRelease is a set of key-value pairs mirroring what can be found in /etc/os-release.
11type OsRelease map[string]string
12
13func (os OsRelease) UnmarshalText(text []byte) error {
14	var b bytes.Buffer
15	if _, err := b.Write(text); err != nil {
16		return fmt.Errorf("malformed data in os-release: %v", err)
17	}
18	scanner := bufio.NewScanner(&b)
19	line := 1
20	for scanner.Scan() {
21		key, value, ok := strings.Cut(scanner.Text(), "=")
22		if !ok {
23			return fmt.Errorf("failed to parse line %d of os-release: expected '='", line)
24		}
25		if value[0] == '"' {
26			value = value[1 : len(value)-1]
27		}
28		os[key] = value
29		line++
30	}
31	if err := scanner.Err(); err != nil {
32		return fmt.Errorf("os_release scanner had an error: %v", err)
33	}
34	return nil
35}