Skip to content

CLI Design Pattern#1

Merged
adamgracikowski merged 11 commits into
developfrom
feature/cli-design-pattern
Jul 18, 2025
Merged

CLI Design Pattern#1
adamgracikowski merged 11 commits into
developfrom
feature/cli-design-pattern

Conversation

@adamgracikowski
Copy link
Copy Markdown
Contributor

@adamgracikowski adamgracikowski commented Jul 17, 2025

Co w PR?:

Zmiany w cli:

  • Dodałem MevaCommand jako abstrakcję dla polecenia w naszym systemie (wykorzystuje clap builder-pattern).
  • Do obsługi błędów i ich ładnego formatowania wykorzystujemy miette, dzięki czemu możemy owijać błędy wielokrotnie (na przykład te, które zwraca biblioteka engine).

Przykład ładnego formatowania:

image
  • Dodałem polecenie init (wszystkie opcje i funkcjonalności zgodnie ze specką init.md).
  • Z poziomu CLI jedyne co robimy to wywołujemy odpowiednią logikę z biblioteki engine i owijamy ewentualny błąd.

Zmiany w engine:

  • RepositoryLayout to trait, przy pomocy którego łatwo odwołujemy się do struktury naszego repozytorium.
  • MevaRepository to struktura implementująca RepositoryLayout oraz posiadająca metodę init.
  • Strukturę tworzymy przy pomocy parametru working_dir o typie PathBuf.
  • Polecenie init na ten moment tworzy taką strukturę:
.meva/
├── objects/
│   └── ...
├── refs/
│   ├── heads/
│   │   └── <initial_branch>
│   └── ...
├── logs/
│   ├── heads/
│   │   └── <initial_branch>
│   ├── HEAD
│   └── ...
└── HEAD
  • W miarę dodawania funkcjonalności można uzupełnić brakujące foldery/pliki (w metodach create_dirs oraz create_files i dodać je do layout-u repo)

Uawga: Na ten moment w przypadku błędu w momencie tworzenia struktury repozytorium nie ma logiki typu rollback, więc może się zdarzyć, że repozytorium będzie w niespójnym stanie (do zastanowienia, czy już teraz chcemy zająć się tą transakcyjnością, o której rozmawialiśmy).

@mikolajkarbowski
Copy link
Copy Markdown
Contributor

mikolajkarbowski commented Jul 17, 2025

Już się tak nie definiuje modułów w ruscie, to stary sposób

.
└── src/
    ├── utils/
    │   ├── bar.rs
    │   ├── foo.rs
    │   └── mod.rs
    └── main.rs

zalecane jest to robić w taki, nowszy sposób:

.
└── src/
    ├── utils/
    │   ├── bar.rs
    │   └── foo.rs
    ├── utils.rs
    └── main.rs

https://stackoverflow.com/questions/26435102/in-rust-what-is-the-purpose-of-a-mod-rs-file

Lepiej żebyśmy używali tego nowego podejścia

@adamgracikowski
Copy link
Copy Markdown
Contributor Author

Lepiej żebyśmy używali tego nowego podejścia

spoko, to poprawię wszędzie

@adamgracikowski
Copy link
Copy Markdown
Contributor Author

już nie ma ani jednego mod.rs 🤙

@adamgracikowski
Copy link
Copy Markdown
Contributor Author

Zmieniłem implementację init w taki sposób, że najpierw jest tworzony folder tymczasowy z repozytorium, a potem jeżeli tworzenie wszystkich folderów i plików się powiedzie, to jest przenoszone całe repo za pomocą rename (czyli przepięcie w systemie plików) do docelowego miejsca. Jeżeli coś się po drodze wysypie, to tempdir ma taką właściwość, że jak kończy się jego scope, to drop go usuwa z całą zawartością - więc teraz nie będzie przypadku częściowo utworzonego repo 🔥

Comment thread cli/src/meva_cli.rs Outdated
Comment thread cli/src/commands/init/mod.rs
@adamgracikowski adamgracikowski merged commit f92365d into develop Jul 18, 2025
1 check passed
@adamgracikowski adamgracikowski deleted the feature/cli-design-pattern branch July 18, 2025 18:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants