summaryrefslogtreecommitdiff
path: root/lib/std/netaddr.myr
blob: 432dce9e1a8c54857bedf9516f853e2fd00d5850 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use "alloc"
use "die"
use "memops"
use "endian"
use "fmt"
use "option"
use "result"
use "sldup"
use "strfind"
use "utf"

pkg std =
	const netaddr	: (addr : byte[:], net : byte[:], port : byte[:] -> byte[:])
;;

const netaddr = {addr, net, port
	match strfind(addr, "!")
	| `Some idx:
		match strfind(addr[idx+1:], "!")
		| `Some _:	-> sldup(addr)
		| `None:	/* fall through */
		;;
		if port.len > 0
			-> fmt("{}!{}", addr, port)
		elif net.len > 0
			-> fmt("{}!{}", net, addr)
		else
			-> sldup(addr)
		;;
	| `None:
		match (net.len, port.len)
		| (0, 0):	-> sldup(addr)
		| (0, _):	-> fmt("net!{}!{}", addr, port)
		| (_, 0):	-> fmt("{}!{}", net, addr)
		| (_, _):	-> fmt("{}!{}!{}", net, addr, port)
		;;
	;;
}