local serial = require "serialization"
local shell = {}
shell.include = {"shutil"}
local function shindex(self,k)
 if rawget(self,k) then return rawget(self,k) end
 for _,v in pairs(os.getenv("INCLUDE") or shell.include) do
  if require(v)[k] then return require(v)[k] end
 end
 if package.loaded[k] then return package.loaded[k] end
 return _G[k]
end

local function formatValue(v)
 if type(v) == "table" then
  local w, rs = pcall(serial.serialize,v,true)
  if w then return rs end
 end
 return tostring(v)
end

function shell.interactive()
 local shenv = setmetatable({}, {__index=shindex})
 local run = true
 function shenv.quit()
  run = false
 end
 while run do
  io.write(string.format("\27[32m%s:%s>\27[0m ",os.getenv("HOSTNAME") or "localhost",(os.getenv("PWD") or _VERSION)))
  local input = io.read()
  if input:sub(1,1) == "=" then
   input = "return "..input:sub(2)
  end
  local f, r = load(input, "shell", "t", shenv)
  if not f then
   print("\27[31m"..r)
  else
   local rt = {pcall(f)}
   local rs = table.remove(rt,1)
   if not rs then io.write("\27[31m") end
   for k,v in pairs(rt) do
    print(formatValue(v))
   end
  end
 end
end

return shell