z_mirror/fmm

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

Caleb HeuerSplit ModPortal into a new struct78daabe

trunk
1.6 KiB91 linesraw
1package fmm
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
22)
23
24var versionCmpResString = map[VersionCmpRes]string{
25	VersionEq:   "=",
26	VersionGt:   ">",
27	VersionGtEq: ">=",
28	VersionLt:   "<",
29	VersionLtEq: "<=",
30}
31
32func NewVersion(input string) (*Version, error) {
33	parts := strings.Split(strings.TrimSpace(input), ".")
34	if len(parts) < 2 || len(parts) > 4 {
35		return nil, errors.New("version string must have between 2 and 4 parts")
36	}
37	var ver Version
38	for i, part := range parts {
39		part, err := strconv.ParseUint(part, 10, 0)
40		if err != nil {
41			return nil, err
42		}
43		ver[i] = uint16(part)
44	}
45	return &ver, nil
46}
47
48func (v *Version) Cmp(other *Version) VersionCmpRes {
49	if other == nil {
50		return VersionEq
51	}
52	for i := range v {
53		if v[i] > other[i] {
54			return VersionGt
55		} else if v[i] < other[i] {
56			return VersionLt
57		}
58	}
59	return VersionEq
60}
61
62func (v *Version) ToString(includeBuild bool) string {
63	if includeBuild {
64		return fmt.Sprintf("%d.%d.%d.%d", v[0], v[1], v[2], v[3])
65	} else {
66		return fmt.Sprintf("%d.%d.%d", v[0], v[1], v[2])
67	}
68}
69
70func (v *Version) MarshalJSON() ([]byte, error) {
71	return []byte("\"" + v.ToString(false) + "\""), nil
72}
73
74func (v *Version) UnmarshalJSON(data []byte) error {
75	var s string
76	if err := json.Unmarshal(data, &s); err != nil {
77		return err
78	}
79
80	ver, err := NewVersion(s)
81	if err != nil {
82		return err
83	}
84
85	v[0] = ver[0]
86	v[1] = ver[1]
87	v[2] = ver[2]
88	v[3] = ver[3]
89
90	return nil
91}