generateBlocStateTemplate method

String generateBlocStateTemplate(
  1. ApiGenerationConfig config
)

Generates BLoC state template.

Creates state classes for different API call states with proper stream/future handling based on method type.

Parameters:

  • config: API generation configuration

Implementation

String generateBlocStateTemplate(ApiGenerationConfig config) {
  final bodyClass =
      typeResolver.resolveBodyClass(config.apiClassName, config.bodyList);
  final entityClass = typeResolver.resolveEntityClass(config);

  return '''part of '${config.apiName}_bloc.dart';

@immutable
abstract class ${config.apiClassName}State extends Equatable {
bool get isInitial => this is ${config.apiClassName}Initial;
bool get isLoading => this is ${config.apiClassName}Loading;
bool get isFailed => this is ${config.apiClassName}Failed;
bool get isSuccess => this is ${config.apiClassName}Success;
bool get isCanceled => this is ${config.apiClassName}Canceled;
${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''bool get isStream => this is ${config.apiClassName}Stream;
bool get isPaused => this is ${config.apiClassName}Paused;
bool get isResumed => this is ${config.apiClassName}Resumed;''';
    },
    onFuture: () => '',
  )}

bool get isNotInitial => this is! ${config.apiClassName}Initial;
bool get isNotLoading => this is! ${config.apiClassName}Loading;
bool get isNotFailed => this is! ${config.apiClassName}Failed;
bool get isNotSuccess => this is! ${config.apiClassName}Success;
bool get isNotCanceled => this is! ${config.apiClassName}Canceled;
${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''bool get isNotStream => this is! ${config.apiClassName}Stream;
bool get isNotPaused => this is! ${config.apiClassName}Paused;
bool get isNotResumed => this is! ${config.apiClassName}Resumed;''';
    },
    onFuture: () => '',
  )}

void when({
  void Function(${config.apiClassName}Initial state)? onInitial,
  void Function(${config.apiClassName}Loading state)? onLoading,
  void Function(${config.apiClassName}Failed state)? onFailed,
  void Function(${config.apiClassName}Success state)? onSuccess,
  void Function(${config.apiClassName}Canceled state)? onCanceled,
  ${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''void Function(${config.apiClassName}Stream state)? onStream,
void Function(${config.apiClassName}Paused state)? onPaused,
void Function(${config.apiClassName}Resumed state)? onResumed,''';
    },
    onFuture: () => '',
  )}
}) {
  final state = this;
  if (state is ${config.apiClassName}Initial) {
    onInitial?.call(state);
  } else if (state is ${config.apiClassName}Loading) {
    onLoading?.call(state);
  } else if (state is ${config.apiClassName}Failed) {
    onFailed?.call(state);
  } else if (state is ${config.apiClassName}Success) {
    onSuccess?.call(state);
  } else if (state is ${config.apiClassName}Canceled) {
    onCanceled?.call(state);
  } ${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''else if (state is ${config.apiClassName}Stream) {
    onStream?.call(state);
  } else if (state is ${config.apiClassName}Paused) {
    onPaused?.call(state);
  } else if (state is ${config.apiClassName}Resumed) {
    onResumed?.call(state);
  }''';
    },
    onFuture: () => '',
  )}
}

Widget builder({
  Widget Function(${config.apiClassName}Initial state)? onInitial,
  Widget Function(${config.apiClassName}Loading state)? onLoading,
  Widget Function(${config.apiClassName}Failed state)? onFailed,
  Widget Function(${config.apiClassName}Success state)? onSuccess,
  Widget Function(${config.apiClassName}Canceled state)? onCanceled,
  ${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''Widget Function(${config.apiClassName}Stream state)? onStream,
 Widget Function(${config.apiClassName}Paused state)? onPaused,
 Widget Function(${config.apiClassName}Resumed state)? onResumed,''';
    },
    onFuture: () => '',
  )}
  Widget Function(${config.apiClassName}State state)? onStateBuilder,
}) {
  final state = this;
  final defaultWidget = onStateBuilder?.call(this) ?? const SizedBox.shrink();

  if (state is ${config.apiClassName}Initial) {
    return onInitial?.call(state) ?? defaultWidget;
  } else if (state is ${config.apiClassName}Loading) {
    return onLoading?.call(state) ?? defaultWidget;
  } else if (state is ${config.apiClassName}Failed) {
    return onFailed?.call(state) ?? defaultWidget;
  } else if (state is ${config.apiClassName}Success) {
    return onSuccess?.call(state) ?? defaultWidget;
  } else if (state is ${config.apiClassName}Canceled) {
    return onCanceled?.call(state) ?? defaultWidget;
  } ${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''else if (state is ${config.apiClassName}Stream) {
    return onStream?.call(state) ?? defaultWidget;
  } else if (state is ${config.apiClassName}Paused) {
    return onPaused?.call(state) ?? defaultWidget;
  } else if (state is ${config.apiClassName}Resumed) {
    return onResumed?.call(state) ?? defaultWidget;
  }''';
    },
    onFuture: () => '',
  )}
  else {
    return defaultWidget;
  }
}
}

class ${config.apiClassName}Initial extends ${config.apiClassName}State {
@override
List<Object?> get props => [];
}

class ${config.apiClassName}Loading extends ${config.apiClassName}State {
 ${config.apiClassName}Loading(this.body, this.headers, this.extra,);

final $bodyClass body;
final Map<String, String>? headers;
final dynamic extra;

@override
List<Object?> get props => [body, headers, extra,];
}

class ${config.apiClassName}Failed extends ${config.apiClassName}State {
${config.apiClassName}Failed(this.body, this.headers, this.failure, this.extra,);

final $bodyClass body;
final Map<String, String>? headers;
final MorphemeFailure failure;
final dynamic extra;

@override
List<Object?> get props => [body, headers, failure, extra,];
}

class ${config.apiClassName}Canceled extends ${config.apiClassName}State {
${config.apiClassName}Canceled(this.extra);

final dynamic extra;

@override
List<Object?> get props => [extra];
}

${typeResolver.whenMethod(
    config.method,
    onStream: () {
      return '''class ${config.apiClassName}Stream extends ${config.apiClassName}State {
${config.apiClassName}Stream(this.body, this.headers, this.data, this.extra,);

final $bodyClass body;
final Map<String, String>? headers;
final $entityClass data;
final dynamic extra;

@override
List<Object?> get props => [body, headers, data, extra,];
}

class ${config.apiClassName}Paused extends ${config.apiClassName}State {
${config.apiClassName}Paused(this.extra);

final dynamic extra;

@override
List<Object?> get props => [extra];
}

class ${config.apiClassName}Resumed extends ${config.apiClassName}State {
${config.apiClassName}Resumed(this.extra);

final dynamic extra;

@override
List<Object?> get props => [extra];
}

class ${config.apiClassName}Success extends ${config.apiClassName}State {
${config.apiClassName}Success(this.body, this.headers, this.data, this.extra,);

final $bodyClass body;
final Map<String, String>? headers;
final List<$entityClass> data;
final dynamic extra;

@override
List<Object?> get props => [body, headers, data, extra,];
}''';
    },
    onFuture: () =>
        '''class ${config.apiClassName}Success extends ${config.apiClassName}State {
${config.apiClassName}Success(this.body, this.headers, this.data, this.extra,);

final $bodyClass body;
final Map<String, String>? headers;
final $entityClass data;
final dynamic extra;

@override
List<Object?> get props => [body, headers, data, extra,];
}''',
  )}
''';
}