github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/print.go (about)

     1  package xio
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net"
     7  	"time"
     8  )
     9  
    10  // PrintConn is net.Conn to print the transfter data
    11  type PrintConn struct {
    12  	Base io.ReadWriteCloser
    13  	Name string
    14  	Mode int
    15  }
    16  
    17  // NewPrintConn will create new PrintConn
    18  func NewPrintConn(name string, base io.ReadWriteCloser) (conn *PrintConn) {
    19  	conn = &PrintConn{Base: base, Name: name}
    20  	return
    21  }
    22  
    23  func (p *PrintConn) Read(b []byte) (n int, err error) {
    24  	n, err = p.Base.Read(b)
    25  	if err == nil {
    26  		switch p.Mode {
    27  		case 0x10:
    28  			fmt.Printf("%v Read %v bytes %v\n", p.Name, n, string(b[:n]))
    29  		default:
    30  			fmt.Printf("%v Read %v bytes % 02x\n", p.Name, n, b[:n])
    31  		}
    32  	} else {
    33  		fmt.Printf("%v Read error %v\n", p.Name, err)
    34  	}
    35  	return
    36  }
    37  
    38  func (p *PrintConn) Write(b []byte) (n int, err error) {
    39  	n, err = p.Base.Write(b)
    40  	if err == nil {
    41  		switch p.Mode {
    42  		case 0x10:
    43  			fmt.Printf("%v Write %v bytes %v\n", p.Name, n, string(b[:n]))
    44  		default:
    45  			fmt.Printf("%v Write %v bytes % 02x\n", p.Name, n, b[:n])
    46  		}
    47  	} else {
    48  		fmt.Printf("%v Write error %v\n", p.Name, err)
    49  	}
    50  	return
    51  }
    52  
    53  // LocalAddr returns the local network address.
    54  func (p *PrintConn) LocalAddr() net.Addr {
    55  	if conn, ok := p.Base.(net.Conn); ok {
    56  		return conn.LocalAddr()
    57  	}
    58  	return p
    59  }
    60  
    61  // RemoteAddr returns the remote network address.
    62  func (p *PrintConn) RemoteAddr() net.Addr {
    63  	if conn, ok := p.Base.(net.Conn); ok {
    64  		return conn.RemoteAddr()
    65  	}
    66  	return p
    67  }
    68  
    69  // SetDeadline for net.Conn
    70  func (p *PrintConn) SetDeadline(t time.Time) error {
    71  	if conn, ok := p.Base.(net.Conn); ok {
    72  		return conn.SetDeadline(t)
    73  	}
    74  	return nil
    75  }
    76  
    77  // SetReadDeadline for net.Conn
    78  func (p *PrintConn) SetReadDeadline(t time.Time) error {
    79  	if conn, ok := p.Base.(net.Conn); ok {
    80  		return conn.SetReadDeadline(t)
    81  	}
    82  	return nil
    83  }
    84  
    85  // SetWriteDeadline for net.Conn
    86  func (p *PrintConn) SetWriteDeadline(t time.Time) error {
    87  	if conn, ok := p.Base.(net.Conn); ok {
    88  		return conn.SetWriteDeadline(t)
    89  	}
    90  	return nil
    91  }
    92  
    93  // Network impl net.Addr
    94  func (p *PrintConn) Network() string {
    95  	return "print"
    96  }
    97  
    98  func (p *PrintConn) String() string {
    99  	return fmt.Sprintf("%v", p.Name)
   100  }
   101  
   102  // Close will close base
   103  func (p *PrintConn) Close() (err error) {
   104  	err = p.Base.Close()
   105  	fmt.Printf("%v Close %v\n", p.Name, err)
   106  	return
   107  }
   108  
   109  type PrintPiper struct {
   110  	Name string
   111  	Raw  Piper
   112  }
   113  
   114  func NewPrintPiper(name string, raw Piper) (piper *PrintPiper) {
   115  	piper = &PrintPiper{
   116  		Name: name,
   117  		Raw:  raw,
   118  	}
   119  	return
   120  }
   121  
   122  func (p *PrintPiper) PipeConn(conn io.ReadWriteCloser, target string) (err error) {
   123  	err = p.Raw.PipeConn(NewPrintConn(p.Name, conn), target)
   124  	return
   125  }
   126  
   127  func (p *PrintPiper) Close() (err error) {
   128  	err = p.Raw.Close()
   129  	return
   130  }