github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/accounts/url.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2017 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package accounts
    26  
    27  import (
    28  	"encoding/json"
    29  	"errors"
    30  	"fmt"
    31  	"strings"
    32  )
    33  
    34  //URL表示钱包或帐户的规范标识URL。
    35  //
    36  //这是url.url的简化版本,与重要的限制(这
    37  //在这里被认为是特性)它只包含值可复制组件,
    38  //而且它不做任何特殊字符的URL编码/解码。
    39  //
    40  //前者是很重要的,它允许在不离开Live的情况下复制帐户。
    41  //引用原始版本,而后者对于确保
    42  //一个单一的规范形式与RFC3986规范中允许的许多形式相反。
    43  //
    44  //因此,这些URL不应在以太坊范围之外使用。
    45  //钱包或账户。
    46  type URL struct {
    47  Scheme string //用于标识可用帐户后端的协议方案
    48  Path   string //用于标识唯一实体的后端路径
    49  }
    50  
    51  //ParseURL将用户提供的URL转换为特定于帐户的结构。
    52  func parseURL(url string) (URL, error) {
    53  parts := strings.Split(url, "://“”
    54  	if len(parts) != 2 || parts[0] == "" {
    55  		return URL{}, errors.New("protocol scheme missing")
    56  	}
    57  	return URL{
    58  		Scheme: parts[0],
    59  		Path:   parts[1],
    60  	}, nil
    61  }
    62  
    63  //字符串实现字符串接口。
    64  func (u URL) String() string {
    65  	if u.Scheme != "" {
    66  return fmt.Sprintf("%s://%s“,美国方案,美国路径)
    67  	}
    68  	return u.Path
    69  }
    70  
    71  //TerminalString实现Log.TerminalStringer接口。
    72  func (u URL) TerminalString() string {
    73  	url := u.String()
    74  	if len(url) > 32 {
    75  		return url[:31] + "…"
    76  	}
    77  	return url
    78  }
    79  
    80  //marshaljson实现json.marshaller接口。
    81  func (u URL) MarshalJSON() ([]byte, error) {
    82  	return json.Marshal(u.String())
    83  }
    84  
    85  //unmashaljson解析URL。
    86  func (u *URL) UnmarshalJSON(input []byte) error {
    87  	var textURL string
    88  	err := json.Unmarshal(input, &textURL)
    89  	if err != nil {
    90  		return err
    91  	}
    92  	url, err := parseURL(textURL)
    93  	if err != nil {
    94  		return err
    95  	}
    96  	u.Scheme = url.Scheme
    97  	u.Path = url.Path
    98  	return nil
    99  }
   100  
   101  //CMP比较X和Y并返回:
   102  //
   103  //-如果x<1
   104  //0如果x==y
   105  //如果x>y,则为1
   106  //
   107  func (u URL) Cmp(url URL) int {
   108  	if u.Scheme == url.Scheme {
   109  		return strings.Compare(u.Path, url.Path)
   110  	}
   111  	return strings.Compare(u.Scheme, url.Scheme)
   112  }