55 lines
1001 B
Go
55 lines
1001 B
Go
/*
|
|
* SPDX-FileCopyrightText: 2023 jordi fita mas <jfita@peritasoft.com>
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
package uuid
|
|
|
|
import (
|
|
gohex "encoding/hex"
|
|
"fmt"
|
|
|
|
"dev.tandem.ws/tandem/camper/pkg/hex"
|
|
)
|
|
|
|
func Valid(s string) bool {
|
|
if len(s) != 36 {
|
|
return false
|
|
}
|
|
// it must be of the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {
|
|
return false
|
|
}
|
|
for _, x := range [16]int{
|
|
0, 2, 4, 6,
|
|
9, 11,
|
|
14, 16,
|
|
19, 21,
|
|
24, 26, 28, 30, 32, 34} {
|
|
if !hex.Valid(s[x], s[x+1]) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func Parse(src string) (dst [16]byte, err error) {
|
|
switch len(src) {
|
|
case 36:
|
|
src = src[0:8] + src[9:13] + src[14:18] + src[19:23] + src[24:]
|
|
case 32:
|
|
// dashes already stripped, assume valid
|
|
default:
|
|
// assume invalid.
|
|
return dst, fmt.Errorf("cannot parse UUID %v", src)
|
|
}
|
|
|
|
buf, err := gohex.DecodeString(src)
|
|
if err != nil {
|
|
return dst, err
|
|
}
|
|
|
|
copy(dst[:], buf)
|
|
return dst, err
|
|
}
|