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