1 module dcord.util..string; 2 3 import std..string; 4 import std.array; 5 import std.ascii : isLower, isUpper; 6 7 pure string camelCaseToUnderscores(string input) { 8 auto stringBuilder = appender!string; 9 stringBuilder.reserve(input.length * 2); 10 bool previousWasLower = false; 11 12 foreach (c; input) { 13 if (previousWasLower && c.isUpper()) { 14 stringBuilder.put('_'); 15 } 16 17 if (c.isLower()) { 18 previousWasLower = true; 19 } else { 20 previousWasLower = false; 21 } 22 23 stringBuilder.put(c); 24 } 25 26 return stringBuilder.data.toLower(); 27 }