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  }