diff options
Diffstat (limited to 'components')
-rw-r--r-- | components/adapter.rb | 40 |
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 |