diff options
author | Chris Knight <cknight1234@gmail.com> | 2020-03-15 15:48:46 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-15 11:48:46 -0400 |
commit | 620dd9724d4f8568efebb1642b49c653de9424cd (patch) | |
tree | e57827e536c264189f151ffebffe7e9faaae0c46 /std/node/_fs/_fs_readlink.ts | |
parent | dc6e0c3591709d6f8887bb672af1de54dfc8a974 (diff) |
refactor: move existing fs implementation to internal _fs directory (#4381)
Diffstat (limited to 'std/node/_fs/_fs_readlink.ts')
-rw-r--r-- | std/node/_fs/_fs_readlink.ts | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/std/node/_fs/_fs_readlink.ts b/std/node/_fs/_fs_readlink.ts new file mode 100644 index 000000000..d1cb69f51 --- /dev/null +++ b/std/node/_fs/_fs_readlink.ts @@ -0,0 +1,78 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +import { + intoCallbackAPIWithIntercept, + MaybeEmpty, + notImplemented +} from "../_utils.ts"; + +const { readlink: denoReadlink, readlinkSync: denoReadlinkSync } = Deno; + +type ReadlinkCallback = ( + err: MaybeEmpty<Error>, + linkString: MaybeEmpty<string | Uint8Array> +) => void; + +interface ReadlinkOptions { + encoding?: string | null; +} + +function maybeEncode( + data: string, + encoding: string | null +): string | Uint8Array { + if (encoding === "buffer") { + return new TextEncoder().encode(data); + } + return data; +} + +function getEncoding( + optOrCallback?: ReadlinkOptions | ReadlinkCallback +): string | null { + if (!optOrCallback || typeof optOrCallback === "function") { + return null; + } else { + if (optOrCallback.encoding) { + if ( + optOrCallback.encoding === "utf8" || + optOrCallback.encoding === "utf-8" + ) { + return "utf8"; + } else if (optOrCallback.encoding === "buffer") { + return "buffer"; + } else { + notImplemented(); + } + } + return null; + } +} + +export function readlink( + path: string, + optOrCallback: ReadlinkCallback | ReadlinkOptions, + callback?: ReadlinkCallback +): void { + let cb: ReadlinkCallback | undefined; + if (typeof optOrCallback === "function") { + cb = optOrCallback; + } else { + cb = callback; + } + + const encoding = getEncoding(optOrCallback); + + intoCallbackAPIWithIntercept<string, Uint8Array | string>( + denoReadlink, + (data: string): string | Uint8Array => maybeEncode(data, encoding), + cb, + path + ); +} + +export function readlinkSync( + path: string, + opt?: ReadlinkOptions +): string | Uint8Array { + return maybeEncode(denoReadlinkSync(path), getEncoding(opt)); +} |