github.com/vchain-us/vcn@v0.9.11-0.20210921212052-a2484d23c0b3/pkg/uri/uri.go (about) 1 /* 2 * Copyright (c) 2018-2020 vChain, Inc. All Rights Reserved. 3 * This software is released under GPL3. 4 * The full license information can be found under: 5 * https://www.gnu.org/licenses/gpl-3.0.en.html 6 * 7 */ 8 9 package uri 10 11 import ( 12 "encoding/json" 13 "fmt" 14 "strings" 15 ) 16 17 // URI represents the canonical identification of an artifact 18 type URI struct { 19 Scheme string // Scheme identifies a kind of artifacts 20 Opaque string // Rest of encoded data 21 } 22 23 // String implements the stringer interface 24 func (u *URI) String() string { 25 if u.Scheme != "" { 26 return fmt.Sprintf("%s:%s", u.Scheme, u.Opaque) 27 } 28 return u.Opaque 29 } 30 31 // Parse converts a rawURI string into an URI structure 32 func Parse(rawURI string) (*URI, error) { 33 parts := strings.Split(rawURI, "://") 34 l := len(parts) 35 if l == 1 { 36 return &URI{ 37 Scheme: "", 38 Opaque: rawURI, 39 }, nil 40 41 } 42 if l == 2 { 43 return &URI{ 44 Scheme: parts[0], 45 Opaque: "//" + parts[1], 46 }, nil 47 } 48 return nil, fmt.Errorf("invalid URI: %s", rawURI) 49 } 50 51 // MarshalJSON implements the json.Marshaller interface 52 func (u URI) MarshalJSON() ([]byte, error) { 53 return json.Marshal(u.String()) 54 } 55 56 // UnmarshalJSON parses URI 57 func (u *URI) UnmarshalJSON(input []byte) error { 58 var rawURI string 59 if err := json.Unmarshal(input, &rawURI); err != nil { 60 return err 61 } 62 pu, err := Parse(rawURI) 63 if err != nil { 64 return err 65 } 66 u.Scheme = pu.Scheme 67 u.Opaque = pu.Opaque 68 return nil 69 }