diff --git a/README.md b/README.md index d53e4e1..7b0d455 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,12 @@ ```sh d-examples -├── shell Запуск команд в shell -│ ├── pipe Чтение выходных данных на примере ip -│ └── spinner Эмуляция статуса выполнения процесса -└── ncurses Использование библиотеки ncurses - ├── menu Интерактивное консольное меню - └── password Консольное окно для ввода пароля +├── common Общего назначения +│ ├── isexists Проверяет наличие исполняемого файла в директориях,указанных в переменной окружения PATH +├── ncurses Использование библиотеки ncurses +│ ├── menu Интерактивное консольное меню +│ └── password Консольное окно для ввода пароля +└── shell Запуск команд в shell + ├── pipe Чтение выходных данных на примере ip + └── spinner Эмуляция статуса выполнения процесса ``` diff --git a/dub.json b/dub.json index a3cd59f..ba51322 100644 --- a/dub.json +++ b/dub.json @@ -13,6 +13,6 @@ "ncurses": "~>1.0.0" }, "libs": [ - "formw" - ] + "formw" + ] } \ No newline at end of file diff --git a/source/app.d b/source/app.d index e9eb7aa..fdb3759 100644 --- a/source/app.d +++ b/source/app.d @@ -7,24 +7,31 @@ private string programName = "d-examples"; int main(string[] args) { auto argumets = new Program(programName, examplesVersion) - .add(new Command("shell", "Запуск команд в shell") - .add(new Command("pipe", "Чтение выходных данных на примере ip")) - .add(new Command("spinner", "Эмуляция статуса выполнения процесса")) + .add(new Command("common", "Общего назначения") + .add(new Command("isexists", + "Проверяет наличие исполняемого файла в директориях,указанных в переменной окружения PATH")) ) .add(new Command("ncurses", "Использование библиотеки ncurses") .add(new Command("menu", "Интерактивное консольное меню")) .add(new Command("password", "Консольное окно для ввода пароля")) ) + .add(new Command("shell", "Запуск команд в shell") + .add(new Command("pipe", "Чтение выходных данных на примере ip")) + .add(new Command("spinner", "Эмуляция статуса выполнения процесса")) + ) .parse(args); argumets - .on("shell", (shell) { shell - .on("pipe", (pipe) { pipeShell(); }) - .on("spinner", (loading) { spinnerShell(); }); + .on("common", (common) { common + .on("isexists", (isexists) { isExists(); }); }) .on("ncurses", (ncurses) { ncurses .on("menu", (items) { menuNcurses(); }) .on("password", (password) { passwordNcurses(); }); + }) + .on("shell", (shell) { shell + .on("pipe", (pipe) { pipeShell(); }) + .on("spinner", (loading) { spinnerShell(); }); }); return EXIT_SUCCESS; diff --git a/source/examples/common/README.md b/source/examples/common/README.md new file mode 100644 index 0000000..cabdc5a --- /dev/null +++ b/source/examples/common/README.md @@ -0,0 +1,5 @@ +# Общего назначения + +## isexists + +Функция `isExecutableExists` проверяет наличие исполняемого файла `appName` в директориях, указанных в переменной окружения `PATH`. Разбивает `PATH` на директории, формирует полный путь к файлу и проверяет его существование и тип (файл). Возвращает `true`, если файл найден, иначе `false`. Использует модули `std.process`, `std.file`, `std.path`, `std.array`. diff --git a/source/examples/common/isexists.d b/source/examples/common/isexists.d new file mode 100644 index 0000000..e69f190 --- /dev/null +++ b/source/examples/common/isexists.d @@ -0,0 +1,30 @@ +module examples.common.isexists; + +import std.process : environment; +import std.file : exists, isFile; +import std.path : pathSeparator, buildPath; +import std.array : split; +import std.stdio : writefln; + +// Проверка существования утилиты в PATH +private bool isExecutableExists(string appName) { + auto path = environment.get("PATH"); + if (path is null) return false; + + foreach (dir; path.split(pathSeparator)) { + auto fullPath = buildPath(dir, appName); + if (exists(fullPath) && isFile(fullPath)) { + return true; + } + } + return false; +} + +void isExists() { + foreach (app; ["ls", "mc", "htop", "bash", "nano"]) { + if (isExecutableExists(app)) + writefln("Приложение %s найдено", app); + else + writefln("Приложение %s не найдено", app); + } +} diff --git a/source/examples/common/package.d b/source/examples/common/package.d new file mode 100644 index 0000000..762aa45 --- /dev/null +++ b/source/examples/common/package.d @@ -0,0 +1,3 @@ +module examples.common; + +public import examples.common.isexists; diff --git a/source/examples/package.d b/source/examples/package.d index a4f5442..68e3895 100644 --- a/source/examples/package.d +++ b/source/examples/package.d @@ -3,3 +3,4 @@ module examples; public import examples.version_; public import examples.shell; public import examples.ncurses; +public import examples.common; diff --git a/source/examples/version_.d b/source/examples/version_.d index 67eadf2..c643e35 100644 --- a/source/examples/version_.d +++ b/source/examples/version_.d @@ -1,3 +1,3 @@ module examples.version_; -enum examplesVersion = "0.2.0"; +enum examplesVersion = "0.3.0";