summaryrefslogtreecommitdiff
path: root/pkg/btrfs/internal/uuid.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/btrfs/internal/uuid.go')
-rw-r--r--pkg/btrfs/internal/uuid.go46
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
+}