///|
fn valid_logical_path(path : String) -> Bool {
if !path.has_prefix("/") {
return false
}
for part in path.split("/") {
if part == "." || part == ".." {
return false
}
}
true
}
///|
async fn main {
let args = @env.args()[1:]
let parsed = @cli.parse(args, [
@cli.flag("logical", short='L'),
@cli.flag("physical", short='P'),
@cli.flag("help"),
]) catch {
@cli.CliError(option~, message~, ..) => {
@stdio.stderr.write("pwd: \{message}: '\{option}'\n")
@sys.exit(2)
return
}
}
if parsed.contains("help") {
@stdio.stdout.write("Usage: pwd [-L|-P]\n")
return
}
if !parsed.operands.is_empty() {
@stdio.stderr.write("pwd: ignoring non-option arguments\n")
}
let logical = match parsed.last_occurrence(["logical", "physical"]) {
Some("logical") => true
Some("physical") => false
_ => @env.get_env_var("POSIXLY_CORRECT") is Some(_)
}
guard @env.current_dir() is Some(current) else {
@stdio.stderr.write("pwd: cannot determine current directory\n")
@sys.exit(1)
return
}
let selected = if logical {
match @env.get_env_var("PWD") {
Some(path) if valid_logical_path(path) => {
let resolved = @fs.realpath(path) catch { _ => "" }
let physical = @fs.realpath(current) catch { _ => current }
if resolved != "" && resolved == physical {
path
} else {
current
}
}
_ => current
}
} else {
@fs.realpath(current) catch {
err => {
@stdio.stderr.write("pwd: \{err}\n")
@sys.exit(1)
return
}
}
}
@stdio.stdout.write(selected + "\n")
}