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}