module painlessjson..string;

import std..string;
import std.conv;
import std.array;
import std.ascii : isLower, isUpper;

version (unittest)
{
    import dunit.toolkit;

}

unittest {
    enum hello_world = camelCaseToUnderscore("helloWorld");
    assertEqual(hello_world,"hello_world");
    enum my_json = camelCaseToUnderscore("myJSON");
    assertEqual(my_json,"my_json");
}

string camelCaseToUnderscore(string input){
    auto stringBuilder = appender!string;
    stringBuilder.reserve(input.length*2);
    bool previousWasLower = false;
    foreach(c;input){
        if(previousWasLower && c.isUpper())
        {
            stringBuilder.put('_');
        }

        if(c.isLower())
        {
            previousWasLower = true;
        } else{
            previousWasLower = false;
        }
        stringBuilder.put(c);
    }
    return stringBuilder.data.toLower();
}