| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | // Copyright 2016 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package hexutil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/hex" | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 	"reflect" | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	"strconv" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							| 
									
										
										
										
											2017-08-05 13:40:51 +03:00
										 |  |  | 	bytesT  = reflect.TypeOf(Bytes(nil)) | 
					
						
							|  |  |  | 	bigT    = reflect.TypeOf((*Big)(nil)) | 
					
						
							|  |  |  | 	uintT   = reflect.TypeOf(Uint(0)) | 
					
						
							|  |  |  | 	uint64T = reflect.TypeOf(Uint64(0)) | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Bytes marshals/unmarshals as a JSON string with 0x prefix. | 
					
						
							|  |  |  | // The empty slice marshals as "0x". | 
					
						
							|  |  |  | type Bytes []byte | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | // MarshalText implements encoding.TextMarshaler | 
					
						
							|  |  |  | func (b Bytes) MarshalText() ([]byte, error) { | 
					
						
							|  |  |  | 	result := make([]byte, len(b)*2+2) | 
					
						
							|  |  |  | 	copy(result, `0x`) | 
					
						
							|  |  |  | 	hex.Encode(result[2:], b) | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	return result, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalJSON implements json.Unmarshaler. | 
					
						
							|  |  |  | func (b *Bytes) UnmarshalJSON(input []byte) error { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	if !isString(input) { | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 		return errNonString(bytesT) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 	return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bytesT) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalText implements encoding.TextUnmarshaler. | 
					
						
							|  |  |  | func (b *Bytes) UnmarshalText(input []byte) error { | 
					
						
							| 
									
										
										
										
											2017-03-07 23:19:27 +01:00
										 |  |  | 	raw, err := checkText(input, true) | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	dec := make([]byte, len(raw)/2) | 
					
						
							|  |  |  | 	if _, err = hex.Decode(dec, raw); err != nil { | 
					
						
							|  |  |  | 		err = mapError(err) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		*b = dec | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // String returns the hex encoding of b. | 
					
						
							|  |  |  | func (b Bytes) String() string { | 
					
						
							|  |  |  | 	return Encode(b) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | // UnmarshalFixedJSON decodes the input as a string with 0x prefix. The length of out | 
					
						
							|  |  |  | // determines the required input length. This function is commonly used to implement the | 
					
						
							|  |  |  | // UnmarshalJSON method for fixed-size types. | 
					
						
							|  |  |  | func UnmarshalFixedJSON(typ reflect.Type, input, out []byte) error { | 
					
						
							|  |  |  | 	if !isString(input) { | 
					
						
							|  |  |  | 		return errNonString(typ) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return wrapTypeError(UnmarshalFixedText(typ.String(), input[1:len(input)-1], out), typ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | // UnmarshalFixedText decodes the input as a string with 0x prefix. The length of out | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | // determines the required input length. This function is commonly used to implement the | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | // UnmarshalText method for fixed-size types. | 
					
						
							|  |  |  | func UnmarshalFixedText(typname string, input, out []byte) error { | 
					
						
							| 
									
										
										
										
											2017-03-07 23:19:27 +01:00
										 |  |  | 	raw, err := checkText(input, true) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(raw)/2 != len(out) { | 
					
						
							|  |  |  | 		return fmt.Errorf("hex string has length %d, want %d for %s", len(raw), len(out)*2, typname) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Pre-verify syntax before modifying out. | 
					
						
							|  |  |  | 	for _, b := range raw { | 
					
						
							|  |  |  | 		if decodeNibble(b) == badNibble { | 
					
						
							|  |  |  | 			return ErrSyntax | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	hex.Decode(out, raw) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalFixedUnprefixedText decodes the input as a string with optional 0x prefix. The | 
					
						
							|  |  |  | // length of out determines the required input length. This function is commonly used to | 
					
						
							|  |  |  | // implement the UnmarshalText method for fixed-size types. | 
					
						
							|  |  |  | func UnmarshalFixedUnprefixedText(typname string, input, out []byte) error { | 
					
						
							|  |  |  | 	raw, err := checkText(input, false) | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(raw)/2 != len(out) { | 
					
						
							|  |  |  | 		return fmt.Errorf("hex string has length %d, want %d for %s", len(raw), len(out)*2, typname) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Pre-verify syntax before modifying out. | 
					
						
							|  |  |  | 	for _, b := range raw { | 
					
						
							|  |  |  | 		if decodeNibble(b) == badNibble { | 
					
						
							|  |  |  | 			return ErrSyntax | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	hex.Decode(out, raw) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:35:11 +01:00
										 |  |  | // Big marshals/unmarshals as a JSON string with 0x prefix. | 
					
						
							|  |  |  | // The zero value marshals as "0x0". | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Negative integers are not supported at this time. Attempting to marshal them will | 
					
						
							|  |  |  | // return an error. Values larger than 256bits are rejected by Unmarshal but will be | 
					
						
							|  |  |  | // marshaled without error. | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | type Big big.Int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | // MarshalText implements encoding.TextMarshaler | 
					
						
							|  |  |  | func (b Big) MarshalText() ([]byte, error) { | 
					
						
							| 
									
										
										
										
											2017-02-26 19:40:33 +01:00
										 |  |  | 	return []byte(EncodeBig((*big.Int)(&b))), nil | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalJSON implements json.Unmarshaler. | 
					
						
							|  |  |  | func (b *Big) UnmarshalJSON(input []byte) error { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	if !isString(input) { | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 		return errNonString(bigT) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 	return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bigT) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalText implements encoding.TextUnmarshaler | 
					
						
							|  |  |  | func (b *Big) UnmarshalText(input []byte) error { | 
					
						
							|  |  |  | 	raw, err := checkNumberText(input) | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-22 17:35:11 +01:00
										 |  |  | 	if len(raw) > 64 { | 
					
						
							|  |  |  | 		return ErrBig256Range | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	words := make([]big.Word, len(raw)/bigWordNibbles+1) | 
					
						
							|  |  |  | 	end := len(raw) | 
					
						
							|  |  |  | 	for i := range words { | 
					
						
							|  |  |  | 		start := end - bigWordNibbles | 
					
						
							|  |  |  | 		if start < 0 { | 
					
						
							|  |  |  | 			start = 0 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		for ri := start; ri < end; ri++ { | 
					
						
							|  |  |  | 			nib := decodeNibble(raw[ri]) | 
					
						
							|  |  |  | 			if nib == badNibble { | 
					
						
							|  |  |  | 				return ErrSyntax | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			words[i] *= 16 | 
					
						
							|  |  |  | 			words[i] += big.Word(nib) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		end = start | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var dec big.Int | 
					
						
							|  |  |  | 	dec.SetBits(words) | 
					
						
							|  |  |  | 	*b = (Big)(dec) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ToInt converts b to a big.Int. | 
					
						
							|  |  |  | func (b *Big) ToInt() *big.Int { | 
					
						
							|  |  |  | 	return (*big.Int)(b) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // String returns the hex encoding of b. | 
					
						
							|  |  |  | func (b *Big) String() string { | 
					
						
							|  |  |  | 	return EncodeBig(b.ToInt()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Uint64 marshals/unmarshals as a JSON string with 0x prefix. | 
					
						
							|  |  |  | // The zero value marshals as "0x0". | 
					
						
							|  |  |  | type Uint64 uint64 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | // MarshalText implements encoding.TextMarshaler. | 
					
						
							|  |  |  | func (b Uint64) MarshalText() ([]byte, error) { | 
					
						
							|  |  |  | 	buf := make([]byte, 2, 10) | 
					
						
							|  |  |  | 	copy(buf, `0x`) | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	buf = strconv.AppendUint(buf, uint64(b), 16) | 
					
						
							|  |  |  | 	return buf, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalJSON implements json.Unmarshaler. | 
					
						
							|  |  |  | func (b *Uint64) UnmarshalJSON(input []byte) error { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	if !isString(input) { | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 		return errNonString(uint64T) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 	return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), uint64T) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalText implements encoding.TextUnmarshaler | 
					
						
							|  |  |  | func (b *Uint64) UnmarshalText(input []byte) error { | 
					
						
							|  |  |  | 	raw, err := checkNumberText(input) | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(raw) > 16 { | 
					
						
							|  |  |  | 		return ErrUint64Range | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var dec uint64 | 
					
						
							|  |  |  | 	for _, byte := range raw { | 
					
						
							|  |  |  | 		nib := decodeNibble(byte) | 
					
						
							|  |  |  | 		if nib == badNibble { | 
					
						
							|  |  |  | 			return ErrSyntax | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		dec *= 16 | 
					
						
							|  |  |  | 		dec += uint64(nib) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	*b = Uint64(dec) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // String returns the hex encoding of b. | 
					
						
							|  |  |  | func (b Uint64) String() string { | 
					
						
							|  |  |  | 	return EncodeUint64(uint64(b)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Uint marshals/unmarshals as a JSON string with 0x prefix. | 
					
						
							|  |  |  | // The zero value marshals as "0x0". | 
					
						
							|  |  |  | type Uint uint | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | // MarshalText implements encoding.TextMarshaler. | 
					
						
							|  |  |  | func (b Uint) MarshalText() ([]byte, error) { | 
					
						
							|  |  |  | 	return Uint64(b).MarshalText() | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalJSON implements json.Unmarshaler. | 
					
						
							|  |  |  | func (b *Uint) UnmarshalJSON(input []byte) error { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	if !isString(input) { | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 		return errNonString(uintT) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 	return wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), uintT) | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalText implements encoding.TextUnmarshaler. | 
					
						
							|  |  |  | func (b *Uint) UnmarshalText(input []byte) error { | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	var u64 Uint64 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	err := u64.UnmarshalText(input) | 
					
						
							|  |  |  | 	if u64 > Uint64(^uint(0)) || err == ErrUint64Range { | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 		return ErrUintRange | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	} else if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	*b = Uint(u64) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // String returns the hex encoding of b. | 
					
						
							|  |  |  | func (b Uint) String() string { | 
					
						
							|  |  |  | 	return EncodeUint64(uint64(b)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func isString(input []byte) bool { | 
					
						
							|  |  |  | 	return len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func bytesHave0xPrefix(input []byte) bool { | 
					
						
							|  |  |  | 	return len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 23:19:27 +01:00
										 |  |  | func checkText(input []byte, wantPrefix bool) ([]byte, error) { | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | 	if len(input) == 0 { | 
					
						
							| 
									
										
										
										
											2017-01-13 09:45:40 +01:00
										 |  |  | 		return nil, nil // empty strings are allowed | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-07 23:19:27 +01:00
										 |  |  | 	if bytesHave0xPrefix(input) { | 
					
						
							|  |  |  | 		input = input[2:] | 
					
						
							|  |  |  | 	} else if wantPrefix { | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 		return nil, ErrMissingPrefix | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(input)%2 != 0 { | 
					
						
							|  |  |  | 		return nil, ErrOddLength | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return input, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-22 17:59:59 +01:00
										 |  |  | func checkNumberText(input []byte) (raw []byte, err error) { | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	if len(input) == 0 { | 
					
						
							| 
									
										
										
										
											2017-01-13 09:45:40 +01:00
										 |  |  | 		return nil, nil // empty strings are allowed | 
					
						
							| 
									
										
										
										
											2016-09-15 02:57:48 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if !bytesHave0xPrefix(input) { | 
					
						
							|  |  |  | 		return nil, ErrMissingPrefix | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	input = input[2:] | 
					
						
							|  |  |  | 	if len(input) == 0 { | 
					
						
							|  |  |  | 		return nil, ErrEmptyNumber | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if len(input) > 1 && input[0] == '0' { | 
					
						
							|  |  |  | 		return nil, ErrLeadingZero | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return input, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-06-23 10:50:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | func wrapTypeError(err error, typ reflect.Type) error { | 
					
						
							|  |  |  | 	if _, ok := err.(*decError); ok { | 
					
						
							|  |  |  | 		return &json.UnmarshalTypeError{Value: err.Error(), Type: typ} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func errNonString(typ reflect.Type) error { | 
					
						
							|  |  |  | 	return &json.UnmarshalTypeError{Value: "non-string", Type: typ} | 
					
						
							|  |  |  | } |