| 23 | */ |
| 24 | |
| 25 | TMaybe<TString> TryGetEnv(const TString& key) { |
| 26 | #ifdef _win_ |
| 27 | size_t len = GetEnvironmentVariableA(key.data(), nullptr, 0); |
| 28 | |
| 29 | if (len == 0) { |
| 30 | if (GetLastError() == ERROR_ENVVAR_NOT_FOUND) { |
| 31 | return Nothing(); |
| 32 | } |
| 33 | return TString{}; |
| 34 | } |
| 35 | |
| 36 | TVector<char> buffer(len); |
| 37 | size_t bufferSize; |
| 38 | do { |
| 39 | bufferSize = buffer.size(); |
| 40 | len = GetEnvironmentVariableA(key.data(), buffer.data(), static_cast<DWORD>(bufferSize)); |
| 41 | if (len > bufferSize) { |
| 42 | buffer.resize(len); |
| 43 | } |
| 44 | } while (len > bufferSize); |
| 45 | |
| 46 | return TString(buffer.data(), len); |
| 47 | #else |
| 48 | const char* env = getenv(key.data()); |
| 49 | if (!env) { |
| 50 | return Nothing(); |
| 51 | } |
| 52 | return TString(env); |
| 53 | #endif |
| 54 | } |
| 55 | |
| 56 | TString GetEnv(const TString& key, const TString& def) { |
| 57 | TMaybe<TString> value = TryGetEnv(key); |