---
-- Support functions.
-- This module implements some looping primitives, some useful wrappers.
-- should be used to make code shorter.
module("support")
--============================================================================--
-- This is part of FreePOPs (http://www.freepops.org) released under GNU/GPL
--============================================================================--
---
-- A simple do while loop in a more compatc way.
-- Gets somthing with retrive, then calls action on it and loops until
-- check_retrive
--@param retrive function to retrive the page,
-- called with no parameters;
-- returns (file|nil),errorstring.
--@param check_retrive function that checks for another retrival
-- and eventually changes retrive behaviour, called with retrived file;
-- returns (true|false).
--@param action function called with retrived file;
-- returns (true|false), errorstring.
--@return last action result.
function do_until(retrive,check_retrive,action)
local file = nil
local rc = nil
local err = nil
if not retrive then
log.error_print("INTERNAL: retrive is nil\n")
end
if not check_retrive then
log.error_print("INTERNAL: check_retrive is nil\n")
end
if not action then
log.error_print("INTERNAL: action is nil\n")
end
repeat
file,err = retrive()
if not file then
if not err then
err = "INTERNAL: function retrive() "..
"must return an error message as "..
"the second return if the first one"..
" is nil"
end
log.error_print(err.."\n")
break
end
rc,err = action(file)
if not rc then
if not err then
err = "INTERNAL: function action() "..
"must return an error message as "..
"the second return if the first one"..
" is nil"
end
log.error_print(err.."\n")
break
end
until check_retrive(file)
return rc
end
---
-- Generates a function that tryes n times retrive.
-- @param retrive function to retrive the page,
-- called with no parameters, returns (file|nil),errorstring.
function retry_n(n,retrive)
local retrive_n = function(...)
local i = 0
local file = nil
local err = nil
repeat
file,err = retrive(unpack(arg))
if file then
break
else
--print("skipping" .. err)
end
i = i + 1
until i >= n
return file,err
end
return retrive_n
end
---
-- Returns a retrive function for do_until that retrives uri u with browser b
function do_retrive(b,u)
return function()
return b:get_uri(u)
end
end
---
-- Returns a retrive function for do_until that post uri u,p with browser b
function do_post(b,u,p)
return function()
return b:post_uri(u,p)
end
end
---
-- This is the check to make do_until exit after the first repeat
function check_fail()
return true
end
---
-- This creates a function for do_until action that puts the capture of
-- exp in t[field]
function do_extract(t,field,exp)
--sanity checks
if field == nil or exp == nil or t == nil then
return function (s)
return nil,"t, field and exp must be non-nil!\n"..
"support.do_extract not called properly."
end
end
--the real code
return function (s)
if s == nil then
return nil,"Unable to capture "..exp..
" the data was nil"
end
local _,_,r = string.find(s,exp)
if not r then
print("Unable to capture "..exp..
" the data was " ..s)
return nil,"Unable to capture "..exp..
" the data is printd on stdout"
else
t[field] = r
return true,nil
end
end
end
---
-- Check if v is nil, and eventually logs the error, return nil if ok,
-- true if an error occurred
function check(v,err)
if not v then
log.print_err(err)
return true
end
return nil
end