snakeCapitalCaseConversion function

String snakeCapitalCaseConversion(
  1. String name, [
  2. bool toSQL = true
])

default naming conversion function

This default function use snake lower case for SQL naming while follow Dart capital case.

Implementation

String snakeCapitalCaseConversion(String name, [bool toSQL = true]) {
  if (toSQL) {
    final buffer = StringBuffer();
    final ucodes = name.codeUnits;
    for (var i = 0; i < ucodes.length; i++) {
      if (ucodes[i] == 95) {
        // underscore _, first one is ignored
        if (i == 0) continue;
        buffer.writeCharCode(ucodes[i]);
      } else if ((96 < ucodes[i] && ucodes[i] < 123) ||
          (47 < ucodes[i] && ucodes[i] < 58)) {
        // a-z 0-9
        buffer.writeCharCode(ucodes[i]);
      } else if (64 < ucodes[i] && ucodes[i] < 91) {
        // underscore _
        if (i > 0) buffer.writeCharCode(95);
        // A-Z -> a-z
        buffer.writeCharCode(ucodes[i] + 32);
      } else {
        throw Exception('Invalid dart identifier $name.');
      }
    }
    return buffer.toString();
  } else if (name.contains('_')) {
    final buffer = StringBuffer();
    var index = 0, start = 0;
    while ((index = name.indexOf('_', start)) != -1) {
      if (buffer.isEmpty) {
        buffer.write(name.substring(start, index));
      } else {
        buffer.write(name[start].toUpperCase());
        buffer.write(name.substring(++start, index));
      }
      start = index + 1;
    }
    if (start < name.length) {
      buffer.write(name[start].toUpperCase());
      buffer.write(name.substring(++start));
    }
    return buffer.toString();
  } else {
    return name;
  }
}