module std::io::os;
import std::io::path, libc, std::os;

macro void? native_chdir(Path path)
{
	@pool()
	{
		$switch:
			$case env::POSIX:
				if (posix::chdir(path.str_view().zstr_tcopy()))
				{
					switch (libc::errno())
					{
						case errno::EACCES: return io::NO_PERMISSION?;
						case errno::ENAMETOOLONG: return io::NAME_TOO_LONG?;
						case errno::ENOTDIR: return io::FILE_NOT_DIR?;
						case errno::ENOENT: return io::FILE_NOT_FOUND?;
						case errno::ELOOP: return io::SYMLINK_FAILED?;
						default: return io::GENERAL_ERROR?;
					}
				}
			$case env::WIN32:
				// TODO improve with better error handling.
				if (win32::setCurrentDirectoryW(path.str_view().to_temp_utf16()!!)) return;
				return io::GENERAL_ERROR?;
			$default:
				return io::UNSUPPORTED_OPERATION?;
		$endswitch
	};
}
