 
                
                100 posts
                
                    
                        Location
                        Sublime Text 2
                    
                
             
            
                Posted 29 September 2016 - 04:46 PM
                So I was curious if you could get other returns other than 
true from os.loadAPI()
here was the code i had: 
local gamePath = "Jetpack/"
local apiPath = gamePath.."api/"
apis = {"log"}
os.loadAPI(apiPath.."log")
local add = log.add
log.set(gamePath.."logs","log-"..os.day(),".gl")
function loadAPIs()
str = ""
add("Loading APIs...")
for k,v in pairs(fs.list(apiPath)) do
  if v ~= "log" then
   os.loadAPI(apiPath..v)
   table.insert(apis,v)
  end
  total = k
end
for k,v in pairs(apis) do
  str = v..","..str
end
add("Loaded:",str)
add("Total APIs: #"..total)
end
loadAPIs()
maybe i could just make a function in each API to get the version but i was wondering if there was a way :)/>
– ReBraLa
** Indention was better, website edited it like this
*** Have a return in the API as 
local version = 1.3213123
return version
 
         
        
        
            
            
                
                     
                
                726 posts
                
                    
                        Location
                        Rem is best girl
                    
                
             
            
                Posted 29 September 2016 - 04:47 PM
                There's false :D/> Also I believe it can return on a second variable what went wrong (The api doesn't work, it's already loaded .etc)
                
             
         
        
        
            
            
                
                     
                
                3057 posts
                
                    
                        Location
                        United States of America
                    
                
             
            
                Posted 29 September 2016 - 04:54 PM
                No.  os.loadAPI will always return true or false.  You could write your own os.loadAPI (or just modify the existing one) to make it return values.
                
             
         
        
        
            
            
                
                     
                
                100 posts
                
                    
                        Location
                        Sublime Text 2
                    
                
             
            
                Posted 29 September 2016 - 05:01 PM
                No.  os.loadAPI will always return true or false.  You could write your own os.loadAPI (or just modify the existing one) to make it return values.
Okay, I'll think about something! question know any reason why it won't add the str from 
for k,v in pairs(apis) do
  str = v..","..str
end
add("Loaded:",str)
add("Total APIs: #"..total)
to the log?
 
         
        
        
            
            
                
                     
                
                100 posts
                
                    
                        Location
                        Sublime Text 2
                    
                
             
            
                Posted 29 September 2016 - 05:14 PM
                – Snip
Solved the getting version with this
local file = fs.open(gamePath.."api-versions","r")
local versions = textutils.unserialise(file.readAll())
file.close()
function getVersion(api)
if versions[api] then
  return versions[api]
else
  return 0
