view src/luan/modules/Io.luan @ 1830:d72a52232f79

mail - minor
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 24 Sep 2024 17:17:57 -0600
parents b82767112d8e
children
line wrap: on
line source

require "java"
local IoLuan = require "java:luan.modules.IoLuan"
local System = require "java:java.lang.System"
local Boot = require "luan:Boot.luan"
local LuanException = require "java:luan.LuanException"
local Luan = require "luan:Luan.luan"
local error = Luan.error
local get_local_cloned = Luan.get_local_cloned
local set_local_cloned = Luan.set_local_cloned
local raw_set = Luan.raw_set
local set_metatable = Luan.set_metatable


local Io = {}
local mt = {}
function mt.__index(tbl,key)
	if key=="stdin" or key=="stdout" or key=="stderr" then
		return get_local_cloned(tbl,key)
	else
		return nil
	end
end
function mt.__new_index(tbl,key,value)
	if key=="stdin" or key=="stdout" or key=="stderr" then
		set_local_cloned(tbl,key,value)
	else
		raw_set(tbl,key,value)
	end
end
set_metatable(Io,mt)

Io.dns_lookup = IoLuan.dns_lookup
Io.ip = IoLuan.ip
Io.my_ips = IoLuan.my_ips
Io.read_console_line = IoLuan.read_console_line
Io.schemes = Boot.schemes
Io.uri = Boot.uri
Io.stdin = Boot.new_LuanIn( IoLuan.defaultStdin )
Io.stdout = Boot.text_writer(System.out)
Io.stderr = Boot.text_writer(System.err)

-- used by http and rpc
Io.password = "password"

local to_string = Luan.to_string or error()
local type = Luan.type or error()
local ipairs = Luan.ipairs or error()
local pairs = Luan.pairs or error()
local values = Luan.values or error()
local load = Luan.load or error()
local Table = require "luan:Table.luan"
local pack = Table.pack or error()
local unpack = Table.unpack or error()
local String = require "luan:String.luan"
local encode = String.encode or error()


-- do not change
function Io.template_write(...)
	return Io.stdout.write(...)
end


function Io.print_to(out,...)
	local list = {}
	for _, v in values(...) do
		list[#list+1] = to_string(v)
		list[#list+1] = '\t'
	end
	if #list > 0 then
		list[#list] = '\n'
		out.write( unpack(list) )
	else
		out.write('\n')
	end
end

function Io.print(...)
	Io.print_to(Io.stdout,...)
end


function Io.output_to(out,fn)
	local old_out = Io.stdout
	try
		Io.stdout = out
		return fn()
	finally
		Io.stdout = old_out
	end
end

local uri = Io.uri  -- make local

function Io.output_of(fn)
	local string_uri = uri "string:"
	local out = string_uri.text_writer()
	Io.output_to(out,fn)
	out.close()
	return string_uri.read_text()
end

function Io.relative_file_uri_string(path)
	local f = LuanException.getLuanStackTrace()[2].getFileName()
	f = uri(f)
	f.parent or error "source isn't file"
	return f.parent().to_uri_string().."/"..path
end


-- debug

function Io.debug(prompt)
	prompt = prompt or "luan_debug> "
	local function console()
		return Io.read_console_line(prompt)
	end
	local env = {}
	for line in console do
		try 
			local fn
			try
				fn = load("return "..line,"stdin",env)
			catch e
				fn = load(line,"stdin",env)
			end
			local rtn = pack( fn() )
			if rtn.n > 0 then
				Io.print( unpack(rtn) )
			end
		catch e
			Io.print(e)
		end
	end
end


return Io