summaryrefslogtreecommitdiff
path: root/src/function_registry.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/function_registry.hh')
-rw-r--r--src/function_registry.hh46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/function_registry.hh b/src/function_registry.hh
new file mode 100644
index 00000000..058c4aa3
--- /dev/null
+++ b/src/function_registry.hh
@@ -0,0 +1,46 @@
+#ifndef function_registry_h_INCLUDED
+#define function_registry_h_INCLUDED
+
+#include "string.hh"
+#include "completion.hh"
+#include "idvaluemap.hh"
+
+namespace Kakoune
+{
+
+struct function_not_found : runtime_error
+{
+ function_not_found(const String& name)
+ : runtime_error("'" + name + "' not found") {}
+};
+
+template<typename FunctionType>
+class FunctionRegistry
+{
+public:
+ void register_func(const String& name, const FunctionType& function)
+ {
+ assert(not m_functions.contains(name));
+ m_functions.append(std::make_pair(name, function));
+ }
+
+ const FunctionType& operator[](const String& name) const
+ {
+ auto it = m_functions.find(name);
+ if (it == m_functions.end())
+ throw function_not_found(name);
+ return it->second;
+ }
+
+ CandidateList complete_name(const String& prefix, ByteCount cursor_pos)
+ {
+ return m_functions.complete_id(prefix, cursor_pos);
+ }
+
+private:
+ idvaluemap<String, FunctionType> m_functions;
+};
+
+}
+
+#endif // function_registry_h_INCLUDED