end
end
 
         
        
        
            
            
                
                     
                
                463 posts
                
                    
                        Location
                        Star Wars
                    
                
             
            
                Posted 29 September 2016 - 08:53 PM
                I wouldn't use numbers for the versions, because they don't support (and they shouldn't) multiple '.'.
I would solve it so:
local function collect (sContent) -- use File.readAll() as a argument
  sContent = sContent .. '\n'
  local tRes = {}
  for sName, sVersion in sContent:gmatch '([%a_][%a%w_]*)=([%d%.]*)\n' do
	tRes[sName] = sVersion
  end
  return tRes
end
Now you can add your data
API1=0.0.0.1
API2=!asdasd -- will be ignored (wbi)
Code 123 -- wbi
text 1234 -- wbi
ZAPI=546.00 -- won't be ignored
-- wbi
-- wbi
You can write into files with this function:
function saveCollected (tCollected, handle) -- you have to give a handle, opened with fs.open(sDest, 'w') or fs.open(sDest, 'a')
  for sName, sVersion in pairs(tCollected) do
	if sName:match '[%a_][%a%w_]*' and sVersion:match '[%d%.]*' then
		handle.writeLine(sName .. '=' .. sVersion)
	end
  end
  handle.flush() -- if you want to close the file, use saveCollected(...).close() or edit this line to handle.close()
  return handle
end
And yes, i am bored.
Edited on 29 September 2016 - 06:54 PM
                
             
         
        
        
            
            
                
                     
                
                111 posts
                
                    
                        Location
                        here
                    
                
             
            
                Posted 30 September 2016 - 11:08 PM
                You can use the original os.loadAPI code, and then make it return the environment:
function os.loadAPI( _sPath )
    local sName = fs.getName( _sPath )
    if tAPIsLoading[sName] == true then
        printError( "API "..sName.." is already being loaded" )
        return false
    end
    tAPIsLoading[sName] = true
    local tEnv = {}
    setmetatable( tEnv, { __index = _G } )
    local fnAPI, err = loadfile( _sPath, tEnv )
    if fnAPI then
        local ok, err = pcall( fnAPI )
        if not ok then
            printError( err )
            tAPIsLoading[sName] = nil
            return false
        end
    else
        printError( err )
        tAPIsLoading[sName] = nil
        return false
    end
    
    local tAPI = {}
    for k,v in pairs( tEnv ) do
        if k ~= "_ENV" then
            tAPI[k] =  v
        end
    end
    _G[sName] = tAPI    
    tAPIsLoading[sName] = nil
    return true, tAPI -- Added tAPI here
end
 
         
        
        
            
            
                
                     
                
                463 posts
                
                    
                        Location
                        Star Wars
                    
                
             
            
                Posted 30 September 2016 - 11:13 PM
                You can use the original os.loadAPI code, and then make it return the environment:
function os.loadAPI( _sPath )
	local sName = fs.getName( _sPath )
	if tAPIsLoading[sName] == true then
		printError( "API "..sName.." is already being loaded" )
		return false
	end
	tAPIsLoading[sName] = true
	local tEnv = {}
	setmetatable( tEnv, { __index = _G } )
	local fnAPI, err = loadfile( _sPath, tEnv )
	if fnAPI then
		local ok, err = pcall( fnAPI )
		if not ok then
			printError( err )
			tAPIsLoading[sName] = nil
			return false
		end
	else
		printError( err )
		tAPIsLoading[sName] = nil
		return false
	end
	
	local tAPI = {}
	for k,v in pairs( tEnv ) do
		if k ~= "_ENV" then
			tAPI[k] =  v
		end
	end
	_G[sName] = tAPI	
	tAPIsLoading[sName] = nil
	return true, tAPI -- Added tAPI here
end
It won't work i think, because tAPIsLoading isn't declared. Also, i propose, to don't load it into _G, because the user can load config data, without loading the config into _G. Also i would give a normal table, to prevent loading a virus through the config data.
 
         
        
        
            
            
                
                     
                
                111 posts
                
                    
                        Location
                        here
                    
                
             
            
                Posted 01 October 2016 - 12:33 AM
                You can use the original os.loadAPI code, and then make it return the environment:
function os.loadAPI( _sPath )
	local sName = fs.getName( _sPath )
	if tAPIsLoading[sName] == true then
		printError( "API "..sName.." is already being loaded" )
		return false
	end
	tAPIsLoading[sName] = true
	local tEnv = {}
	setmetatable( tEnv, { __index = _G } )
	local fnAPI, err = loadfile( _sPath, tEnv )
	if fnAPI then
		local ok, err = pcall( fnAPI )
		if not ok then
			printError( err )
			tAPIsLoading[sName] = nil
			return false
		end
	else
		printError( err )
		tAPIsLoading[sName] = nil
		return false
	end
	
	local tAPI = {}
	for k,v in pairs( tEnv ) do
		if k ~= "_ENV" then
			tAPI[k] =  v
		end
	end
	_G[sName] = tAPI	
	tAPIsLoading[sName] = nil
	return true, tAPI -- Added tAPI here
end
It won't work i think, because tAPIsLoading isn't declared. Also, i propose, to don't load it into _G, because the user can load config data, without loading the config into _G. Also i would give a normal table, to prevent loading a virus through the config data.
I may have skipped one or two lines so it isn't declared on the function itself. And, its loadAPI that loads it into _G, you can perfectly not, also you can give it a custom environment
 
         
        
        
            
            
                
                     
                
                172 posts
                
                    
                        Location
                        USA
                    
                
             
            
                Posted 02 October 2016 - 02:05 AM
                If you wanted you can do this
local oldLoadAPI = os.loadAPI
os.loadAPI = function(api)
    oldLoadAPI(api)
    return version
end
 
         
        
        
            
            
                
                     
                
                7083 posts
                
                    
                        Location
                        Tasmania (AU)
                    
                
             
            
                Posted 02 October 2016 - 02:45 AM
                … and "version" is set where…?
                
             
         
        
        
            
            
                
                     
                
                172 posts
                
                    
                        Location
                        USA
                    
                
             
            
                Posted 02 October 2016 - 03:31 AM
                He said:
local version = 1.3213123
                
             
         
        
        
            
            
                
                     
                
                7083 posts
                
                    
                        Location
                        Tasmania (AU)
                    
                
             
            
                Posted 02 October 2016 - 05:32 AM
                Yeaaah…
Little problem with that - executing such a line in the API isn't going to make such a variable available to your override function. He was hoping he could have the API return such a value on-load, but os.loadAPI() would need to be rather more thoroughly overridden than that in order to receive it.
Personally I'd just define a getVersion() within the API file.