github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/accounts/url.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:32</date>
    10  //</624450065355771904>
    11  
    12  
    13  package accounts
    14  
    15  import (
    16  	"encoding/json"
    17  	"errors"
    18  	"fmt"
    19  	"strings"
    20  )
    21  
    22  //URL表示钱包或帐户的规范标识URL。
    23  //
    24  //这是url.url的简化版本,与重要的限制(这
    25  //在这里被认为是特性)它只包含值可复制组件,
    26  //而且它不做任何特殊字符的URL编码/解码。
    27  //
    28  //前者是很重要的,它允许在不离开Live的情况下复制帐户。
    29  //引用原始版本,而后者对于确保
    30  //一个单一的规范形式与RFC3986规范中允许的许多形式相反。
    31  //
    32  //因此,这些URL不应在以太坊范围之外使用。
    33  //钱包或账户。
    34  type URL struct {
    35  Scheme string //用于标识可用帐户后端的协议方案
    36  Path   string //用于标识唯一实体的后端路径
    37  }
    38  
    39  //ParseURL将用户提供的URL转换为特定于帐户的结构。
    40  func parseURL(url string) (URL, error) {
    41  parts := strings.Split(url, "://“”
    42  	if len(parts) != 2 || parts[0] == "" {
    43  		return URL{}, errors.New("protocol scheme missing")
    44  	}
    45  	return URL{
    46  		Scheme: parts[0],
    47  		Path:   parts[1],
    48  	}, nil
    49  }
    50  
    51  //字符串实现字符串接口。
    52  func (u URL) String() string {
    53  	if u.Scheme != "" {
    54  return fmt.Sprintf("%s://%s“,美国方案,美国路径)
    55  	}
    56  	return u.Path
    57  }
    58  
    59  //TerminalString实现Log.TerminalStringer接口。
    60  func (u URL) TerminalString() string {
    61  	url := u.String()
    62  	if len(url) > 32 {
    63  		return url[:31] + "…"
    64  	}
    65  	return url
    66  }
    67  
    68  //marshaljson实现json.marshaller接口。
    69  func (u URL) MarshalJSON() ([]byte, error) {
    70  	return json.Marshal(u.String())
    71  }
    72  
    73  //unmashaljson解析URL。
    74  func (u *URL) UnmarshalJSON(input []byte) error {
    75  	var textURL string
    76  	err := json.Unmarshal(input, &textURL)
    77  	if err != nil {
    78  		return err
    79  	}
    80  	url, err := parseURL(textURL)
    81  	if err != nil {
    82  		return err
    83  	}
    84  	u.Scheme = url.Scheme
    85  	u.Path = url.Path
    86  	return nil
    87  }
    88  
    89  //CMP比较X和Y并返回:
    90  //
    91  //-如果x<1
    92  //0如果x==y
    93  //如果x>y,则为1
    94  //
    95  func (u URL) Cmp(url URL) int {
    96  	if u.Scheme == url.Scheme {
    97  		return strings.Compare(u.Path, url.Path)
    98  	}
    99  	return strings.Compare(u.Scheme, url.Scheme)
   100  }
   101