-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x/net: generalize
tcp.Address
into ip.Address
Generalize `tcp.Address` into `ip.Address` given that multiple transport protocols apart from TCP (i.e. UDP) operate solely over IP.
- Loading branch information
Showing
3 changed files
with
67 additions
and
57 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
const std = @import("../../std.zig"); | ||
|
||
const IPv4 = std.x.os.IPv4; | ||
const IPv6 = std.x.os.IPv6; | ||
const Socket = std.x.os.Socket; | ||
|
||
const ip = @This(); | ||
|
||
/// A union of all eligible types of IP addresses. | ||
pub const Address = union(enum) { | ||
ipv4: IPv4.Address, | ||
ipv6: IPv6.Address, | ||
|
||
/// Instantiate a new address with a IPv4 host and port. | ||
pub fn initIPv4(host: IPv4, port: u16) Address { | ||
return .{ .ipv4 = .{ .host = host, .port = port } }; | ||
} | ||
|
||
/// Instantiate a new address with a IPv6 host and port. | ||
pub fn initIPv6(host: IPv6, port: u16) Address { | ||
return .{ .ipv6 = .{ .host = host, .port = port } }; | ||
} | ||
|
||
/// Re-interpret a generic socket address into an IP address. | ||
pub fn from(address: Socket.Address) ip.Address { | ||
return switch (address) { | ||
.ipv4 => |ipv4_address| .{ .ipv4 = ipv4_address }, | ||
.ipv6 => |ipv6_address| .{ .ipv6 = ipv6_address }, | ||
}; | ||
} | ||
|
||
/// Re-interpret an IP address into a generic socket address. | ||
pub fn into(self: ip.Address) Socket.Address { | ||
return switch (self) { | ||
.ipv4 => |ipv4_address| .{ .ipv4 = ipv4_address }, | ||
.ipv6 => |ipv6_address| .{ .ipv6 = ipv6_address }, | ||
}; | ||
} | ||
|
||
/// Implements the `std.fmt.format` API. | ||
pub fn format( | ||
self: ip.Address, | ||
comptime layout: []const u8, | ||
opts: fmt.FormatOptions, | ||
writer: anytype, | ||
) !void { | ||
switch (self) { | ||
.ipv4 => |address| try fmt.format(writer, "{}:{}", .{ address.host, address.port }), | ||
.ipv6 => |address| try fmt.format(writer, "{}:{}", .{ address.host, address.port }), | ||
} | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters