#include <bu/sio.h>
#include <bu/json.h>
#include <bu/file.h>

void printThing( Bu::Json &j, int iDepth=0 )
{
    for(int i = 0; i < iDepth; i++ )
        Bu::print("  ");

    switch( j.getType() )
    {
        case Bu::Json::Invalid:
            Bu::println("<invalid>");
            break;

        case Bu::Json::Object:
            Bu::println("<object>");
            {
                Bu::UtfStringList lKeys = j.getKeys();
                for( Bu::UtfStringList::iterator i = lKeys.begin(); i; i++ )
                {
                    for(int k = 0; k < iDepth+1; k++ )
                        Bu::print("  ");
                    Bu::println("'%1':").arg( *i );
                    printThing( j[*i], iDepth+2 );
                }
            }
            break;

        case Bu::Json::Array:
            Bu::println("<array>");
            for( int i = 0; i < j.getSize(); i++ )
            {
                printThing( j[i], iDepth+1 );
            }
            break;

        case Bu::Json::String:
            Bu::println("'%1'").arg( j.getString() );
            break;

        case Bu::Json::Number:
            Bu::println("%1").arg( j.getNumber() );
            break;

        case Bu::Json::Boolean:
            Bu::println("%1").arg( j.getBoolean() );
            break;

        case Bu::Json::Null:
            Bu::println("<null>");
            break;
    }
}

int main( int argc, char *argv[] )
{
    Bu::Json j;
    j.parse( Bu::File( argv[1], Bu::File::Read ).readAll() );

    printThing( j );

    return 0;
}

