]> git.sesse.net Git - casparcg/blobdiff - common/param.h
#433 Removed late-frame tag from html_producer since it is not possible to know wheth...
[casparcg] / common / param.h
index 9429536cf1bf06375d38d4b01f210c775928f40d..78d23c2071ed13b5423720dccdbd8523bccbe0eb 100644 (file)
@@ -3,16 +3,38 @@
 #include "except.h"
 
 #include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string.hpp>
 
 #include <type_traits>
 #include <string>
 
 namespace caspar {
-               
+
+class param_comparer
+{
+       const std::wstring& lhs;
+public:
+       explicit param_comparer(const std::wstring& p) : lhs(p) {}
+       bool operator()(const std::wstring& rhs) { return boost::iequals(lhs, rhs); }
+};
+
+template<typename C>
+bool contains_param(const std::wstring& name, C&& params)
+{
+       return std::find_if(params.begin(), params.end(), param_comparer(name)) != params.end();
+}
+
+template<typename C>
+void replace_placeholders(const std::wstring& placeholder, const std::wstring& replacement, C&& params)
+{
+       for (auto& param : params)
+               boost::ireplace_all(param, placeholder, replacement);
+}
+
 template<typename T, typename C>
 typename std::enable_if<!std::is_convertible<T, std::wstring>::value, typename std::decay<T>::type>::type get_param(const std::wstring& name, C&& params, T fail_value = T())
 {      
-       auto it = std::find(std::begin(params), std::end(params), name);
+       auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
        if(it == params.end())  
                return fail_value;
        
@@ -21,18 +43,18 @@ typename std::enable_if<!std::is_convertible<T, std::wstring>::value, typename s
                if(++it == params.end())
                        throw std::out_of_range("");
 
-               return boost::lexical_cast<std::decay<T>::type>(*it);
+               return boost::lexical_cast<typename std::decay<T>::type>(*it);
        }
        catch(...)
        {               
-               CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("Failed to parse param.") << arg_name_info(name) << nested_exception(std::current_exception()));
+               CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
        }
 }
 
 template<typename C>
 std::wstring get_param(const std::wstring& name, C&& params, const std::wstring& fail_value = L"")
 {      
-       auto it = std::find(std::begin(params), std::end(params), name);
+       auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
        if(it == params.end())  
                return fail_value;
        
@@ -45,8 +67,8 @@ std::wstring get_param(const std::wstring& name, C&& params, const std::wstring&
        }
        catch(...)
        {               
-               CASPAR_THROW_EXCEPTION(invalid_argument() << msg_info("Failed to parse param.") << arg_name_info(name) << nested_exception(std::current_exception()));
+               CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
        }
 }
 
-}
\ No newline at end of file
+}