validateAppName function
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();
}