Checking number of parameters in bridge function argument

This commit is contained in:
Ralph Wessel
2024-08-29 23:10:53 +01:00
parent 9e22d3b3b8
commit fca1f0b999
11 changed files with 80 additions and 80 deletions
+2
View File
@@ -113,6 +113,7 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\GoAway.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\SayHi.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TestBridge.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.cpp" />
<ClCompile Include="Connector\Interface\ConnectorMenu.cpp" />
<ClCompile Include="Connector\Interface\ConnectorPalette.cpp" />
</ItemGroup>
@@ -140,6 +141,7 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\GoAway.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\SayHi.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TestBridge.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.h" />
<ClInclude Include="Connector\Interface\ConnectorMenu.h" />
<ClInclude Include="Connector\Interface\ConnectorPalette.h" />
<ClInclude Include="Connector\Version.h" />
@@ -143,6 +143,9 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\Arg\SayHiArg.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test\Arg</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Connector\ConnectorResource.h">
@@ -223,5 +226,8 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\Arg\SayHiArg.h">
<Filter>Connector\Interface\Browser\Bridge\Test\Arg</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.h">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClInclude>
</ItemGroup>
</Project>
@@ -19,7 +19,7 @@ namespace {
///Serialisation field IDs
static std::array fieldID = {
Identity{"Id"},
Identity{"id"},
Identity{"count"},
Identity{"thisIsABoolean"},
};
@@ -40,8 +40,8 @@ struct std::hash<connector::interfac::browser::bridge::ComplexType> {
--------------------------------------------------------------------*/
ComplexType::ComplexType() {
//This is the required test values
ID = String{std::hash<ComplexType>()(*this)} + " - I am a string";
count = static_cast<int32_t>(std::hash<ComplexType>()(*this));
ID = String{count} + " - I am a string";
} //ComplexType::ComplexType
@@ -56,9 +56,9 @@ bool ComplexType::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[unID], unID, element },
{ fieldID[countID], countID, element },
{ fieldID[isTestID], isTestID, element },
{ fieldID[unID], unID, element, !ID.empty() },
{ fieldID[countID], countID, element, count != 0 },
{ fieldID[isTestID], isTestID, element, testBool },
},
}.withType(&typeid(ComplexType)));
return true;
@@ -7,7 +7,7 @@
namespace connector::interfac::browser::bridge {
///Argument for the parameters of a test message
using SayHiWrapper = speckle::interfac::browser::bridge::JSArgType<SayHiArg>;
using SayHiWrapper = speckle::interfac::browser::bridge::JSArgType<SayHiArg, 3>;
/*!
JS Function class to return a test message based on sample data
@@ -4,6 +4,8 @@
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include <array>
using namespace active::serialise;
using namespace active::setting;
using namespace connector::interfac::browser::bridge;
@@ -57,6 +57,12 @@ namespace speckle::interfac::browser::bridge {
@return True if the argument contains an error
*/
bool hasError() const { return m_errorMessage.operator bool(); }
/*!
Get the number of parameters in the argument
@return The number of parameters
*/
virtual uint32_t parameterCount() const { return 1; }
/*!
Get any error message relating to the arguments
@return The error message (nullopt if no errors occurred)
@@ -92,7 +98,7 @@ namespace speckle::interfac::browser::bridge {
};
///Definition of the argument for a JS callable method (enclosing the local function argument)
template<typename T>
template<typename T, uint32_t Params = 1>
class JSArgType : public BridgeArgument {
public:
@@ -115,6 +121,11 @@ namespace speckle::interfac::browser::bridge {
*/
JSArgType(const JSArgType& source) : BridgeArgument{source}, value{source.value} {}
/*!
Get the number of parameters in the argument
@return The number of parameters
*/
uint32_t parameterCount() const override { return Params; }
/*!
Fill an inventory with the cargo items
@param inventory The inventory to receive the cargo items
@@ -5,6 +5,7 @@
#include "Active/Serialise/Package/Wrapper/ValueSettingWrap.h"
#include "Active/Serialise/JSON/JSONTransport.h"
#include "Active/Utility/BufferIn.h"
#include "Speckle/Utility/Exception.h"
using namespace active::serialise;
using namespace active::serialise::json;
@@ -133,22 +134,32 @@ std::unique_ptr<BridgeArgument> BridgeArgumentWrap::makeArgument(const String& m
if (auto maker = m_argumentFactory.find(methodID); (maker != m_argumentFactory.end())) {
if (auto result = reinterpret_cast<BridgeArgument*>(maker->second(methodID, requestID)); result != nullptr) {
try {
//The argument is passed as an array of stringified JSON - first unpack the array
JSONTransport transport{Transport::Policy::verbose};
//The argument is passed as an array of stringified JSON - first unpack the array
JSONTransport transport;
ValueSetting args;
transport.receive(ValueSettingWrap{args}, Identity{}, argument);
//Then unify the argument strings into a single JSON argument
String unifiedArgument{"{"};
int32_t argIndex = 0;
bool isFirst = true;
for (auto& arg : args.operator std::vector<active::utility::String>()) {
if (isFirst)
isFirst = false;
else
unifiedArgument += ",";
unifiedArgument += "\"" + String{argIndex++} + "\":" + JSONTransport::convertFromJSONString(arg);
if (args.size() != result->parameterCount())
throw Exception{"Function called with wrong number of parameters"};
String unifiedArgument;
if (dynamic_cast<Package*>(result) != nullptr) {
//Unify the argument strings into a single JSON argument
unifiedArgument = "{";
int32_t argIndex = 0;
bool isFirst = true;
for (auto& arg : args.operator std::vector<active::utility::String>()) {
if (isFirst)
isFirst = false;
else
unifiedArgument += ",";
unifiedArgument += "\"" + String{argIndex++} + "\":" + JSONTransport::convertFromJSONString(arg);
}
unifiedArgument += "}";
} else {
//An item can only receive a single parameter
if (args.size() > 1)
throw Exception{"Function called with wrong number of parameters"};
unifiedArgument = args;
}
unifiedArgument += "}";
//And receive the unified argument into the method argument
transport.receive(std::forward<Cargo&&>(*result), Identity{}, unifiedArgument);
return std::unique_ptr<BridgeArgument>{result};
@@ -1,28 +0,0 @@
#ifndef SPECKLE_INTERFACE_BRIDGE_FUNCTION_BINDING
#define SPECKLE_INTERFACE_BRIDGE_FUNCTION_BINDING
#include "Speckle/Interface/Browser/JSBinding.h"
#ifdef ARCHICAD
#include "Speckle/Serialise/JSBase/JSBaseTransport.h"
#include <Ref.hpp>
#include <JSValues.hpp>
#else
#include "Active/Serialise/JSON/JSONTransport.h"
#endif
namespace speckle::interfac::browser::bridge {
///Define the bridge binding protocols according to platform (argument/result serialisation and transport for (de)serialisation)
#ifdef ARCHICAD
//Archicad uses a proprietary JS::Base type for JS values
using PlatformBinding = JSBinding<GS::Ref<JS::Base>, speckle::serialise::jsbase::JSBaseTransport>;
#else
//All others will use JSON (in a String)
using PlatformBinding = JSBinding<active::utility::String, active::serialise::json::JSONTransport>;
#endif
}
#endif //SPECKLE_INTERFACE_BRIDGE_FUNCTION_BINDING
@@ -38,12 +38,8 @@ std::unique_ptr<WrappedResultArg> GetCallResult::getResult(WrappedResultArg& arg
if (!hasBridge())
return nullptr;
//Retrieve the requested result
<<<<<<< Updated upstream
using namespace json;
auto result = m_bridge.releaseResult(argument);
=======
auto result = getBridge()->releaseResult(argument);
>>>>>>> Stashed changes
auto item = dynamic_cast<Cargo*>(result.get());
if (!item)
return nullptr;
+8 -8
View File
@@ -27,17 +27,17 @@
<ClInclude Include="Speckle\Event\Subscriber\SelectionSubscriber.h" />
<ClInclude Include="Speckle\Event\Type\MenuEvent.h" />
<ClInclude Include="Speckle\Event\Type\SelectionEvent.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeArgument.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeArgumentWrap.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeChild.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeMethod.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeMethodBase.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\BrowserBridge.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\ErrorReport.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\FunctionBinding.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\PlatformBinding.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\GetBindingsMethodNames.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\GetCallResult.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\RunMethod.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSArgumentBase.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeArgument.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeArgumentWrap.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeMethod.h" />
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeMethodBase.h" />
<ClInclude Include="Speckle\Interface\Browser\Functional.h" />
<ClInclude Include="Speckle\Interface\Browser\JSBinding.h" />
<ClInclude Include="Speckle\Interface\Browser\JSFunction.h" />
@@ -57,13 +57,13 @@
<ClCompile Include="Speckle\Environment\Addon.cpp" />
<ClCompile Include="Speckle\Event\Subscriber\MenuSubscriber.cpp" />
<ClCompile Include="Speckle\Event\Subscriber\SelectionSubscriber.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\BridgeArgument.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\BridgeArgumentWrap.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\BrowserBridge.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\Functions\ErrorReport.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\Functions\GetBindingsMethodNames.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\Functions\GetCallResult.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\Functions\RunMethod.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\JSBridgeArgument.cpp" />
<ClCompile Include="Speckle\Interface\Browser\Bridge\JSBridgeArgumentWrap.cpp" />
<ClCompile Include="Speckle\Record\Credentials\Account.cpp" />
<ClCompile Include="Speckle\Serialise\JSBase\JSBaseTransport.cpp" />
<ClCompile Include="Speckle\Utility\Guid.cpp" />
+20 -20
View File
@@ -106,19 +106,7 @@
<ClInclude Include="Speckle\Interface\Browser\Bridge\BrowserBridge.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeArgument.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeArgumentWrap.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeMethod.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSBridgeMethodBase.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\FunctionBinding.h">
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\PlatformBinding.h">
<Filter>Speckle\Interface\Browser\Bridge\Functions</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\GetBindingsMethodNames.h">
@@ -145,7 +133,19 @@
<ClInclude Include="Speckle\Interface\Browser\Bridge\Functions\ErrorReport.h">
<Filter>Speckle\Interface\Browser\Bridge\Functions</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\JSArgumentBase.h">
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeArgument.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeArgumentWrap.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeChild.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeMethod.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
<ClInclude Include="Speckle\Interface\Browser\Bridge\BridgeMethodBase.h">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClInclude>
</ItemGroup>
@@ -171,12 +171,6 @@
<ClCompile Include="Speckle\Interface\Browser\Bridge\BrowserBridge.cpp">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClCompile>
<ClCompile Include="Speckle\Interface\Browser\Bridge\JSBridgeArgument.cpp">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClCompile>
<ClCompile Include="Speckle\Interface\Browser\Bridge\JSBridgeArgumentWrap.cpp">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClCompile>
<ClCompile Include="Speckle\Interface\Browser\Bridge\Functions\GetBindingsMethodNames.cpp">
<Filter>Speckle\Interface\Browser\Bridge\Functions</Filter>
</ClCompile>
@@ -198,6 +192,12 @@
<ClCompile Include="Speckle\Interface\Browser\Bridge\Functions\ErrorReport.cpp">
<Filter>Speckle\Interface\Browser\Bridge\Functions</Filter>
</ClCompile>
<ClCompile Include="Speckle\Interface\Browser\Bridge\BridgeArgument.cpp">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClCompile>
<ClCompile Include="Speckle\Interface\Browser\Bridge\BridgeArgumentWrap.cpp">
<Filter>Speckle\Interface\Browser\Bridge</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Text Include="Speckle\CMakeLists.txt">