generateFromJsonCode static method

Future<void> generateFromJsonCode({
  1. required String rootClassName,
  2. required String jsonCode,
  3. required String outputDir,
})

Generates Dart models from a raw jsonCode string.

rootClassName: The name of the main model class (e.g., "UserProfile"). jsonCode: The raw JSON string to analyze. outputDir: The base directory where models should be generated (e.g., "lib/models").

This method is asynchronous and returns a Future that completes when all files have been written to the outputDir.

Implementation

static Future<void> generateFromJsonCode({
  required String rootClassName,
  required String jsonCode,
  required String outputDir,
}) async {
  final analyzer = TypeAnalyzer();
  final dynamic json = jsonDecode(jsonCode);
  analyzer.analyze(json, rootClassName);

  final emitter = FileEmitter();
  final folderName = ReCase(rootClassName).snakeCase;
  final targetDir = Directory(p.join(outputDir, folderName));

  if (!await targetDir.exists()) {
    await targetDir.create(recursive: true);
  }

  // Generate model files
  for (var classDef in analyzer.classes.values) {
    final fileName = "${ReCase(classDef.name).snakeCase}.dart";
    final filePath = p.join(targetDir.path, fileName);
    final content = emitter.emitClass(classDef);
    await File(filePath).writeAsString(content);
  }

  // Generate models.dart barrel file
  final barrelFile = File(p.join(targetDir.path, "models.dart"));
  final barrelContent = StringBuffer();
  for (var classDef in analyzer.classes.values) {
    barrelContent.writeln(
      "export '${ReCase(classDef.name).snakeCase}.dart';",
    );
  }
  await barrelFile.writeAsString(barrelContent.toString());

  // ignore: avoid_print
  print("✅ Generated ${analyzer.classes.length} models in ${targetDir.path}");
}