From 468eca4684d9b51d00e18cb129bebf528a844035 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 11 Jun 2022 13:52:02 -0600 Subject: Improve formatting of CSums and UUIDs --- pkg/btrfs/internal/uuid.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'pkg/btrfs/internal/uuid.go') 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 +} -- cgit v1.2.3-2-g168b