diff options
author | icebaker <113217272+icebaker@users.noreply.github.com> | 2023-05-13 11:30:12 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-13 11:30:12 -0300 |
commit | f52b8f3c73d53d4fe6faa1d4670194d3c6c6d992 (patch) | |
tree | 02aac93f5d618c2965973b2390de3adabf21be25 /controllers/instance.rb | |
parent | 805e5073117bc717f46da0fa7f8ab628b4fa2a7d (diff) | |
parent | 680d55dbea3c8aec5049bd387aadaf31a443c8fd (diff) |
Merge pull request #1 from icebaker/ib-streams
Improving Streams
Diffstat (limited to 'controllers/instance.rb')
-rw-r--r-- | controllers/instance.rb | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/controllers/instance.rb b/controllers/instance.rb index f3cbd74..b22a785 100644 --- a/controllers/instance.rb +++ b/controllers/instance.rb @@ -12,35 +12,64 @@ require_relative './session' module NanoBot module Controllers class Instance - def initialize(cartridge_path:, state: nil) + def initialize(cartridge_path:, stream:, state: nil) + @stream = stream + load_cartridge!(cartridge_path) provider = Components::Provider.new(@cartridge[:provider]) - @session = Session.new(provider:, cartridge: @cartridge, state:) + @session = Session.new(provider:, cartridge: @cartridge, state:, stream: @stream) + end + + def cartridge + puts YAML.dump(@safe_cartridge) end - def debug - @session.debug + def state + @session.state end def eval(input) Interfaces::Eval.evaluate(input, @cartridge, @session) + + return unless @stream.is_a?(StringIO) + + @stream.flush + result = @stream.string.clone + @stream.truncate(0) + @stream.rewind + result end def repl + if @stream.is_a?(StringIO) + @stream.flush + @stream = $stdout + @session.stream = @stream + end Interfaces::REPL.start(@cartridge, @session) end private def load_cartridge!(path) - @cartridge = Logic::Helpers::Hash.symbolize_keys( - YAML.safe_load( - File.read(Components::Storage.cartridge_path(path)), - permitted_classes: [Symbol] - ) - ) + elected_path = if path.strip == '-' + File.expand_path('../static/cartridges/default.yml', __dir__) + else + Components::Storage.cartridge_path(path) + end + + if elected_path.nil? + @stream.write("Cartridge file not found: \"#{path}\"\n") + raise StandardError, "Cartridge file not found: \"#{path}\"" + end + + @cartridge = YAML.safe_load(File.read(elected_path), permitted_classes: [Symbol]) + + @safe_cartridge = Marshal.load(Marshal.dump(@cartridge)) + + @cartridge = Logic::Helpers::Hash.symbolize_keys(@cartridge) inject_environment_variables!(@cartridge) end |