protectName function

(String?, String?) protectName(
  1. String? name, {
  2. String? description,
  3. bool uniqueIfNull = false,
  4. List<ReplacementRule> replacementRulesForRawSchema = const [],
  5. bool isEnum = false,
  6. bool isMethod = false,
})

Protect name from incorrect symbols, keywords, etc.

Implementation

(String? newName, String? description) protectName(
  String? name, {
  String? description,
  bool uniqueIfNull = false,
  List<ReplacementRule> replacementRulesForRawSchema = const [],
  bool isEnum = false,
  bool isMethod = false,
}) {
  var replacedName = name;
  if (replacedName != null) {
    for (final rule in replacementRulesForRawSchema) {
      replacedName = rule.apply(replacedName);
    }
  }
  final (newName, error) = switch (replacedName) {
    null || '' => uniqueIfNull
        ? (
            uniqueName(isEnum: isEnum),
            'Name not received and was auto-generated.',
          )
        : (null, null),
    // https://github.com/Carapacik/swagger_parser/issues/262
    _
        when replacedName.startsWith(r'$') &&
            replacedName
                    .split('')
                    .where(
                      (e) => e == r'$',
                    )
                    .length ==
                1 =>
      (
        replacedName.substring(1),
        'Incorrect name has been replaced. Original name: `$name`.',
      ),
    _ when !_nameRegExp.hasMatch(replacedName) => (
        uniqueName(isEnum: isEnum),
        'Incorrect name has been replaced. Original name: `$name`.',
      ),
    _ when dartKeywords.contains(replacedName.toCamel) => (
        '$replacedName ${isEnum ? _enumConst : _valueConst}',
        'The name has been replaced because it contains a keyword. Original name: `$name`.',
      ),
    _ => (replacedName, null),
  };

  return (
    newName,
    switch ((description, error)) {
      (null, null) => null,
      (null, _) => error,
      (_, null) => description,
      (_, _) => '$description\n$error',
    },
  );
}