annotate src/luan/modules/Io.luan @ 1802:ca98dee04e08 default tip

add Parsers.json_null
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 21 Apr 2024 21:25:15 -0600
parents b82767112d8e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1353
8d95711f6615 replace java() with require "java"
Franklin Schmidt <fschmidt@gmail.com>
parents: 1330
diff changeset
1 require "java"
321
7f7708e8fdd4 remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 320
diff changeset
2 local IoLuan = require "java:luan.modules.IoLuan"
7f7708e8fdd4 remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 320
diff changeset
3 local System = require "java:java.lang.System"
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1277
diff changeset
4 local Boot = require "luan:Boot.luan"
1570
81288d8b20a2 add Io.relative_file_name
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
5 local LuanException = require "java:luan.LuanException"
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
6 local Luan = require "luan:Luan.luan"
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
7 local error = Luan.error
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
8 local get_local_cloned = Luan.get_local_cloned
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
9 local set_local_cloned = Luan.set_local_cloned
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
10 local raw_set = Luan.raw_set
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
11 local set_metatable = Luan.set_metatable
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1277
diff changeset
12
297
899253043270 remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff changeset
13
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
14 local Io = {}
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
15 local mt = {}
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
16 function mt.__index(tbl,key)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
17 if key=="stdin" or key=="stdout" or key=="stderr" then
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
18 return get_local_cloned(tbl,key)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
19 else
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
20 return nil
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
21 end
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
22 end
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
23 function mt.__new_index(tbl,key,value)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
24 if key=="stdin" or key=="stdout" or key=="stderr" then
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
25 set_local_cloned(tbl,key,value)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
26 else
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
27 raw_set(tbl,key,value)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
28 end
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
29 end
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1571
diff changeset
30 set_metatable(Io,mt)
503
92c3d22745b8 make _ENV optional
Franklin Schmidt <fschmidt@gmail.com>
parents: 435
diff changeset
31
1444
b765f146f4dc add dns_lookup
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
32 Io.dns_lookup = IoLuan.dns_lookup
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
33 Io.ip = IoLuan.ip
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
34 Io.my_ips = IoLuan.my_ips
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
35 Io.read_console_line = IoLuan.read_console_line
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1277
diff changeset
36 Io.schemes = Boot.schemes
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1277
diff changeset
37 Io.uri = Boot.uri
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1277
diff changeset
38 Io.stdin = Boot.new_LuanIn( IoLuan.defaultStdin )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1277
diff changeset
39 Io.stdout = Boot.text_writer(System.out)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1277
diff changeset
40 Io.stderr = Boot.text_writer(System.err)
298
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
41
753
5e3970ccd86a improve password handling
Franklin Schmidt <fschmidt@gmail.com>
parents: 746
diff changeset
42 -- used by http and rpc
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
43 Io.password = "password"
298
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
44
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
45 local to_string = Luan.to_string or error()
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
46 local type = Luan.type or error()
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
47 local ipairs = Luan.ipairs or error()
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
48 local pairs = Luan.pairs or error()
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
49 local values = Luan.values or error()
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
50 local load = Luan.load or error()
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 680
diff changeset
51 local Table = require "luan:Table.luan"
1277
5ba660381bd5 fix Io.print()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1276
diff changeset
52 local pack = Table.pack or error()
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
53 local unpack = Table.unpack or error()
693
ca169567ce07 module URIs must now include ".luan"
Franklin Schmidt <fschmidt@gmail.com>
parents: 680
diff changeset
54 local String = require "luan:String.luan"
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
55 local encode = String.encode or error()
539
473e456444ff Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents: 503
diff changeset
56
320
fed1893821bf remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 319
diff changeset
57
680
ecd436959855 improve template statements
Franklin Schmidt <fschmidt@gmail.com>
parents: 629
diff changeset
58 -- do not change
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
59 function Io.template_write(...)
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
60 return Io.stdout.write(...)
680
ecd436959855 improve template statements
Franklin Schmidt <fschmidt@gmail.com>
parents: 629
diff changeset
61 end
ecd436959855 improve template statements
Franklin Schmidt <fschmidt@gmail.com>
parents: 629
diff changeset
62
ecd436959855 improve template statements
Franklin Schmidt <fschmidt@gmail.com>
parents: 629
diff changeset
63
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
64 function Io.print_to(out,...)
298
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
65 local list = {}
1276
623dfe0e2e73 change Luan.values
Franklin Schmidt <fschmidt@gmail.com>
parents: 1204
diff changeset
66 for _, v in values(...) do
298
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
67 list[#list+1] = to_string(v)
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
68 list[#list+1] = '\t'
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
69 end
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
70 if #list > 0 then
298
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
71 list[#list] = '\n'
539
473e456444ff Remove object-oriented primitive methods for string and binary
Franklin Schmidt <fschmidt@gmail.com>
parents: 503
diff changeset
72 out.write( unpack(list) )
1277
5ba660381bd5 fix Io.print()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1276
diff changeset
73 else
5ba660381bd5 fix Io.print()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1276
diff changeset
74 out.write('\n')
298
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
75 end
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
76 end
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
77
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
78 function Io.print(...)
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
79 Io.print_to(Io.stdout,...)
298
2ce23c7e2342 remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents: 297
diff changeset
80 end
392
8668f3799ad9 add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents: 321
diff changeset
81
8668f3799ad9 add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents: 321
diff changeset
82
1308
70eecde81820 remove fn,... to improve readability
Franklin Schmidt <fschmidt@gmail.com>
parents: 1288
diff changeset
83 function Io.output_to(out,fn)
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
84 local old_out = Io.stdout
1520
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
85 try
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
86 Io.stdout = out
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
87 return fn()
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
88 finally
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
89 Io.stdout = old_out
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
90 end
589
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
91 end
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
92
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
93 local uri = Io.uri -- make local
589
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
94
1308
70eecde81820 remove fn,... to improve readability
Franklin Schmidt <fschmidt@gmail.com>
parents: 1288
diff changeset
95 function Io.output_of(fn)
589
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
96 local string_uri = uri "string:"
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
97 local out = string_uri.text_writer()
1308
70eecde81820 remove fn,... to improve readability
Franklin Schmidt <fschmidt@gmail.com>
parents: 1288
diff changeset
98 Io.output_to(out,fn)
589
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
99 out.close()
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
100 return string_uri.read_text()
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
101 end
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
102
1571
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
103 function Io.relative_file_uri_string(path)
1570
81288d8b20a2 add Io.relative_file_name
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
104 local f = LuanException.getLuanStackTrace()[2].getFileName()
81288d8b20a2 add Io.relative_file_name
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
105 f = uri(f)
81288d8b20a2 add Io.relative_file_name
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
106 f.parent or error "source isn't file"
81288d8b20a2 add Io.relative_file_name
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
107 return f.parent().to_uri_string().."/"..path
81288d8b20a2 add Io.relative_file_name
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
108 end
81288d8b20a2 add Io.relative_file_name
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
109
589
97c8ae330efe add varargs to Luan.try;
Franklin Schmidt <fschmidt@gmail.com>
parents: 554
diff changeset
110
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
111 -- debug
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
112
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
113 function Io.debug(prompt)
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
114 prompt = prompt or "luan_debug> "
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
115 local function console()
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
116 return Io.read_console_line(prompt)
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
117 end
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
118 local env = {}
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
119 for line in console do
1520
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
120 try
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
121 local fn
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
122 try
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
123 fn = load("return "..line,"stdin",env)
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
124 catch e
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
125 fn = load(line,"stdin",env)
694
b620b8e1010f remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents: 693
diff changeset
126 end
1520
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
127 local rtn = pack( fn() )
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
128 if rtn.n > 0 then
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
129 Io.print( unpack(rtn) )
694
b620b8e1010f remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents: 693
diff changeset
130 end
1520
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
131 catch e
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
132 Io.print(e)
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1444
diff changeset
133 end
554
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
134 end
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
135 end
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
136
18504c41b0be move debug() to Io and remove Debug module;
Franklin Schmidt <fschmidt@gmail.com>
parents: 539
diff changeset
137
1088
bae2d0c2576c change module naming convention
Franklin Schmidt <fschmidt@gmail.com>
parents: 775
diff changeset
138 return Io