z_mirror/fmm

git clone https://git.raiguard.me/z_mirror/fmm

Caleb HeuerConsider a nil version to be equal8f22b8d

predep-parsing
1.4 KiB83 linesraw
1package main
2
3import (
4	"encoding/json"
5	"errors"
6	"fmt"
7	"strconv"
8	"strings"
9)
10
11type Version [4]uint16
12
13type VersionCmpRes uint8
14
15const (
16	VersionAny VersionCmpRes = iota
17	VersionEq
18	VersionGt
19	VersionGtEq
20	VersionLt
21	VersionLtEq = 6
22)
23
24func newVersion(input string) (*Version, error) {
25	parts := strings.Split(strings.TrimSpace(input), ".")
26	if len(parts) < 2 || len(parts) > 4 {
27		return nil, errors.New("Version string must have between 2 and 4 parts")
28	}
29	var ver Version
30	for i, part := range parts {
31		part, err := strconv.ParseUint(part, 10, 0)
32		if err != nil {
33			return nil, err
34		}
35		ver[i] = uint16(part)
36	}
37	return &ver, nil
38}
39
40func (v *Version) cmp(other *Version) VersionCmpRes {
41	if other == nil {
42		return VersionEq
43	}
44	for i := range v {
45		if v[i] > other[i] {
46			return VersionGt
47		} else if v[i] < other[i] {
48			return VersionLt
49		}
50	}
51	return VersionEq
52}
53
54func (v *Version) toString(includeBuild bool) string {
55	if includeBuild {
56		return fmt.Sprintf("%d.%d.%d.%d", v[0], v[1], v[2], v[3])
57	} else {
58		return fmt.Sprintf("%d.%d.%d", v[0], v[1], v[2])
59	}
60}
61
62func (v *Version) MarshalJSON() ([]byte, error) {
63	return []byte("\"" + v.toString(false) + "\""), nil
64}
65
66func (v *Version) UnmarshalJSON(data []byte) error {
67	var s string
68	if err := json.Unmarshal(data, &s); err != nil {
69		return err
70	}
71
72	ver, err := newVersion(s)
73	if err != nil {
74		return err
75	}
76
77	v[0] = ver[0]
78	v[1] = ver[1]
79	v[2] = ver[2]
80	v[3] = ver[3]
81
82	return nil
83}