summaryrefslogtreecommitdiff
path: root/components/adapter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'components/adapter.rb')
-rw-r--r--components/adapter.rb46
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