Tekst podsumowany przez sztuczną inteligencję durumis
- Rust jest doskonałym językiem do tworzenia programów CLI, a korzystając z bibliotek clap i ratatui, zaimplementowaliśmy prosty program CLI z funkcjami logowania i wylogowywania.
- Za pomocą clapa zdefiniowaliśmy różne opcje i podkomendy, a dzięki ratatui stworzyliśmy interaktywne okno wejściowe, zwiększając wygodę i bezpieczeństwo.
- Na dzień 18 kwietnia 2024 autor przedstawił wygodny sposób tworzenia programów CLI w Rust.
Moim doświadczeniem z językiem Rust jest to, że jest to najbardziej niezawodny i wygodny język do pisania CLI.
Wynika to z tego, że jego znakomite możliwości rozszerzania makr pozwalają na zdefiniowanie i sprawdzenie wszystkich ograniczeń i weryfikacji na poziomie struktury, a także na pełne wykorzystanie mocy typu.
W tym poście stworzymy prosty przykładowy program CLI do obsługi logowania i wylogowywania przy użyciu clap i ratatui. Wprowadzimy w nim ogólny sposób tworzenia i przykładowe zastosowania.
Podstawowe ustawienia clap
Najpierw dodaj do zależności poniższe 4 elementy.
```javascript atty = { version = "0.2.14", optional = true } structopt = { version = "0.3.18", optional = true } clap = { version = "4.4.18", features = ["derive"] } serde = { version = "1", features = ["derive"] }
Pierwsze 2 są dla mapowania poleceń cargo, a dolne 2 dla parsowania clap.
Teraz dodawajmy kod kawałek po kawałku.
Najpierw zdefiniuj typ najwyższego poziomu polecenia i umieść w nim enum podpoleceń.
Enum podpoleceń będzie zawierał polecenia logowania i wylogowywania, które zostaną wkrótce zdefiniowane.
A następnie, gdy polecenie zostanie zainicjalizowane w powyższy sposób, podstawowa struktura zostanie ukończona.
Program utworzony w ten sposób może być uruchomiony za pomocą cargo run lub
po zainstalowaniu za pomocą cargo install, a następnie uruchomiony.
Definicja podpoleceń
Zdefiniujmy teraz podpolecenia.
Logowanie i wylogowywanie będą oddzielnymi podpoleceniami.
Utworzyłem oddzielny plik, aby zdefiniować polecenie logowania.
Definiuje elementy flagowe za pomocą obiektów Option.
short określa, czy ma być tworzony skrót, taki jak -i, a long określa, czy ma być tworzony pełny tekst, taki jak --id. Oczywiście help to pomoc.
Aby te flagi były opcjonalne, musisz ustawić typ na Option lub przypisać atrybut default_value.
A następnie dodaj to jako wariant do podpolecenia obiektu polecenia najwyższego poziomu.
Tym razem polecenie wylogowania. To jest łatwiejsze.
Ponieważ nie ma żadnych opcji do wyboru.
Podobnie jak poprzednio zarejestrowane jako podpolecenie polecenia najwyższego poziomu.
W punkcie wejścia action również rozgałęzia się do enum, więc rozgałęź się odpowiednio za pomocą dopasowania wzorców.
A gdy uruchomisz,
zobaczysz, że zostało dodane do listy podpoleceń.
Wykonuje się również poprawnie. Narzeka, że brakuje flagi obowiązkowej, jeśli ją pominiesz.
Jeśli przekażesz go, będzie działał dobrze. Jednakże, nie wykonuje jeszcze żadnych akcji.
Podziel akcje i zaimplementuj je
Teraz dodajmy trochę logiki implementacji. W takich przypadkach wolę oddzielać logikę według plików. Jeśli scalimy wszystko, staje się to zbyt nieporęczne i brzydkie.
Stworzyłem moduł action i umieściłem w nim po jednym pliku dla każdego działania podpolecenia.
Każda funkcja akcji przyjmuje opcje podpolecenia jako argumenty.
A następnie wszystkie akcje są przekazywane do run w punkcie wejścia.
Wygląda całkiem czysto, prawda?
Teraz, gdy prawie wszystko jest gotowe, zaimplementujmy jakąś sensowną logikę.
Logowanie skonfigurowane jest tak, aby wypisywać przekazane flagi do pliku poświadczeń.
Wylogowanie usuwa wygenerowany plik poświadczeń.
Jeśli więc spróbujesz zalogować się
zostanie utworzony zgodnie z danymi wejściowymi
a jeśli spróbujesz się wylogować
zostanie usunięty zgodnie z oczekiwaniami.
Implementacja interaktywnego polecenia za pomocą TUI
Cóż, jeśli jest jedna lub dwie flagi obowiązkowe, to nie jest to problem, ale jeśli jest dużo flag, to znalezienie ich wszystkich i wprowadzenie jest dość uciążliwe.
Lub po prostu wyświetlanie hasła na ekranie może stanowić problem bezpieczeństwa.
W takim przypadku korzystne może być zapewnienie TUI ze względu na wygodę i bezpieczeństwo.
Zaimplementujmy interaktywne okno wprowadzania, w tym maskowanie hasła, za pomocą ratatui, całkiem przyzwoitego środowiska TUI w języku Rust.
Najpierw dodaj 2 zależności poniżej.
```javascript crossterm = "0.27.0" ratatui = "0.26.0"
A następnie dodaj opcję interaktywnego uruchamiania do flagi logowania.
Jeśli ta opcja zostanie podana, przejmij kontrolę na kontekst interaktywny.
Oto jest.
Oto podstawowy kod.
Na pierwszy rzut oka może wydawać się nieco długi i mylący, ale nie ma w nim nic wielkiego.
Po prostu bez końca kręci się w pętli, renderując tekst.
I wychodzi z pętli, gdy otrzyma wejście klawisza q.
Jeśli uruchomisz go poprawnie
przeniesie się do migającego kontekstu poleceń.
Wpisanie q spowoduje wyjście.
Zaimplementujmy teraz proces wprowadzania.
W rzeczywistości nie ma nic wielkiego.
Zdefiniuj typy etapów, zdefiniuj kontekst bieżącego etapu i zmienne wejściowe.
Na początku każdej pętli renderuj tekst instrukcji i bieżący stan wprowadzania w zależności od bieżącego etapu.
Po zakończeniu czynności za pomocą Done, wszystkie dane wejściowe zostaną wprowadzone, więc ponownie wywołaj funkcję run, aby ponownie wykorzystać istniejącą logikę.
Obsługa zdarzeń jest nieco bardziej skomplikowana.
Zostało to skonfigurowane tak, aby modyfikować zmienne wejściowe lub przechodzić do następnego etapu w zależności od etapu i danego wejścia.
Jeśli zostanie wprowadzony Backspace, zostanie cofnięte, jeśli zostanie wprowadzony znak, zostanie dodany. Naciśnięcie klawisza Esc powoduje zamknięcie programu, a naciśnięcie klawisza Enter powoduje przejście do następnego etapu.
Uruchom to ponownie.
Wprowadzane są zgodnie z oczekiwaniami
a hasło jest również wprowadzane w zamaskowanej formie.
Jeśli wprowadzisz wszystko i naciśniesz Enter
program zostanie zamknięty, a wprowadzone wartości zostaną zwolnione.
Możesz to zrobić w ten sposób.
Jest to trochę żmudne, ale nie jest takie trudne.
Cały kod można znaleźć pod poniższym linkiem.