- auto ip = addr.str();
- if (inet_pton(AF_INET, ip.c_str(), &addr_.inAddr_) != 1) {
- throw IPAddressFormatException(sformat("Invalid IPv4 address '{}'", addr));
+ auto maybeIp = tryFromString(addr);
+ if (maybeIp.hasError()) {
+ throw IPAddressFormatException(
+ to<std::string>("Invalid IPv4 address '", addr, "'"));
+ }
+ *this = std::move(maybeIp.value());
+}
+
+Expected<IPAddressV4, IPAddressFormatError> IPAddressV4::tryFromString(
+ StringPiece str) noexcept {
+ struct in_addr inAddr;
+ if (inet_pton(AF_INET, str.str().c_str(), &inAddr) != 1) {
+ return makeUnexpected(IPAddressFormatError::INVALID_IP);