generateClient function

Future<void> generateClient({
  1. required String structure,
  2. required String path,
  3. required String projectName,
})

Generates a Dart client for the current Gazelle project.

Implementation

Future<void> generateClient({
  required String structure,
  required String path,
  required String projectName,
}) async {
  final routeStructure = jsonDecode(structure);
  final code = StringBuffer();

  code.writeln("import 'package:models/models.dart';");
  code.writeln("import 'package:gazelle_client/gazelle_client.dart';");
  code.writeln("export 'package:models/models.dart';");
  code.writeln(
      "export 'package:gazelle_client/gazelle_client.dart' hide GazelleRouteClient, GazelleApiClient;");
  code.writeln();

  code.writeln("extension GazelleApiClientExtension on GazelleApiClient {");
  _generateRouteProperties(routeStructure, code, extension: true);
  code.writeln("}");
  code.writeln();

  _generateRouteClasses(routeStructure, code);
  code.writeln();

  code.writeln("class Gazelle {");
  code.writeln("static GazelleClient? _client;");
  code.writeln("""void init({String? baseUrl}) => _client = GazelleClient.init(
        baseUrl: baseUrl ?? "http://localhost:3000",
        modelProvider: ${_snakeToPascalCase(projectName)}ModelProvider(),
      );""");
  code.writeln("""GazelleClient get client =>
      _client == null ? throw "Gazelle not configured!" : _client!;""");
  code.writeln("}");
  code.writeln();

  code.writeln("final gazelle = Gazelle();");

  final clientExtensions = DartFormatter().format(code.toString());
  await _createClientPackage(path: path, clientExtensions: clientExtensions);
}