add service interface

This commit is contained in:
Alexander Kromm 2020-05-13 18:48:03 +07:00 committed by Christoph Oelckers
parent be4e19b07d
commit c7658b691c
2 changed files with 101 additions and 0 deletions

View file

@ -37,6 +37,8 @@ version "4.5"
#include "zscript/destructible.zs"
#include "zscript/level_postprocessor.zs"
#include "zscript/level_compatibility.zs"
#include "zscript/dictionary.zs"
#include "zscript/service.zs"
#include "zscript/actors/actor.zs"
#include "zscript/actors/checks.zs"

View file

@ -0,0 +1,99 @@
/**
* This is Service interface.
*/
class Service abstract
{
virtual String Get(String request)
{
return "";
}
}
/**
* Use this class to find and iterate over services.
*
* Example usage:
*
* @code
* ServiceIterator i = ServiceIterator.Find("MyService");
*
* if (!i.ServiceExists()) { return; }
*
* Service s;
* while (s = i.Next())
* {
* String request = ...
* String answer = s.Get(request);
* ...
* }
* @endcode
*
* ServiceExists() call is optional and is provided for convenience.
*
* If no services are found, the all calls to Next() will return NULL.
*/
class ServiceIterator
{
/**
* @param serviceType class name of service to find.
*/
static ServiceIterator Find(String serviceType)
{
let result = new("ServiceIterator");
result.mType = serviceType;
if (result.ServiceExists())
{
result.mClassIndex = 0;
result.FindNextService();
}
else
{
// Class doesn't exist, don't even try to find it.
result.mClassIndex = AllClasses.Size();
}
return result;
}
/**
* @returns true if the requested service exists, false otherwise.
*/
bool ServiceExists()
{
return (mType != NULL);
}
/**
* Gets the service and advances the iterator.
*
* @returns service instance, or NULL if no more servers found.
*
* @note Each ServiceIterator will return new instances of services.
*/
Service Next()
{
uint classesNumber = AllClasses.Size();
Service result = (mClassIndex == classesNumber)
? NULL
: Service(new(AllClasses[mClassIndex]));
++mClassIndex;
findNextService();
return result;
}
private void FindNextService()
{
uint classesNumber = AllClasses.size();
while (mClassIndex < classesNumber && !(AllClasses[mClassIndex] is mType))
{
++mClassIndex;
}
}
private class<Service> mType;
private uint mClassIndex;
}