Skip to content

DroidsOnRoids/dor-gen-flutter

Repository files navigation

  1. Opis
  2. Instalacja
  3. Użycie
  4. Błędy
  5. Ograniczenia
  6. Zgłaszanie błędów
  7. Roadmap

Dor Generator

Narzędzie do generowania kodu warstw domain i data.

Opis

Dto i mappery

Aby wygenerować klasę Dto dodaj adnotację [Dto] na klasie domain. Możesz podać argumenty do [Dto] aby zmienić ustawienia generowanego kodu. Możesz również zmienić ustawienia poszczególnych pól używając adnotacji [DtoConfigure] Wygenerowana klasa będzie miała nazwę <nazwaKlasyŹródłowej>Dto oraz wygenerowane zostaną extension na <nazwaKlasyŹródłowejDto> i <nazwaKlasyŹródłowej> z metodami odpowiednio toDomain i toDto. klasa <nazwaKlasyŹródłowej>Dto będzie adnotowana adnotacją JsonSerializable którą można przekazać jako argument do [Dto]. Pola klasy <nazwaKlasyŹródłowej>Dto będą adnotowane adnotacją JsonKey jeżeli zostanie ona podana jako argument do [DtoConfig].

UseCase

Aby wygenerować klasy useCase do metod danej klasy dodaj do niej adnotacje [DorGenerator]. Możesz podać argumenty do [DorGenerator] aby zmienić ustawienia generowanego pliku. Możesz również zmienić ustawienia poszczególnych metod używając [DorConfigure]. Wygenerowane klasy będą miały nazwy <nazwaMetody>UseCase i będą adnotowane injectable. Aby można było wygenerować useCase wszystkie argumenty metody muszą być argumentami 'named'.

Implementacja klasy abstrakcyjnej

Aby wygenerować klasę Implementującą, dodaj adnotacje [DorGenerator]. Możesz podać argumenty do [DorGenerator] aby zmienić ustawienia generowanego pliku. Możesz również zmienić ustawienia poszczególnych metod używając [DorConfigure]. Wygenerowana klasa będzie miała nazwę <nazwaKlasyŹródłowej>Impl oraz adnotacje @LazySingleton(as: <nazwaKlasyŹródłowej> ) Aby można było wygenerować metody wszystkie ich argumenty muszą być argumentami 'named'. Klasa <nazwaKlasyŹródłowej>Impl jako argument konstruktora przyjmuje klasę <nazwaKlasyŹródłowej>DataSource którą importuje z pliku w tym samym katalogu co klasa źródłowa o nazwie <nazwaPlikuKlasyŹródłowej>.data_source.g.dart

DataSource

Aby wygenerować klasę DataSource, dodaj adnotacje [DorGenerator]. Możesz podać argumenty do [DorGenerator] aby zmienić ustawienia generowanego pliku. Możesz również zmienić ustawienia poszczególnych metod używając [DorConfigure]. Argumenty [ApiMethod] oraz path są obowiązkowe. Wygenerowana klasa będzie klasą abstrakcyjną o nazwie <nazwaKlasyŹródłowej>DataSource przygotowaną do tego aby z niej generować pliki przy użyciu paczki retrofit i jest adnotowana @LazySingleton() z paczki injectable. Argumenty metod można adnotować adnotacjami Path, Body i Query pochodzącymi z paczki retrofit.

Instalacja

dependencies:  
  # dodaj dor_gen do swoich dependencies
  dor_gen:
    git:
      #TODO dodaj link do projektu
      url:
      # numer wersji
      ref: 0.5.0

Użycie

Dto

Dodaj adnotacje do swojej klasy

// Dodaj adnotacje dto
@Dto()
class Cat {
  final int id;
  final String name;
  final List<String> toys;

  const Cat({
    required this.id,
    required this.name,
    required this.toys,
  });
}

Uruchom generator

# dart
dart pub run build_runner build

# flutter
flutter pub run build_runner build

Powinien wygenerować się plik <nazwa_pliku_źródłowego>.dto.g.dart z klasą CatDto oraz extension CatDtoToCat i CatToCatDto, oraz plik <nazwa_pliku_źródłowego>.dto.g.g.dart wygenerowany przez json_serializable.

Klasy UseCase, Impl, DataSource

Standard

Dodaj adnotacje do klasy

//dodaj adnotacje DorGenerator do klasy
@DorGenerator()
abstract class FooRepository {
  //Dodaj adnotacje DorConfig do metod
  @DorConfig(
    apiMethod: ApiMethod.POST,
    path: '/api/v1/foo/doNothing',
  )
  Future<Thing> doSomething({
    required String id, 
    required String name,
  });
}

Uruchom generator

# dart
dart pub run build_runner build

# flutter
flutter pub run build_runner build

Powinny wygenerować się pliki:

  • <nazwa_pliku_źródłowego>.data_source.g.dart z abstrakcją klasy FooRepositoryDataSource
  • <nazwa_pliku_źródłowego>.data_source.g.g.dart wygenerowany przez retrofit
  • <nazwa_pliku_źródłowego>.use_case.g.dart z klasą DoSomethingUseCase
  • <nazwa_pliku_źródłowego>.impl.g.dart z klasą FooRepositoryImpl z implementacją FooRepository

Konfiguracja

  • Jeżeli nie chcesz aby generował się któryś z tych elementów ustaw na false odpowiedni argument:
    • generateUseCase dla use_case
    • generateDataSource dla data_source
    • generateRepositoryImpl dla impl
  • Jeżeli nie chcesz generować useCase dla konkretnej metody użyj znacznika adnotacji DorConfig z parametrem generateUseCase ustawionym na false.
  • Jeżeli nie chcesz generować takiej metody w pliku dataSource użyj adnotacji DorConfig z parametrem generateDataSourceMethod ustawionym na false.

Błędy

UnnamedParameterError oznaczający, że któryś z argumentów w funkcjach lub konstruktorze nie jest 'named'. BadArgumentsError oznacza, że któryś argument został źle zastosowany. MissingArgumentError oznacza, że któryś z wymaganych argumentów w adnotacjach nie został podany.

Ograniczenia

  • nieobsługiwane argumenty w JsonSerializable:
    • converters
  • nieobsługiwane argumenty w JsonKey:
    • defaultValue obsługuje tylko typy
      • null
      • bool
      • int
      • string
      • double
      • type
  • w funkcjach wszystkie argumenty muszą być named
  • jedyny typ po którym można iterować i jest obsługiwany to lista (nie obsługuje map, set itp)
  • mogą pojawić się problemy gdy nasz typ jest parametryzowany - funkcjonalność nie jest przetestowana

Zgłaszanie błędów

Paczka jest we wczesnej fazie dlatego proszę raportować wszystkie błędy i pomysły na udoskonalenia i nowe ficzerki za pomocą githuba link

Roadmap

Link do pliku roadmap link