00001 #include "luapp_state.hpp" 00002 #include "luapp_function.hpp" 00003 #include <utils_string.hpp> 00004 00005 namespace lua 00006 { 00007 argument::argument(const std::string& sName, type mLuaType, function* pParent) : 00008 bSet_(false), pParent_(pParent), pLua_(pParent_->get_state()) 00009 { 00010 lData_.push_back(data(sName, mLuaType, this)); 00011 pData_ = &lData_[0]; 00012 } 00013 00014 void argument::add(const std::string& sName, type mLuaType) 00015 { 00016 lData_.push_back(data(sName, mLuaType, this)); 00017 if (lData_.size() == 1) 00018 pData_ = &lData_[0]; 00019 } 00020 00021 float argument::get_number() const 00022 { 00023 return pData_->get_value().get<double>(); 00024 } 00025 00026 bool argument::get_bool() const 00027 { 00028 return pData_->get_value().get<bool>(); 00029 } 00030 00031 std::string argument::get_string() const 00032 { 00033 return pData_->get_value().get<std::string>(); 00034 } 00035 00036 int argument::get_index() const 00037 { 00038 return pData_->get_value().get<int>(); 00039 } 00040 00041 type argument::get_type() const 00042 { 00043 return pData_->get_type(); 00044 } 00045 00046 bool argument::is_provided() const 00047 { 00048 return bSet_; 00049 } 00050 00051 bool argument::test(state* pLua, int iIndex, bool bPrintError) 00052 { 00053 bool bSeveralChoices = (lData_.size() > 1); 00054 00055 type mType = pLua->get_type(iIndex); 00056 std::vector<data>::iterator iterdata; 00057 foreach (iterdata, lData_) 00058 { 00059 if (mType != iterdata->get_type()) 00060 { 00061 if (bPrintError && !bSeveralChoices) 00062 { 00063 pLua->print_error( 00064 "argument "+utils::to_string(iIndex)+" of \""+pParent_->get_name()+"\" " 00065 "must be a "+pLua->get_type_name(iterdata->get_type())+" " 00066 "("+iterdata->get_name()+") (got a "+pLua->get_type_name(mType)+")." 00067 ); 00068 } 00069 } 00070 else 00071 { 00072 iterdata->set(pLua, iIndex); 00073 break; 00074 } 00075 } 00076 00077 if (!bSet_) 00078 { 00079 if (bPrintError && bSeveralChoices) 00080 { 00081 std::string sEnum = ""; 00082 uint i = 0; 00083 foreach (iterdata, lData_) 00084 { 00085 if (i == 0) 00086 sEnum += "a "; 00087 else 00088 { 00089 if (i == lData_.size()-1) 00090 sEnum += ", or a "; 00091 else 00092 sEnum += ", a "; 00093 } 00094 00095 sEnum += pLua->get_type_name(iterdata->get_type())+" ("+iterdata->get_name()+")"; 00096 ++i; 00097 } 00098 pLua->print_error( 00099 "argument "+utils::to_string(iIndex)+" of \""+pParent_->get_name()+"\" " 00100 "must be "+sEnum+" (got a "+pLua->get_type_name(mType)+")." 00101 ); 00102 } 00103 } 00104 00105 return bSet_; 00106 } 00107 00108 void argument::set_data(data* pData) 00109 { 00110 bSet_ = true; 00111 pData_ = pData; 00112 } 00113 00114 data* argument::get_data() const 00115 { 00116 return pData_; 00117 } 00118 }