hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/gils/gils.rv
blob: afd0bbd0acaf50be93bc3b82fe44ae75c4f4c006 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# gils: better than Gnu utILS
global commands = {}

fn register(usage, group, help, handler) do
  const name = usage:split(" ")[0]
  commands:push({ name = name, usage = usage, group = group, help = help, handler = handler })
end

fn lookup(name) do
  for index in 0..commands:len() do
    if commands[index].name == name return commands[index]
  end
  return :nil
end

fn make_ctx(line, argv) do
  const name = argv[0]
  let rest = ""
  const cut = name:len() + 1
  if line:len() > cut do rest = line[cut..] end
  return { line = line, argv = argv, rest = rest }
end

# scripts read their args off env.ctx, stashed here before eval
global env = { ctx = :nil }

global abspath = fn(arg) do
  if arg:len() == 0 return wd.path
  let path = arg
  if arg[0] != "/" do
    if wd.path == "/" do path = "/#{arg}" end
    else do path = "#{wd.path}/#{arg}" end
  end
  while (path:len() > 1 and path[path:len() - 1] == "/") do path = path[0..(path:len() - 1)] end
  return path
end

fn run_script(name, ctx) do
  const path = "/bin/#{name}.rv"
  const size = fs:size(path)
  if size < 0 return :false
  env.ctx = ctx
  const error_msg = eval_script(fs:read_bytes(path, 0, size))
  if error_msg != :nil do puts("#{name}: #{error_msg}\n") end
  return :true
end