1package nat
2
3import (
4	"fmt"
5	"strconv"
6	"strings"
7)
8
9// PartParser parses and validates the specified string (data) using the specified template
10// e.g. ip:public:private -> 192.168.0.1:80:8000
11// DEPRECATED: do not use, this function may be removed in a future version
12func PartParser(template, data string) (map[string]string, error) {
13	// ip:public:private
14	var (
15		templateParts = strings.Split(template, ":")
16		parts         = strings.Split(data, ":")
17		out           = make(map[string]string, len(templateParts))
18	)
19	if len(parts) != len(templateParts) {
20		return nil, fmt.Errorf("Invalid format to parse. %s should match template %s", data, template)
21	}
22
23	for i, t := range templateParts {
24		value := ""
25		if len(parts) > i {
26			value = parts[i]
27		}
28		out[t] = value
29	}
30	return out, nil
31}
32
33// ParsePortRange parses and validates the specified string as a port-range (8000-9000)
34func ParsePortRange(ports string) (uint64, uint64, error) {
35	if ports == "" {
36		return 0, 0, fmt.Errorf("Empty string specified for ports.")
37	}
38	if !strings.Contains(ports, "-") {
39		start, err := strconv.ParseUint(ports, 10, 16)
40		end := start
41		return start, end, err
42	}
43
44	parts := strings.Split(ports, "-")
45	start, err := strconv.ParseUint(parts[0], 10, 16)
46	if err != nil {
47		return 0, 0, err
48	}
49	end, err := strconv.ParseUint(parts[1], 10, 16)
50	if err != nil {
51		return 0, 0, err
52	}
53	if end < start {
54		return 0, 0, fmt.Errorf("Invalid range specified for the Port: %s", ports)
55	}
56	return start, end, nil
57}
58