summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/adapter.rb40
1 files changed, 40 insertions, 0 deletions
diff --git a/components/adapter.rb b/components/adapter.rb
new file mode 100644
index 0000000..b906a27
--- /dev/null
+++ b/components/adapter.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'sweet-moon'
+
+module NanoBot
+ module Components
+ class Adapter
+ def self.apply(_direction, params)
+ content = params[:content]
+
+ if params[:fennel] && params[:lua]
+ raise StandardError, 'Adapter conflict: You can only use either Lua or Fennel, not both.'
+ end
+
+ if params[:fennel]
+ content = fennel(content, params[:fennel])
+ elsif params[:lua]
+ content = lua(content, params[:lua])
+ end
+
+ "#{params[:prefix]}#{content}#{params[:suffix]}"
+ end
+
+ def self.fennel(content, expression)
+ path = "#{File.expand_path('../static/fennel', __dir__)}/?.lua"
+ state = SweetMoon::State.new(package_path: path).fennel
+ state.fennel.eval("(set _G.adapter (fn [content] #{expression}))")
+ adapter = state.get(:adapter)
+ adapter.call([content])
+ end
+
+ def self.lua(content, expression)
+ state = SweetMoon::State.new
+ state.eval("adapter = function(content) return #{expression}; end")
+ adapter = state.get(:adapter)
+ adapter.call([content])
+ end
+ end
+ end
+end