js -d:nodejs now supports osenv: getEnv, putEnv, envPairs, delEnv, existsEnv (v2) (#15826)
* js -d:nodejs now supports osenv: `getEnv`, `putEnv`, `envPairs`, `delEnv`, `existsEnv` * refactor to osenv * fix for js (without -d:nodejs) + VM Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
parent
bc007a3cd3
commit
cc882917fe
3 changed files with 272 additions and 208 deletions
|
|
@ -31,6 +31,8 @@
|
||||||
- Removed deprecated `iup` module from stdlib, it has already moved to
|
- Removed deprecated `iup` module from stdlib, it has already moved to
|
||||||
[nimble](https://github.com/nim-lang/iup).
|
[nimble](https://github.com/nim-lang/iup).
|
||||||
|
|
||||||
|
- Removed deprecated `iup` module from stdlib, it has already moved to [nimble](https://github.com/nim-lang/iup).
|
||||||
|
- nodejs now supports osenv: `getEnv`, `putEnv`, `envPairs`, `delEnv`, `existsEnv`
|
||||||
- `doAssertRaises` now correctly handles foreign exceptions.
|
- `doAssertRaises` now correctly handles foreign exceptions.
|
||||||
|
|
||||||
## Language changes
|
## Language changes
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,42 @@
|
||||||
when not declared(os) and not declared(ospaths):
|
when not declared(os) and not declared(ospaths):
|
||||||
{.error: "This is an include file for os.nim!".}
|
{.error: "This is an include file for os.nim!".}
|
||||||
|
|
||||||
|
when defined(nodejs):
|
||||||
|
proc getEnv*(key: string, default = ""): TaintedString {.tags: [ReadEnvEffect].} =
|
||||||
|
var ret: cstring
|
||||||
|
let key2 = key.cstring
|
||||||
|
{.emit: "`ret` = process.env[`key2`];".}
|
||||||
|
result = $ret
|
||||||
|
|
||||||
|
proc existsEnv*(key: string): bool {.tags: [ReadEnvEffect].} =
|
||||||
|
var key2 = key.cstring
|
||||||
|
var ret: bool
|
||||||
|
{.emit: "`ret` = `key2` in process.env;".}
|
||||||
|
result = ret
|
||||||
|
|
||||||
|
proc putEnv*(key, val: string) {.tags: [WriteEnvEffect].} =
|
||||||
|
var key2 = key.cstring
|
||||||
|
var val2 = val.cstring
|
||||||
|
{.emit: "process.env[`key2`] = `val2`;".}
|
||||||
|
|
||||||
|
proc delEnv*(key: string) {.tags: [WriteEnvEffect].} =
|
||||||
|
var key2 = key.cstring
|
||||||
|
{.emit: "delete process.env[`key2`];".}
|
||||||
|
|
||||||
|
iterator envPairs*(): tuple[key, value: TaintedString] {.tags: [ReadEnvEffect].} =
|
||||||
|
var num: int
|
||||||
|
var keys: RootObj
|
||||||
|
{.emit: "`keys` = Object.keys(process.env); `num` = `keys`.length;".}
|
||||||
|
for i in 0..<num:
|
||||||
|
var key, value: cstring
|
||||||
|
{.emit: "`key` = `keys`[`i`]; `value` = process.env[`key`];".}
|
||||||
|
yield ($key, $value)
|
||||||
|
|
||||||
|
# commented because it must keep working with js+VM
|
||||||
|
# elif defined(js):
|
||||||
|
# {.error: "requires -d:nodejs".}
|
||||||
|
|
||||||
|
else:
|
||||||
when defined(windows):
|
when defined(windows):
|
||||||
from parseutils import skipIgnoreCase
|
from parseutils import skipIgnoreCase
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,3 +19,29 @@ block:
|
||||||
if not isWindows:
|
if not isWindows:
|
||||||
doAssert cwd.isAbsolute
|
doAssert cwd.isAbsolute
|
||||||
doAssert relativePath(getCurrentDir() / "foo", "bar") == "../foo"
|
doAssert relativePath(getCurrentDir() / "foo", "bar") == "../foo"
|
||||||
|
|
||||||
|
import std/sequtils
|
||||||
|
|
||||||
|
template main =
|
||||||
|
putEnv("foo", "bar")
|
||||||
|
doAssert getEnv("foo") == "bar"
|
||||||
|
doAssert existsEnv("foo")
|
||||||
|
|
||||||
|
putEnv("foo", "")
|
||||||
|
doAssert existsEnv("foo")
|
||||||
|
putEnv("foo", "bar2")
|
||||||
|
doAssert getEnv("foo") == "bar2"
|
||||||
|
|
||||||
|
when nimvm:
|
||||||
|
discard
|
||||||
|
else:
|
||||||
|
# need support in vmops: envPairs, delEnv
|
||||||
|
let s = toSeq(envPairs())
|
||||||
|
doAssert ("foo", "bar2") in s
|
||||||
|
doAssert ("foo", "bar") notin s
|
||||||
|
|
||||||
|
delEnv("foo")
|
||||||
|
doAssert not existsEnv("foo")
|
||||||
|
|
||||||
|
static: main()
|
||||||
|
main()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue