package network

import (
	"net"
	"time"
)

// setReadDeadline 设置 TCPClient.Read 和 TCPConn.Read 读取超时, 必须在 Read 前调用. 优先级高于 deadline
// rDeadline > time.Now: 使用 rDeadline
// deadline > time.Now: 使用 deadline
// rDeadline 和 deadline 都 < time.Now: 使用 DefaultReadTimout
func setReadDeadline(conn net.Conn, rDeadline, deadline time.Time) error {
	if rDeadline.IsZero() && time.Now().After(rDeadline) {
		return conn.SetReadDeadline(rDeadline)
	} else if deadline.IsZero() && time.Now().After(deadline) {
		return conn.SetReadDeadline(deadline)
	}
	return conn.SetReadDeadline(time.Now().Add(DefaultReadTimout))
}

// setWriteDeadline 设置 TCPClient.Write 和 TCPConn.Write 写入超时, 必须在 Write 前调用. 优先级高于 deadline
// wDeadline > time.Now: 使用 wDeadline
// deadline > time.Now: 使用 deadline
// wDeadline 和 deadline 都 < time.Now: 使用 DefaultWriteTimout
func setWriteDeadline(conn net.Conn, wDeadline, deadline time.Time) error {
	if !wDeadline.IsZero() && time.Now().After(wDeadline) {
		return conn.SetWriteDeadline(wDeadline)
	} else if !deadline.IsZero() && time.Now().After(wDeadline) {
		return conn.SetWriteDeadline(deadline)
	}
	return conn.SetWriteDeadline(time.Now().Add(DefaultWriteTimout))
}
