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