good morning!!!!

Skip to content
Snippets Groups Projects
net.go 3.42 KiB
Newer Older
// Copyright (c) 2012-2014 José Carlos Nieto, https://menteslibres.net/xiam
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

package db

import (
	"fmt"
	"strconv"
	"strings"
)

// Address is an interface that represents the host part of an URL.
type Address interface {
	String() string
	Host() (string, error)
	Port() (uint, error)
	Path() (string, error)
// SocketAddr is a UNIX address.
type SocketAddr struct {
// HostAddr is the name or IP of a server coupled with an optional port number.
type HostAddr struct {
	name string
	port uint
}

// ParseAddress parses s into a host or socket structures.
func ParseAddress(s string) Address {
	if strings.HasPrefix(s, "/") {
		// Let's suppose this is a UNIX socket.
		return SocketAddr{path: s}
	}
	hp := strings.Split(s, ":")
	if len(hp) > 1 {
		p, _ := strconv.Atoi(hp[1])
		return HostAddr{name: hp[0], port: uint(p)}
	return HostAddr{name: hp[0]}
}

// Host converts the given name into a host structure.
func Host(name string) HostAddr {
	return HostAddr{name: name}
// Socket converts the given name into a socket structure.
func Socket(path string) SocketAddr {
	return SocketAddr{path}
// HostPort converts the given name and port into a host structure.
func HostPort(name string, port uint) HostAddr {
		return HostAddr{name: name, port: port}
	return HostAddr{name: name}
// String returns the string representation of the host struct.
func (h HostAddr) String() string {
	if h.port > 0 {
		return fmt.Sprintf("%s:%d", h.name, h.port)
	}
	return h.name
}

// Host returns the hostname/ip part of the host struct.
func (h HostAddr) Host() (string, error) {
	if h.name != "" {
		return h.name, nil
	}
	return "", ErrUndefined
}

// Port returns the port number of the host struct.
func (h HostAddr) Port() (uint, error) {
	if h.port > 0 {
		return h.port, nil
	}
	return 0, ErrUndefined
}

// Path is undefined in a host struct.
func (h HostAddr) Path() (string, error) {
// String() returns the string representation of the socket struct.
func (s SocketAddr) String() string {
// Host is undefined in a socket struct.
func (s SocketAddr) Host() (string, error) {
	return "", ErrUndefined
}

// Port is undefined in a socket struct.
func (s SocketAddr) Port() (uint, error) {
	return 0, ErrUndefined
}

// Path returns the file path of the socket struct.
func (s SocketAddr) Path() (string, error) {