File: uuid.go

package info (click to toggle)
golang-github-socketplane-libovsdb 0.8.1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,468 kB
  • sloc: makefile: 59; sh: 27
file content (59 lines) | stat: -rw-r--r-- 1,262 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package ovsdb

import (
	"encoding/json"
	"fmt"
	"regexp"
)

var validUUID = regexp.MustCompile(`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`)

// UUID is a UUID according to RFC7047
type UUID struct {
	GoUUID string `json:"uuid"`
}

// MarshalJSON will marshal an OVSDB style UUID to a JSON encoded byte array
func (u UUID) MarshalJSON() ([]byte, error) {
	var uuidSlice []string
	err := ValidateUUID(u.GoUUID)
	if err == nil {
		uuidSlice = []string{"uuid", u.GoUUID}
	} else {
		uuidSlice = []string{"named-uuid", u.GoUUID}
	}

	return json.Marshal(uuidSlice)
}

// UnmarshalJSON will unmarshal a JSON encoded byte array to a OVSDB style UUID
func (u *UUID) UnmarshalJSON(b []byte) (err error) {
	var ovsUUID []string
	if err := json.Unmarshal(b, &ovsUUID); err == nil {
		u.GoUUID = ovsUUID[1]
	}
	return err
}

func ValidateUUID(uuid string) error {
	if len(uuid) != 36 {
		return fmt.Errorf("uuid exceeds 36 characters")
	}

	if !validUUID.MatchString(uuid) {
		return fmt.Errorf("uuid does not match regexp")
	}

	return nil
}

func IsNamedUUID(uuid string) bool {
	return len(uuid) > 0 && !validUUID.MatchString(uuid)
}

func IsValidUUID(uuid string) bool {
	if err := ValidateUUID(uuid); err != nil {
		return false
	}
	return true
}