This is a technique for making it easy to load and save a configuration file that is associated with a channel. I’ve done it in a relatively elaborate manner.
The config module below
- It looks up the GUID for the script in the configuration file (taking into account the type of Translator module).
- Tries to load GUID.xml and parse the XML if it can.
- If not it returns a default XML document as supplied by the caller.
It makes for a convenient way to associate a configuration file with a Translator instance.
Here it is in action:
And here is the code to copy:
require 'config' local function trace(a,b,c,d) return end Default = [[ <llp_client port='5123' host='localhost' /> ]] function main() local C, Tok = config.File(config.TO, Default) C.llp_client.port = 6000 config.Save(Tok, C) end
You can see how convenient the annotations and auto-completion make using the resulting configuration file:
Where this is all headed is providing the foundation tools to make it possible to write complete components in Lua that have their own configuration interfaces.
Here’s the source code to the config module:
require('node') config={} local function ReadFile(FileName) local F = io.open(FileName) local X = F:read("*all") F:close() return X end local function WriteFile(FileName, Content) local F = io.open(FileName, "w") F:write(Content) F:close() end function node.getChannel(C, Name) for i=1,#C.iguana_config.channel_config do local Chan = C.iguana_config.channel_config[i] if Chan.name:nodeValue() == Name then return Chan end end return nil end config.FROM = 1 config.TO = 2 config.FILTER = 3 config.ACK = 4 function ScriptGuid(ScriptType, ChannelName, Config) if ScriptType == config.TO then return Config:getChannel(ChannelName).to_mapper.guid:nodeValue() end if ScriptType == config.FROM then return Config:getChannel(ChannelName).from_mapper.guid:nodeValue() end if ScriptType == config.FILTER then return Config:getChannel(ChannelName).message_filter.translator_guid:nodeValue() end if ScriptType == config.ACK then return Config:getChannel(ChannelName).llp_listener.ack_script:nodeValue() end end function config.ScriptGuid(ScriptType) if not ScriptType then ScriptType = config.TO end local X = ReadFile('IguanaConfiguration.xml') X = xml.parse{data=X} local Guid = ScriptGuid(ScriptType, iguana.channelName(), X) return Guid end function config.File(ScriptType, Default) local G = config.ScriptGuid(ScriptType) local F = io.open(G..'.xml', 'r') local D = Default if F then D = F:read("*all") F:close() end return xml.parse{data=D}, G end function config.Save(Guid, Config) local Content = Config:S() WriteFile(Guid..'.xml', Content) end