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