package helpers

import (
	"errors"
	"net"
	"regexp"
)

var networkArrowErrorPart = regexp.MustCompile(` (?:(?:[0-9]+\.){3}[0-9]+:[0-9]+(?:->)?)+`)

// CleanNetworkAddressFromError checks whether an IP:Port->IP:port
// information is contained in the error. This is checked by explicitly
// sanitizing *net.OpError instances or by returning a sanitized error
// string without the stack previously present.
//
// As of the loss of information this is only intended to clean up
// logging and not be used in error returns.
func CleanNetworkAddressFromError(err error) error {
	if opE, ok := err.(*net.OpError); ok {
		// Error in the outmost position is an OpError, lets just patch it
		opE.Source = nil
		opE.Addr = nil
		return opE
	}

	if networkArrowErrorPart.FindStringIndex(err.Error()) == nil {
		// There is no network address somewhere inside, keep the error as is
		return err
	}

	// Patch out IP information and create an new error with its message
	return errors.New(networkArrowErrorPart.ReplaceAllString(err.Error(), ""))
}