diff options
Diffstat (limited to 'components/adapter.rb')
-rw-r--r-- | components/adapter.rb | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/components/adapter.rb b/components/adapter.rb index a361437..32aa169 100644 --- a/components/adapter.rb +++ b/components/adapter.rb @@ -1,48 +1,34 @@ # frozen_string_literal: true -require 'sweet-moon' +require_relative 'embedding' +require_relative '../logic/cartridge/safety' module NanoBot module Components class Adapter - def self.apply(_direction, params) + def self.apply(params, cartridge) content = params[:content] - if params[:fennel] && params[:lua] - raise StandardError, 'Adapter conflict: You can only use either Lua or Fennel, not both.' - end + raise StandardError, 'conflicting adapters' if %i[fennel lua clojure].count { |key| !params[key].nil? } > 1 + + call = { + parameters: %w[content], values: [content], + safety: { sandboxed: Logic::Cartridge::Safety.sandboxed?(cartridge) } + } if params[:fennel] - content = fennel(content, params[:fennel]) + call[:source] = params[:fennel] + content = Components::Embedding.fennel(**call) + elsif params[:clojure] + call[:source] = params[:clojure] + content = Components::Embedding.clojure(**call) elsif params[:lua] - content = lua(content, params[:lua]) + call[:source] = params[:lua] + content = Components::Embedding.lua(**call) 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 - # TODO: global is deprecated... - state.fennel.eval( - "(global adapter (fn [content] #{expression}))", 1, - { allowedGlobals: %w[math string table] } - ) - adapter = state.get(:adapter) - adapter.call([content]) - end - - def self.lua(content, expression) - state = SweetMoon::State.new - code = "_, adapter = pcall(load('return function(content) return #{ - expression.gsub("'", "\\\\'") - }; end', nil, 't', {math=math,string=string,table=table}))" - - state.eval(code) - adapter = state.get(:adapter) - adapter.call([content]) - end end end end |