]> git.sesse.net Git - casparcg/blob - common/param.h
2a0f63224b81277d30f8ad909c8744fd76e42265
[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 static std::vector<std::wstring> protocol_split(const std::wstring& s)
35 {
36         std::vector<std::wstring> result;
37         size_t pos;
38
39         if ((pos = s.find(L"://")) != std::wstring::npos)
40         {
41                 result.push_back(s.substr(0, pos));
42                 result.push_back(s.substr(pos + 3));
43         }
44         else
45         {
46                 result.push_back(L"");
47                 result.push_back(s);
48         }
49
50         return result;
51 }
52
53 template<typename T, typename C>
54 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())
55 {       
56         auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
57         if(it == params.end())  
58                 return fail_value;
59         
60         try
61         {
62                 if(++it == params.end())
63                         throw std::out_of_range("");
64
65                 return boost::lexical_cast<typename std::decay<T>::type>(*it);
66         }
67         catch(...)
68         {               
69                 CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
70         }
71 }
72
73 template<typename C>
74 std::wstring get_param(const std::wstring& name, C&& params, const std::wstring& fail_value = L"")
75 {       
76         auto it = std::find_if(std::begin(params), std::end(params), param_comparer(name));
77         if(it == params.end())  
78                 return fail_value;
79         
80         try
81         {
82                 if(++it == params.end())
83                         throw std::out_of_range("");
84
85                 return *it;     
86         }
87         catch(...)
88         {               
89                 CASPAR_THROW_EXCEPTION(user_error() << msg_info(L"Failed to parse param " + name) << nested_exception(std::current_exception()));
90         }
91 }
92
93 }