diff --git a/pkgs/clan-cli/clan_cli/__init__.py b/pkgs/clan-cli/clan_cli/__init__.py index 76b45591..9e2ee5ea 100644 --- a/pkgs/clan-cli/clan_cli/__init__.py +++ b/pkgs/clan-cli/clan_cli/__init__.py @@ -6,6 +6,11 @@ from pathlib import Path from types import ModuleType from typing import Any +# These imports are unused, but necessary for @API.register to run once. +from clan_cli.api import directory + +__all__ = ["directory"] + from . import ( backups, config, diff --git a/pkgs/clan-cli/clan_cli/api/directory.py b/pkgs/clan-cli/clan_cli/api/directory.py new file mode 100644 index 00000000..de141b22 --- /dev/null +++ b/pkgs/clan-cli/clan_cli/api/directory.py @@ -0,0 +1,56 @@ +import os +from dataclasses import dataclass, field +from pathlib import Path +from typing import Literal + +from clan_cli.errors import ClanError + +from . import API + + +@dataclass +class File: + path: str + file_type: Literal["file", "directory", "symlink"] + + +@dataclass +class Directory: + path: str + files: list[File] = field(default_factory=list) + + +@API.register +def get_directory(current_path: str) -> Directory: + curr_dir = Path(current_path) + directory = Directory(path=str(curr_dir)) + + if not curr_dir.is_dir(): + raise ClanError() + + with os.scandir(curr_dir.resolve()) as it: + for entry in it: + if entry.is_symlink(): + directory.files.append( + File( + path=str(curr_dir / Path(entry.name)), + file_type="symlink", + ) + ) + elif entry.is_file(): + directory.files.append( + File( + path=str(curr_dir / Path(entry.name)), + file_type="file", + ) + ) + + elif entry.is_dir(): + directory.files.append( + File( + path=str(curr_dir / Path(entry.name)), + file_type="directory", + ) + ) + + return directory