annotate src/luan/modules/Boot.luan @ 1578:c922446f53aa

immutable threading
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 08 Feb 2021 14:16:19 -0700
parents 81288d8b20a2
children 2975c932864d
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: 1347
diff changeset
1 require "java"
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2 local System = require "java:java.lang.System"
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 local URL = require "java:java.net.URL"
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 local BasicLuan = require "java:luan.modules.BasicLuan"
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 local new_error = BasicLuan.new_error
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 local ipairs = BasicLuan.ipairs
1283
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
7 local set_metatable = BasicLuan.set_metatable
1424
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
8 local load = BasicLuan.load
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
9 local type = BasicLuan.type
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 local StringLuan = require "java:luan.modules.StringLuan"
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 local match = StringLuan.match -- String.match
1424
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
12 local matches = StringLuan.matches -- String.matches
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 local IoLuan = require "java:luan.modules.IoLuan"
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 local LuanUrl = require "java:luan.modules.url.LuanUrl"
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
15 local LuanJava = require "java:luan.Luan"
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
16 local LuanTable = require "java:luan.LuanTable"
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
17 local get_local_cloned = BasicLuan.get_local_cloned
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
18 local set_local_cloned = BasicLuan.set_local_cloned
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
19 local is_immutable = BasicLuan.is_immutable
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
20 local raw_set = BasicLuan.raw_set
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 local Boot = {}
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 local function error(message)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 new_error(message).throw()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 Boot.error = error
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
31 local function no_security(fn)
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
32 LuanJava.checkCallerSecurity("no_security")
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
33 return function(...)
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
34 local security = LuanJava.setSecurity(nil)
1520
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1497
diff changeset
35 try
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1497
diff changeset
36 return fn(...)
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1497
diff changeset
37 finally
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1497
diff changeset
38 security and LuanJava.setSecurity(security)
d9a5405a3102 try statement
Franklin Schmidt <fschmidt@gmail.com>
parents: 1497
diff changeset
39 end
1330
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
40 end
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
41 end
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
42 Boot.no_security = no_security
f41919741100 fix security
Franklin Schmidt <fschmidt@gmail.com>
parents: 1321
diff changeset
43
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
45 local local_metatable = {
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
46 __index = get_local_cloned
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
47 }
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
48 function local_metatable.__new_index(tbl,key,value)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
49 if is_immutable(tbl) then
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
50 set_local_cloned(tbl,key,value)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
51 else
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
52 raw_set(tbl,key,value)
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
53 end
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
54 end
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
55 Boot.local_metatable = local_metatable
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
56
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
57
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 local function new_LuanIn(io)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 local this = {}
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 this.java = io
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 this.to_string = io.to_string
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 this.read_text = io.read_text
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 this.read_binary = io.read_binary
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 this.read_lines = io.read_lines
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 this.read_blocks = io.read_blocks
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 this.exists = io.exists
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 this.checksum = io.checksum
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 this.charset = io.charset
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 this.set_charset = io.set_charset
1426
Franklin Schmidt <fschmidt@gmail.com>
parents: 1424
diff changeset
70 this.to_uri_string = io.to_uri_string
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 return this
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 Boot.new_LuanIn = new_LuanIn
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75 local function new_writer(writer)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 local this = {}
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 this.java = writer
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 this.write = writer.write
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 this.close = writer.close
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 return this
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 function Boot.text_writer(out)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 return new_writer( IoLuan.luanWriter(out) )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 Boot.binary_writer = new_writer
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 local function new_LuanIO(io)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 local this = new_LuanIn(io)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 this.write = io.write
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92 this.write_text = io.write_text
1470
Franklin Schmidt <fschmidt@gmail.com>
parents: 1434
diff changeset
93 this.write_binary = io.write_binary
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95 function this.text_writer()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96 return new_writer( io.text_writer() )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99 function this.binary_writer()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 return new_writer( io.binary_writer() )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 return this
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106 local schemes = {}
1578
c922446f53aa immutable threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1570
diff changeset
107 set_metatable(schemes,local_metatable)
1562
b89212fd04b5 remove table.luan
Franklin Schmidt <fschmidt@gmail.com>
parents: 1520
diff changeset
108 --LuanTable.setSecurity(schemes,"schemes")
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 function schemes.null(path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111 return new_LuanIO( IoLuan.nullIO )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
113
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114 function schemes.string(path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 return new_LuanIO( IoLuan.LuanString.new(path) )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 function schemes.classpath(path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 local cp = IoLuan.classpath(path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 return cp and new_LuanIn(cp)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
121 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
122
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
123 function schemes.luan(path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
124 return schemes.classpath("luan/modules/"..path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 function schemes.stdin(path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 local Io = require "luan:Io.luan"
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 return Io.stdin
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131
1364
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
132
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
133 local function new_LuanUrl(io)
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
134 local this = new_LuanIn(io)
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
135
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
136 local function check()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
137 io.httpCon or error "must open first"
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
138 end
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
139
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
140 function this.get_header(name)
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
141 check()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
142 return io.httpCon.getHeaderField(name)
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
143 end
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
144
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
145 function this.get_response_code()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
146 check()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
147 return io.httpCon.getResponseCode()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
148 end
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
149
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
150 function this.get_response_message()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
151 check()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
152 return io.httpCon.getResponseMessage()
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
153 end
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
154
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
155 return this
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
156 end
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
157
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158 local function url(path,options)
1364
45363886f256 add url methods
Franklin Schmidt <fschmidt@gmail.com>
parents: 1353
diff changeset
159 return new_LuanUrl( LuanUrl.new(URL.new(path),options) )
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162 function schemes.http(path,options)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 return url( "http:"..path, options )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 function schemes.https(path,options)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167 return url( "https:"..path, options )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 local function new_BaseOs(io)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 local this = new_LuanIO(io)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172 this.wait_for = io.wait_for
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 return this
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176 function schemes.os(path,options)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 return new_BaseOs( IoLuan.LuanOs.new(path,options) )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 function schemes.bash(path,options)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181 return new_BaseOs( IoLuan.LuanBash.new(path,options) )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 local function new_LuanFile(io)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 local this = new_LuanIO(io)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 this.name = io.file.getName
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 this.is_directory = io.file.isDirectory
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 this.is_file = io.file.isFile
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 this.delete = io.delete
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190 this.delete_on_exit = io.file.deleteOnExit
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
191 this.mkdir = io.mkdir
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
192 this.last_modified = io.file.lastModified
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
193 this.set_last_modified = io.set_last_modified
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
194 this.length = io.file.length
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195 this.rename_to = io.rename_to
1497
f04bfbb08721 link_from
Franklin Schmidt <fschmidt@gmail.com>
parents: 1470
diff changeset
196 this.link_from = io.link_from
f04bfbb08721 link_from
Franklin Schmidt <fschmidt@gmail.com>
parents: 1470
diff changeset
197 this.symlink_from = io.symlink_from
1311
ca742d51b31f don't delete into symbolic links
Franklin Schmidt <fschmidt@gmail.com>
parents: 1286
diff changeset
198 this.is_symbolic_link = io.is_symbolic_link
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 function this.child(name)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 return new_LuanFile( io.child(name) )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204 function this.children()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 local raw = io.children()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 if raw == nil then
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207 return nil
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
208 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209 local rtn = {}
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 for _, child in ipairs(raw) do
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
211 rtn[#rtn+1] = new_LuanFile(child)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213 return rtn
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216 function this.parent()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 return new_LuanFile( io.parent() )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
218 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
220 function this.canonical()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
221 return new_LuanFile( io.canonical() )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
224 function this.create_temp_file(prefix,suffix)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 return new_LuanFile( io.create_temp_file(prefix,suffix) )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 return this
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
229 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
230
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 function schemes.file(path)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
232 return new_LuanFile( IoLuan.LuanFile.new(path) )
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
233 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
234
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
235 Boot.schemes = schemes
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
236
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
237
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
238 local function uri(name,options)
1286
9eb3a9724853 uri bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
239 local scheme, location = match( name, "(?s)^([^:]+):(.*)$" )
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
240 scheme or error( "invalid Io.uri name '"..name.."', missing scheme" )
1286
9eb3a9724853 uri bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents: 1283
diff changeset
241 local opener = schemes[scheme] or error( "invalid scheme '"..scheme.."' in '"..name.."'" )
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 return opener(location,options)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 Boot.uri = uri
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
245
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
246
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
247 function Boot.read(uri_str) -- for PackageLuan.java
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
248 local u = uri(uri_str)
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
249 if u==nil or not u.exists() then
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250 return nil
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252 return u.read_text()
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
253 end
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254
1424
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
255 function Boot.load_file(file)
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
256 if type(file) == "string" then
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
257 if not matches(file,":") then
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
258 file = "file:"..file
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
259 end
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
260 local u = uri(file)
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
261 if u==nil or not u.exists() then
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
262 return nil
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
263 end
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
264 local src = u.read_text()
1434
56fb5cd8228d cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents: 1426
diff changeset
265 return load(src,file,true)
1424
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
266 elseif type(file) == "table" and file.read_text ~= nil then
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
267 local src = file.read_text()
1426
Franklin Schmidt <fschmidt@gmail.com>
parents: 1424
diff changeset
268 local src_file = file.uri_string or file.to_uri_string()
1434
56fb5cd8228d cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents: 1426
diff changeset
269 return load(src,src_file,true)
1424
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
270 else
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
271 error("bad argument, expected string or uri table but got "..type(file))
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
272 end
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
273 end
9ab267b9427c better load_file()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1367
diff changeset
274
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
275
1283
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
276 local error_mt = {}
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
277
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
278 function error_mt.__to_string(t)
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
279 return t.java.getLuanStackTraceString()
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
280 end
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
281
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
282 function Boot.new_error_table(ex) -- for LuanException.java
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
283 local this = {}
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
284 set_metatable(this,error_mt)
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
285 this.java = ex
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
286 this.get_message = ex.getMessage
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
287 this.throw = ex.throwThis
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
288 this.get_stack_trace_string = ex.getLuanStackTraceString
1347
643cf1c37723 move webserver to lib and bug fixes
Franklin Schmidt <fschmidt@gmail.com>
parents: 1330
diff changeset
289 this.get_java_stack_trace_string = ex.getJavaStackTraceString
1283
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
290 return this
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
291 end
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
292
503bde9a7c80 add luan.require() and table.call()
Franklin Schmidt <fschmidt@gmail.com>
parents: 1280
diff changeset
293
1280
781ec0a92bb5 add Boot.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
294 return Boot