]> git.sesse.net Git - casparcg/blob - common/param.h
78d23c2071ed13b5423720dccdbd8523bccbe0eb
[casparcg] / common / param.h
1 #pragma once
2
3 #include "except.h"
4
5 #include <boost/lexical_cast.hpp>
6 #include <boost/algorithm/string.hpp>
7
8 #include <type_traits>
9 #include <string>
10
11 namespace caspar {
12
13 class param_comparer
14 {
15         const std::wstring& lhs;
16 public:
17         explicit param_comparer(const std::wstring& p) : lhs(p) {}
18         bool operator()(const std::wstring& rhs) { return boost::iequals(lhs, rhs); }
19 };
20
21 template<typename C>
22 bool contains_param(const std::wstring& name, C&& params)
23 {
24         return std::find_if(params.begin(), params.end(), param_comparer(name)) != params.end();
25 }
26
27 template<typename C>
28 void replace_placeholders(const std::wstring& placeholder, const std::wstring& replacement, C&& params)
29 {
30         for (auto& param : params)
31                 boost::ireplace_all(param, placeholder, replacement);
32 }
33
34 template<typename T, typename C>
35 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())
36 {       
37         auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
38         if(it == params.end())  
39                 return fail_value;
40         
41         try
42         {
43                 if(++it == params.end())
44                         throw std::out_of_range("");
45
46                 return boost::lexical_cast<typename std::decay<T>::type>(*it);
47         }
48         catch(...)
49         {               
50                 CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
51         }
52 }
53
54 template<typename C>
55 std::wstring get_param(const std::wstring& name, C&& params, const std::wstring& fail_value = L"")
56 {       
57         auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
58         if(it == params.end())  
59                 return fail_value;
60         
61         try
62         {
63                 if(++it == params.end())
64                         throw std::out_of_range("");
65
66                 return *it;     
67         }
68         catch(...)
69         {               
70                 CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
71         }
72 }
73
74 }