validateAppName function

ValidationResult validateAppName(
  1. String name
)

Validate app name (snake_case, no spaces, lowercase)

Implementation

ValidationResult validateAppName(String name) {
  if (name.isEmpty) {
    return const ValidationResult.invalid('App name cannot be empty');
  }

  if (name.contains(' ')) {
    return const ValidationResult.invalid('App name cannot contain spaces');
  }

  if (name != name.toLowerCase()) {
    return const ValidationResult.invalid('App name must be lowercase');
  }

  // Check for valid snake_case pattern
  final RegExp validPattern = RegExp(r'^[a-z][a-z0-9_]*$');
  if (!validPattern.hasMatch(name)) {
    return const ValidationResult.invalid(
      'App name must start with a letter and contain only lowercase letters, numbers, and underscores',
    );
  }

  // Dart reserved words
  const List<String> reservedWords = <String>[
    'abstract',
    'as',
    'assert',
    'async',
    'await',
    'break',
    'case',
    'catch',
    'class',
    'const',
    'continue',
    'covariant',
    'default',
    'deferred',
    'do',
    'dynamic',
    'else',
    'enum',
    'export',
    'extends',
    'extension',
    'external',
    'factory',
    'false',
    'final',
    'finally',
    'for',
    'function',
    'get',
    'hide',
    'if',
    'implements',
    'import',
    'in',
    'interface',
    'is',
    'late',
    'library',
    'mixin',
    'new',
    'null',
    'on',
    'operator',
    'part',
    'required',
    'rethrow',
    'return',
    'set',
    'show',
    'static',
    'super',
    'switch',
    'sync',
    'this',
    'throw',
    'true',
    'try',
    'typedef',
    'var',
    'void',
    'while',
    'with',
    'yield',
  ];

  if (reservedWords.contains(name)) {
    return ValidationResult.invalid('"$name" is a Dart reserved word');
  }

  return const ValidationResult.valid();
}