generate method

String generate({
  1. required String featureName,
  2. required String usecaseName,
  3. required String methodName,
  4. required List<ProviderParam> params,
  5. required String returnType,
})

Implementation

String generate({
  required String featureName,
  required String usecaseName,
  required String methodName,
  required List<ProviderParam> params,
  required String returnType,
}) {
  final providerName = '${usecaseName}Provider';
  final useCaseVar = '${usecaseName.camelCase}UseCase';

  final constructorParams = params
      .map((e) => '${e.type} ${e.name}')
      .join(', ');
  final executeParams = params.map((e) => e.name).join(', ');

  final hasData = _hasData(returnType);
  final needsFile = _needsFileImport(params);

  final entityName = _extractEntity(returnType);
  final entityImport =
      entityName == null
          ? ''
          : "import 'package:$projectName/features/$featureName/domain/entities/${entityName.snakeCase}.dart';";

  final dataField =
      hasData
          ? '''

$returnType? _data;
$returnType? get data => _data;
'''
          : '';

  final onSuccess =
      hasData
          ? '''
    (data) {
      _state = RequestState.Loaded;
      _data = data;
    },
'''
          : '''
    (_) {
      _state = RequestState.Loaded;
    },
''';

  return '''
import 'package:flutter/material.dart';
${needsFile ? "import 'dart:io';" : ''}
import 'package:$projectName/core/state/request_state.dart';
import 'package:$projectName/features/$featureName/domain/usecases/${usecaseName.snakeCase}.dart';
$entityImport

class $providerName extends ChangeNotifier {
final $usecaseName $useCaseVar;

$providerName({required this.$useCaseVar});

RequestState _state = RequestState.Empty;
RequestState get state => _state;

String? _message;
String? get message => _message;
$dataField
Future<void> $methodName($constructorParams) async {
  _state = RequestState.Loading;
  _message = null;
  notifyListeners();

  final result = await $useCaseVar.execute($executeParams);

  result.fold(
    (failure) {
      _state = RequestState.Error;
      _message = failure.message;
    },
$onSuccess
  );

  notifyListeners();
}
}
''';
}