Environment config reader with typed validation

C++
#include <charconv>
#include <cstdlib>
#include <stdexcept>
#include <string>

std::string env(const char* key, const std::string& fallback = "") {
    const char* v = std::getenv(key);
    return (v && *v) ? std::string(v) : fallback;
}

int envInt(const char* key, int fallback, int min, int max) {
    std::string raw = env(key);
    if (raw.empty()) return fallback;
    int value = 0;
    auto [ptr, ec] = std::from_chars(raw.data(), raw.data() + raw.size(), value);
    if (ec != std::errc() || ptr != raw.data() + raw.size() || value < min || value > max)
        throw std::runtime_error(std::string("invalid value for ") + key + ": " + raw);
    return value;
}