auto ServiceURI::parse()

in lib/ServiceURI.cc [54:100]


auto ServiceURI::parse(const std::string& uriString) -> DataType {
    size_t pos = uriString.find("://");
    if (pos == std::string::npos) {
        throw std::invalid_argument("The scheme part is missing: " + uriString);
    }
    if (pos == 0) {
        throw std::invalid_argument("Expected scheme name at index 0: " + uriString);
    }
    const auto scheme = scheme::toScheme(uriString.substr(0, pos));

    pos += 3;  // now it points to the end of "://"
    if (pos < uriString.size() && uriString[pos] == '/') {
        throw std::invalid_argument("authority component is missing in service uri: " + uriString);
    }

    std::vector<std::string> addresses;
    while (pos < uriString.size()) {
        const size_t endPos = uriString.find(',', pos);
        if (endPos == std::string::npos) {
            addresses.emplace_back(uriString.substr(pos, endPos - pos));
            break;
        }
        addresses.emplace_back(uriString.substr(pos, endPos - pos));
        pos = endPos + 1;
    }

    bool hasEmptyAddress = false;
    for (auto& address : addresses) {
        processAddress(address, scheme);
        if (address.empty()) {
            hasEmptyAddress = true;
        }
    }
    if (hasEmptyAddress) {
        auto originalAddresses = addresses;
        addresses.clear();
        for (const auto& address : originalAddresses) {
            if (!address.empty()) {
                addresses.emplace_back(address);
            }
        }
    }
    if (addresses.empty()) {
        throw std::invalid_argument("No service url is provided yet");
    }
    return std::make_pair(scheme, addresses);
}