include std/dll.e include std/os.e include std/search.e include std/convert.e include std/filesys.e include std/text.e include std/sequence.e include std/console.e include std/pretty.e constant COMMANDS = { "/session", "/session/", "/session//url", "/session//element//element", "/session//element//attribute/", "/session//window//size" } constant CODE = { "/session", "/session/7", "/session/7/url", "/session/7/element/input/element", "/session/7/element/input/attribute/my_name", "/session/7/window/12345/size" } constant FIXED=0, VARIABLE=1 ------------------------------------------------------------------------------ -- analyzes REST query according to template -- returns variable elements function parse_rest_query(sequence template, sequence code) sequence s, var_name, result = {}, scheme = {} --, var_value integer offset = 0, n = 0 --, is_var = 0 integer var_start = 0, fixed_start = 1 for i = 1 to length(template) do if template[i] = '<' then var_start = i if var_start > fixed_start then scheme = append(scheme, {FIXED, template[fixed_start..var_start-1]}) end if fixed_start = 0 elsif template[i] = '>' then if var_start and (i > var_start+1) then scheme = append(scheme, {VARIABLE, template[var_start+1..i-1]}) end if var_start = 0 if i < length(template) then fixed_start = i+1 end if end if end for if fixed_start then scheme = append(scheme, {FIXED, template[fixed_start..$]}) end if offset = 0 for i = 1 to length(scheme) do if scheme[i][1] = FIXED then n = match(scheme[i][2], code, offset+1) if n = 0 then -- probleme puts(2, scheme[i][2] &" not found in '" & code & "'\n") maybe_any_key() abort(1) end if offset = n + length(scheme[i][2]) -1 else if i = length(scheme) then result = append(result, {scheme[i][2], code[offset+1..$]}) else n = match(scheme[i+1][2], code, offset+1) if n = 0 then -- problem puts(2, scheme[i+1][2] &" not found in '" & code & "'\n") maybe_any_key() abort(1) end if result = append(result, {scheme[i][2], code[offset+1..n-1]}) offset = n-2 end if end if end for return result end function ------------------------------------------------------------------------------ -- builds REST query according to template function build_rest_query(sequence template, sequence params) sequence result = {} integer var_num = 0 integer i = 1 while i <= length(template) do if template[i] = '<' then var_num += 1 if var_num > length(params) then printf(2, "Not enough params (%d) for template '%s'\n", {length(params), template}) abort(1) end if if atom(params[var_num]) then result &= to_string(params[var_num]) else result &= params[var_num] end if while template[i] != '>' do i += 1 if i > length(template) then puts(2, "Missing '>' in template\n") maybe_any_key() abort(1) end if end while else result &= template[i] end if i += 1 end while return result end function -------------------------------------------------------------------------------- sequence s for c = 1 to length(COMMANDS) do s = parse_rest_query(COMMANDS[c], CODE[c]) pretty_print(1, s, {2}) puts(1, "\n") end for s = build_rest_query("/session/", {7}) puts(1, "s = " & s & "\n") s = build_rest_query("/session//element//attribute/", {7, "input", "login"}) puts(1, "s = " & s & "\n") maybe_any_key()