]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/loader.cpp
More flexible framework for loading substatements with custom loaders
[libs/datafile.git] / source / loader.cpp
index cf1a5acae89dc0e4abe7583358e3926ab629277c..e4993868ab3adfac95c385ef7c5d9e6a3c638a1c 100644 (file)
@@ -16,6 +16,7 @@ void Loader::load(const Statement &st)
 {
        for(list<Statement>::const_iterator i=st.sub.begin(); i!=st.sub.end(); ++i)
                load_statement(*i);
+       finish();
 }
 
 void Loader::load(Parser &p)
@@ -26,6 +27,7 @@ void Loader::load(Parser &p)
                if(st.valid)
                        load_statement(st);
        }
+       finish();
 }
 
 Loader::~Loader()
@@ -34,12 +36,32 @@ Loader::~Loader()
                delete i->second;
 }
 
+void Loader::load_sub_with(Loader &ldr)
+{
+       if(!cur_st)
+               throw InvalidState("load_sub called without current statement");
+
+       ldr.load(*cur_st);
+}
+
+void Loader::add(const string &k, LoaderAction *a)
+{
+       ActionMap::iterator i=actions.find(k);
+       if(i!=actions.end())
+       {
+               delete i->second;
+               i->second=a;
+       }
+       else
+               actions[k]=a;
+}
+
 void Loader::load_statement(const Statement &st)
 {
        cur_st=&st;
        ActionMap::iterator j=actions.find(st.keyword);
        if(j==actions.end())
-               throw KeyError(st.get_location()+": Unknown keyword '"+st.keyword+"'");
+               throw KeyError(st.get_location()+": Unknown keyword", st.keyword);
        if(j->second)
                j->second->execute(*this, st);
        cur_st=0;