generateGetxFolderStructure function

Future<void> generateGetxFolderStructure()

Implementation

Future<void> generateGetxFolderStructure() async {
  final name = Input(
    prompt: 'Please enter the name of the class in snake_case format (eg. example_getx)',
    validator: (v) {
      final value = v.trim().toLowerCase();

      if (value.isEmpty ||
          RegExp(r'^[0-9]').hasMatch(value) ||
          value.contains(' ') ||
          !RegExp(r'^[a-z0-9_]+$').hasMatch(value)) {
        throw ValidationError('Please enter a valid name in snake_case format (eg. example_getx)');
      }

      return true;
    },
  ).interact().toLowerCase();

  final customPath = Input(
    prompt: 'Enter the full path where you want to create the getx folder:',
    defaultValue: Directory.current.path,
    validator: (v) {
      final trimmed = v.trim();

      final dir = Directory(trimmed);
      if (trimmed.isNotEmpty && !dir.existsSync()) {
        throw ValidationError('Directory does not exist. Please enter a valid path');
      }

      return true;
    },
  ).interact();

  final basePath = customPath.trim().isEmpty ? Directory.current.path : customPath.trim();

  final String folderName = name;
  final fullPath = path.join(basePath, folderName);
  final directory = Directory(fullPath);

  if (directory.existsSync()) {
    ConsoleLog.error("Folder $folderName already exists! Try some different name");
    exit(1);
  }

  directory.createSync(recursive: true);

  final bindingsDir = Directory(path.join(directory.path, "bindings"));
  bindingsDir.createSync(recursive: true);

  final controllerDir = Directory(path.join(directory.path, "controllers"));
  controllerDir.createSync(recursive: true);

  final viewDir = Directory(path.join(directory.path, "views"));
  viewDir.createSync(recursive: true);

  final String bindingsName = "${name}_bindings.dart";
  final String controllerName = "${name}_controller.dart";
  final String viewName = "${name}_screen.dart";

  final String className = ProjectUtils.toPascalCase(name);

  final bindingFile = File(path.join(bindingsDir.path, bindingsName));
  final controllerFile = File(path.join(controllerDir.path, controllerName));
  final viewFile = File(path.join(viewDir.path, viewName));

  bindingFile.writeAsStringSync(bindingTemplate(className: className, fileName: name));
  controllerFile.writeAsStringSync(controllerTemplate(className: className));
  viewFile.writeAsStringSync(viewTemplate(className: className, fileName: name));

  ConsoleLog.success("Getx structure created successfully in \"$folderName\"!");
}