diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-06-11 13:52:02 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-06-11 22:31:33 -0600 |
commit | 468eca4684d9b51d00e18cb129bebf528a844035 (patch) | |
tree | 85191e6ff392833d737370a20a9b119e6139e04f /pkg/btrfs/internal/uuid.go | |
parent | 5cecda729a22bcca9b1fa8234dd03140c0380720 (diff) |
Improve formatting of CSums and UUIDs
Diffstat (limited to 'pkg/btrfs/internal/uuid.go')
-rw-r--r-- | pkg/btrfs/internal/uuid.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/pkg/btrfs/internal/uuid.go b/pkg/btrfs/internal/uuid.go index 6169638..cb2c800 100644 --- a/pkg/btrfs/internal/uuid.go +++ b/pkg/btrfs/internal/uuid.go @@ -2,7 +2,10 @@ package internal import ( "encoding/hex" + "fmt" "strings" + + "lukeshu.com/btrfs-tools/pkg/util" ) type UUID [16]byte @@ -17,3 +20,46 @@ func (uuid UUID) String() string { str[20:32], }, "-") } + +func (uuid UUID) Format(f fmt.State, verb rune) { + util.FormatByteArrayStringer(uuid, uuid[:], f, verb) +} + +func ParseUUID(str string) (UUID, error) { + var ret UUID + j := 0 + for i := 0; i < len(str); i++ { + if j >= len(ret)*2 { + return UUID{}, fmt.Errorf("too long to be a UUID: %q|%q", str[:i], str[i:]) + } + c := str[i] + var v byte + switch { + case '0' <= c && c <= '9': + v = c - '0' + case 'a' <= c && c <= 'f': + v = c - 'a' + 10 + case 'A' <= c && c <= 'F': + v = c - 'A' + 10 + case c == '-': + continue + default: + return UUID{}, fmt.Errorf("illegal byte in UUID: %q|%q|%q", str[:i], str[i:i+1], str[i+1:]) + } + if j%2 == 0 { + ret[j/2] = v << 4 + } else { + ret[j/2] = (ret[j/2] & 0xf0) | (v & 0x0f) + } + j++ + } + return ret, nil +} + +func MustParseUUID(str string) UUID { + ret, err := ParseUUID(str) + if err != nil { + panic(err) + } + return ret +} |