-- Command-line-driven web client for mol2chemfig. local os = require("os") local io = require("io") local json = require("json") require("rpc") -- modifies json in place to add rpc namespace local progname = arg[0] local client_version = "1.2" server = json.rpc.proxy(server_address) local server_info, error = server.info({progname, client_version}) if error then io.stderr:write("Error: ", error) os.exit() end -- if we get here, the server responds as expected. function printhelp() print (server_info['help_text']) os.exit() end -- Split input into options and arguments. Only arguments -- at the end are accepted. local arguments = {} local i = #arg if i == 0 then -- no input at all printhelp() end noargs = server_info['noarg_shortopts'] -- separate options and arguments while i > 0 and arg[i]:sub(1,1) ~= '-' do local j = i - 1 if j == 0 or arg[j]:sub(1,1) ~= '-' or arg[j]:sub(2,2) == '-' or string.find(noargs, arg[j]:sub(2,2)) then table.insert(arguments,#arguments+1,arg[i]) table.remove(arg, i) end i = j end -- what remains in arg after removing arguments are options local user_options = table.concat(arg, ' ') -- first, see whether the user requests help or the program version. local version_opts = server_info['version_opts'] local s for i,s in ipairs(version_opts) do if string.find(user_options, s) then print(server_info['version_text']) print("On your system, the client is installed in: " .. progname) os.exit() end end local help_opts = server_info['help_opts'] for i,s in ipairs(help_opts) do if string.find(user_options, s) then printhelp() end end -- if we get here, the user should have provided exactly one argument. if #arguments ~= 1 then print ('Please provide exactly one argument (must come last, after any options)') os.exit() end -- have exactly one argument. read it directly, or treat it as a file name? local direct_input = false local direct_opts = server_info['direct_opts'] for i,s in ipairs(direct_opts) do if string.find(user_options, s) then direct_input = true end end local data if direct_input == false then f = io.open(arguments[1]) if f then data = f:read("*all") else print ("File '" .. arguments[1] .. "' not found") os.exit() end else data = arguments[1] end -- process options and data local result, error = server.process({progname, user_options, data}) if error then io.stderr:write(error .. '\n') else print(result) end