...

Source file src/github.com/jackc/pgtype/macaddr.go

Documentation: github.com/jackc/pgtype

     1  package pgtype
     2  
     3  import (
     4  	"database/sql/driver"
     5  	"fmt"
     6  	"net"
     7  )
     8  
     9  type Macaddr struct {
    10  	Addr   net.HardwareAddr
    11  	Status Status
    12  }
    13  
    14  func (dst *Macaddr) Set(src interface{}) error {
    15  	if src == nil {
    16  		*dst = Macaddr{Status: Null}
    17  		return nil
    18  	}
    19  
    20  	if value, ok := src.(interface{ Get() interface{} }); ok {
    21  		value2 := value.Get()
    22  		if value2 != value {
    23  			return dst.Set(value2)
    24  		}
    25  	}
    26  
    27  	switch value := src.(type) {
    28  	case net.HardwareAddr:
    29  		addr := make(net.HardwareAddr, len(value))
    30  		copy(addr, value)
    31  		*dst = Macaddr{Addr: addr, Status: Present}
    32  	case string:
    33  		addr, err := net.ParseMAC(value)
    34  		if err != nil {
    35  			return err
    36  		}
    37  		*dst = Macaddr{Addr: addr, Status: Present}
    38  	case *net.HardwareAddr:
    39  		if value == nil {
    40  			*dst = Macaddr{Status: Null}
    41  		} else {
    42  			return dst.Set(*value)
    43  		}
    44  	case *string:
    45  		if value == nil {
    46  			*dst = Macaddr{Status: Null}
    47  		} else {
    48  			return dst.Set(*value)
    49  		}
    50  	default:
    51  		if originalSrc, ok := underlyingPtrType(src); ok {
    52  			return dst.Set(originalSrc)
    53  		}
    54  		return fmt.Errorf("cannot convert %v to Macaddr", value)
    55  	}
    56  
    57  	return nil
    58  }
    59  
    60  func (dst Macaddr) Get() interface{} {
    61  	switch dst.Status {
    62  	case Present:
    63  		return dst.Addr
    64  	case Null:
    65  		return nil
    66  	default:
    67  		return dst.Status
    68  	}
    69  }
    70  
    71  func (src *Macaddr) AssignTo(dst interface{}) error {
    72  	switch src.Status {
    73  	case Present:
    74  		switch v := dst.(type) {
    75  		case *net.HardwareAddr:
    76  			*v = make(net.HardwareAddr, len(src.Addr))
    77  			copy(*v, src.Addr)
    78  			return nil
    79  		case *string:
    80  			*v = src.Addr.String()
    81  			return nil
    82  		default:
    83  			if nextDst, retry := GetAssignToDstType(dst); retry {
    84  				return src.AssignTo(nextDst)
    85  			}
    86  			return fmt.Errorf("unable to assign to %T", dst)
    87  		}
    88  	case Null:
    89  		return NullAssignTo(dst)
    90  	}
    91  
    92  	return fmt.Errorf("cannot decode %#v into %T", src, dst)
    93  }
    94  
    95  func (dst *Macaddr) DecodeText(ci *ConnInfo, src []byte) error {
    96  	if src == nil {
    97  		*dst = Macaddr{Status: Null}
    98  		return nil
    99  	}
   100  
   101  	addr, err := net.ParseMAC(string(src))
   102  	if err != nil {
   103  		return err
   104  	}
   105  
   106  	*dst = Macaddr{Addr: addr, Status: Present}
   107  	return nil
   108  }
   109  
   110  func (dst *Macaddr) DecodeBinary(ci *ConnInfo, src []byte) error {
   111  	if src == nil {
   112  		*dst = Macaddr{Status: Null}
   113  		return nil
   114  	}
   115  
   116  	if len(src) != 6 {
   117  		return fmt.Errorf("Received an invalid size for a macaddr: %d", len(src))
   118  	}
   119  
   120  	addr := make(net.HardwareAddr, 6)
   121  	copy(addr, src)
   122  
   123  	*dst = Macaddr{Addr: addr, Status: Present}
   124  
   125  	return nil
   126  }
   127  
   128  func (src Macaddr) EncodeText(ci *ConnInfo, buf []byte) ([]byte, error) {
   129  	switch src.Status {
   130  	case Null:
   131  		return nil, nil
   132  	case Undefined:
   133  		return nil, errUndefined
   134  	}
   135  
   136  	return append(buf, src.Addr.String()...), nil
   137  }
   138  
   139  // EncodeBinary encodes src into w.
   140  func (src Macaddr) EncodeBinary(ci *ConnInfo, buf []byte) ([]byte, error) {
   141  	switch src.Status {
   142  	case Null:
   143  		return nil, nil
   144  	case Undefined:
   145  		return nil, errUndefined
   146  	}
   147  
   148  	return append(buf, src.Addr...), nil
   149  }
   150  
   151  // Scan implements the database/sql Scanner interface.
   152  func (dst *Macaddr) Scan(src interface{}) error {
   153  	if src == nil {
   154  		*dst = Macaddr{Status: Null}
   155  		return nil
   156  	}
   157  
   158  	switch src := src.(type) {
   159  	case string:
   160  		return dst.DecodeText(nil, []byte(src))
   161  	case []byte:
   162  		srcCopy := make([]byte, len(src))
   163  		copy(srcCopy, src)
   164  		return dst.DecodeText(nil, srcCopy)
   165  	}
   166  
   167  	return fmt.Errorf("cannot scan %T", src)
   168  }
   169  
   170  // Value implements the database/sql/driver Valuer interface.
   171  func (src Macaddr) Value() (driver.Value, error) {
   172  	return EncodeValueText(src)
   173  }
   174  

View as plain text