git.zd.zone/hrpc/hrpc@v0.0.12/types/url.go (about)

     1  package types
     2  
     3  import (
     4  	"bytes"
     5  	"database/sql/driver"
     6  	"fmt"
     7  	"net/url"
     8  	"reflect"
     9  )
    10  
    11  type URL struct {
    12  	*url.URL
    13  }
    14  
    15  func (u URL) Value() (driver.Value, error) {
    16  	return u.String(), nil
    17  }
    18  
    19  func (u *URL) Scan(src interface{}) error {
    20  	v, ok := src.([]byte)
    21  	if !ok {
    22  		return fmt.Errorf(
    23  			"bad []byte type assertion, got name: %v and kind: %v",
    24  			reflect.TypeOf(src).Name(),
    25  			reflect.TypeOf(src).Kind().String(),
    26  		)
    27  	}
    28  	t, err := url.Parse(string(v))
    29  	if err != nil {
    30  		return err
    31  	}
    32  	*u = URL{t}
    33  	return nil
    34  }
    35  
    36  func (u URL) MarshalJSON() ([]byte, error) {
    37  	return []byte("\"" + u.String() + "\""), nil
    38  }
    39  
    40  func (u *URL) UnmarshalJSON(data []byte) error {
    41  	s := string(bytes.Trim(data, "\""))
    42  	t, err := url.Parse(s)
    43  	if err != nil {
    44  		return err
    45  	}
    46  	*u = URL{t}
    47  	return nil
    48  }