API: refactor handlers to be slightly less verbose

This commit is contained in:
Jon Evans
2024-12-08 20:23:11 -05:00
parent df872a8af6
commit 96536f380d
9 changed files with 198 additions and 210 deletions
+70 -75
View File
@@ -97,15 +97,15 @@ PCB_EDIT_FRAME* API_HANDLER_PCB::frame() const
}
HANDLER_RESULT<RunActionResponse> API_HANDLER_PCB::handleRunAction( RunAction& aRequest,
const HANDLER_CONTEXT& )
HANDLER_RESULT<RunActionResponse> API_HANDLER_PCB::handleRunAction(
const HANDLER_CONTEXT<RunAction>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
RunActionResponse response;
if( frame()->GetToolManager()->RunAction( aRequest.action(), true ) )
if( frame()->GetToolManager()->RunAction( aCtx.Request.action(), true ) )
response.set_status( RunActionStatus::RAS_OK );
else
response.set_status( RunActionStatus::RAS_INVALID );
@@ -115,9 +115,9 @@ HANDLER_RESULT<RunActionResponse> API_HANDLER_PCB::handleRunAction( RunAction& a
HANDLER_RESULT<GetOpenDocumentsResponse> API_HANDLER_PCB::handleGetOpenDocuments(
GetOpenDocuments& aMsg, const HANDLER_CONTEXT& )
const HANDLER_CONTEXT<GetOpenDocuments>& aCtx )
{
if( aMsg.type() != DocumentType::DOCTYPE_PCB )
if( aCtx.Request.type() != DocumentType::DOCTYPE_PCB )
{
ApiResponseStatus e;
// No message needed for AS_UNHANDLED; this is an internal flag for the API server
@@ -141,9 +141,9 @@ HANDLER_RESULT<GetOpenDocumentsResponse> API_HANDLER_PCB::handleGetOpenDocuments
}
void API_HANDLER_PCB::pushCurrentCommit( const HANDLER_CONTEXT& aCtx, const wxString& aMessage )
void API_HANDLER_PCB::pushCurrentCommit( const std::string& aClientName, const wxString& aMessage )
{
API_HANDLER_EDITOR::pushCurrentCommit( aCtx, aMessage );
API_HANDLER_EDITOR::pushCurrentCommit( aClientName, aMessage );
frame()->Refresh();
}
@@ -219,7 +219,7 @@ HANDLER_RESULT<std::unique_ptr<BOARD_ITEM>> API_HANDLER_PCB::createItemForType(
HANDLER_RESULT<ItemRequestStatus> API_HANDLER_PCB::handleCreateUpdateItemsInternal( bool aCreate,
const HANDLER_CONTEXT& aCtx,
const std::string& aClientName,
const types::ItemHeader &aHeader,
const google::protobuf::RepeatedPtrField<google::protobuf::Any>& aItems,
std::function<void( ItemStatus, google::protobuf::Any )> aItemHandler )
@@ -271,7 +271,7 @@ HANDLER_RESULT<ItemRequestStatus> API_HANDLER_PCB::handleCreateUpdateItemsIntern
}
}
BOARD_COMMIT* commit = static_cast<BOARD_COMMIT*>( getCurrentCommit( aCtx ) );
BOARD_COMMIT* commit = static_cast<BOARD_COMMIT*>( getCurrentCommit( aClientName ) );
for( const google::protobuf::Any& anyItem : aItems )
{
@@ -371,10 +371,10 @@ HANDLER_RESULT<ItemRequestStatus> API_HANDLER_PCB::handleCreateUpdateItemsIntern
aItemHandler( status, newItem );
}
if( !m_activeClients.count( aCtx.ClientName ) )
if( !m_activeClients.count( aClientName ) )
{
pushCurrentCommit( aCtx, aCreate ? _( "Created items via API" )
: _( "Added items via API" ) );
pushCurrentCommit( aClientName, aCreate ? _( "Created items via API" )
: _( "Added items via API" ) );
}
@@ -382,13 +382,13 @@ HANDLER_RESULT<ItemRequestStatus> API_HANDLER_PCB::handleCreateUpdateItemsIntern
}
HANDLER_RESULT<GetItemsResponse> API_HANDLER_PCB::handleGetItems( GetItems& aMsg,
const HANDLER_CONTEXT& )
HANDLER_RESULT<GetItemsResponse> API_HANDLER_PCB::handleGetItems(
const HANDLER_CONTEXT<GetItems>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
if( !validateItemHeaderDocument( aMsg.header() ) )
if( !validateItemHeaderDocument( aCtx.Request.header() ) )
{
ApiResponseStatus e;
// No message needed for AS_UNHANDLED; this is an internal flag for the API server
@@ -403,7 +403,7 @@ HANDLER_RESULT<GetItemsResponse> API_HANDLER_PCB::handleGetItems( GetItems& aMsg
std::set<KICAD_T> typesRequested, typesInserted;
bool handledAnything = false;
for( int typeRaw : aMsg.types() )
for( int typeRaw : aCtx.Request.types() )
{
auto typeMessage = static_cast<common::types::KiCadObjectType>( typeRaw );
KICAD_T type = FromProtoEnum<KICAD_T>( typeMessage );
@@ -514,7 +514,7 @@ HANDLER_RESULT<GetItemsResponse> API_HANDLER_PCB::handleGetItems( GetItems& aMsg
void API_HANDLER_PCB::deleteItemsInternal( std::map<KIID, ItemDeletionStatus>& aItemsToDelete,
const HANDLER_CONTEXT& aCtx )
const std::string& aClientName )
{
BOARD* board = frame()->GetBoard();
std::vector<BOARD_ITEM*> validatedItems;
@@ -531,13 +531,13 @@ void API_HANDLER_PCB::deleteItemsInternal( std::map<KIID, ItemDeletionStatus>& a
// to add it in the future (and return IDS_IMMUTABLE)
}
COMMIT* commit = getCurrentCommit( aCtx );
COMMIT* commit = getCurrentCommit( aClientName );
for( BOARD_ITEM* item : validatedItems )
commit->Remove( item );
if( !m_activeClients.count( aCtx.ClientName ) )
pushCurrentCommit( aCtx, _( "Deleted items via API" ) );
if( !m_activeClients.count( aClientName ) )
pushCurrentCommit( aClientName, _( "Deleted items via API" ) );
}
@@ -551,13 +551,13 @@ std::optional<EDA_ITEM*> API_HANDLER_PCB::getItemFromDocument( const DocumentSpe
}
HANDLER_RESULT<BoardStackupResponse> API_HANDLER_PCB::handleGetStackup( GetBoardStackup& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<BoardStackupResponse> API_HANDLER_PCB::handleGetStackup(
const HANDLER_CONTEXT<GetBoardStackup>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -574,13 +574,12 @@ HANDLER_RESULT<BoardStackupResponse> API_HANDLER_PCB::handleGetStackup( GetBoard
HANDLER_RESULT<GraphicsDefaultsResponse> API_HANDLER_PCB::handleGetGraphicsDefaults(
GetGraphicsDefaults& aMsg,
const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<GetGraphicsDefaults>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -617,13 +616,13 @@ HANDLER_RESULT<GraphicsDefaultsResponse> API_HANDLER_PCB::handleGetGraphicsDefau
}
HANDLER_RESULT<GetBoundingBoxResponse> API_HANDLER_PCB::handleGetBoundingBox( GetBoundingBox& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<GetBoundingBoxResponse> API_HANDLER_PCB::handleGetBoundingBox(
const HANDLER_CONTEXT<GetBoundingBox>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
if( !validateItemHeaderDocument( aMsg.header() ) )
if( !validateItemHeaderDocument( aCtx.Request.header() ) )
{
ApiResponseStatus e;
// No message needed for AS_UNHANDLED; this is an internal flag for the API server
@@ -632,9 +631,9 @@ HANDLER_RESULT<GetBoundingBoxResponse> API_HANDLER_PCB::handleGetBoundingBox( Ge
}
GetBoundingBoxResponse response;
bool includeText = aMsg.mode() == BoundingBoxMode::BBM_ITEM_AND_CHILD_TEXT;
bool includeText = aCtx.Request.mode() == BoundingBoxMode::BBM_ITEM_AND_CHILD_TEXT;
for( const types::KIID& idMsg : aMsg.items() )
for( const types::KIID& idMsg : aCtx.Request.items() )
{
KIID id( idMsg.value() );
std::optional<BOARD_ITEM*> optItem = getItemById( id );
@@ -659,19 +658,18 @@ HANDLER_RESULT<GetBoundingBoxResponse> API_HANDLER_PCB::handleGetBoundingBox( Ge
HANDLER_RESULT<PadShapeAsPolygonResponse> API_HANDLER_PCB::handleGetPadShapeAsPolygon(
GetPadShapeAsPolygon& aMsg,
const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<GetPadShapeAsPolygon>& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
SHAPE_POLY_SET poly;
PadShapeAsPolygonResponse response;
PCB_LAYER_ID layer = FromProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>( aMsg.layer() );
PCB_LAYER_ID layer = FromProtoEnum<PCB_LAYER_ID, board::types::BoardLayer>( aCtx.Request.layer() );
for( const types::KIID& padRequest : aMsg.pads() )
for( const types::KIID& padRequest : aCtx.Request.pads() )
{
KIID id( padRequest.value() );
std::optional<BOARD_ITEM*> optPad = getItemById( id );
@@ -694,10 +692,9 @@ HANDLER_RESULT<PadShapeAsPolygonResponse> API_HANDLER_PCB::handleGetPadShapeAsPo
HANDLER_RESULT<types::TitleBlockInfo> API_HANDLER_PCB::handleGetTitleBlockInfo(
GetTitleBlockInfo& aMsg,
const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<GetTitleBlockInfo>& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.document() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.document() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -726,9 +723,9 @@ HANDLER_RESULT<types::TitleBlockInfo> API_HANDLER_PCB::handleGetTitleBlockInfo(
HANDLER_RESULT<ExpandTextVariablesResponse> API_HANDLER_PCB::handleExpandTextVariables(
ExpandTextVariables& aMsg, const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<ExpandTextVariables>& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.document() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.document() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -743,7 +740,7 @@ HANDLER_RESULT<ExpandTextVariablesResponse> API_HANDLER_PCB::handleExpandTextVar
return board->ResolveTextVar( token, 0 );
};
for( const std::string& textMsg : aMsg.text() )
for( const std::string& textMsg : aCtx.Request.text() )
{
wxString text = ExpandTextVars( wxString::FromUTF8( textMsg ), &textResolver );
reply.add_text( text.ToUTF8() );
@@ -753,13 +750,13 @@ HANDLER_RESULT<ExpandTextVariablesResponse> API_HANDLER_PCB::handleExpandTextVar
}
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleInteractiveMoveItems( InteractiveMoveItems& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleInteractiveMoveItems(
const HANDLER_CONTEXT<InteractiveMoveItems>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -767,7 +764,7 @@ HANDLER_RESULT<Empty> API_HANDLER_PCB::handleInteractiveMoveItems( InteractiveMo
TOOL_MANAGER* mgr = frame()->GetToolManager();
std::vector<EDA_ITEM*> toSelect;
for( const kiapi::common::types::KIID& id : aMsg.items() )
for( const kiapi::common::types::KIID& id : aCtx.Request.items() )
{
if( std::optional<BOARD_ITEM*> item = getItemById( KIID( id.value() ) ) )
toSelect.emplace_back( static_cast<EDA_ITEM*>( *item ) );
@@ -778,7 +775,7 @@ HANDLER_RESULT<Empty> API_HANDLER_PCB::handleInteractiveMoveItems( InteractiveMo
ApiResponseStatus e;
e.set_status( ApiStatusCode::AS_BAD_REQUEST );
e.set_error_message( fmt::format( "None of the given items exist on the board",
aMsg.board().board_filename() ) );
aCtx.Request.board().board_filename() ) );
return tl::unexpected( e );
}
@@ -788,20 +785,19 @@ HANDLER_RESULT<Empty> API_HANDLER_PCB::handleInteractiveMoveItems( InteractiveMo
mgr->RunAction( PCB_ACTIONS::selectionClear );
mgr->RunAction<EDA_ITEMS*>( PCB_ACTIONS::selectItems, &toSelect );
COMMIT* commit = getCurrentCommit( aCtx );
COMMIT* commit = getCurrentCommit( aCtx.ClientName );
mgr->PostAction( PCB_ACTIONS::move, commit );
return Empty();
}
HANDLER_RESULT<NetsResponse> API_HANDLER_PCB::handleGetNets( GetNets& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<NetsResponse> API_HANDLER_PCB::handleGetNets( const HANDLER_CONTEXT<GetNets>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -811,7 +807,7 @@ HANDLER_RESULT<NetsResponse> API_HANDLER_PCB::handleGetNets( GetNets& aMsg,
std::set<wxString> netclassFilter;
for( const std::string& nc : aMsg.netclass_filter() )
for( const std::string& nc : aCtx.Request.netclass_filter() )
netclassFilter.insert( wxString( nc.c_str(), wxConvUTF8 ) );
for( NETINFO_ITEM* net : board->GetNetInfo() )
@@ -830,18 +826,17 @@ HANDLER_RESULT<NetsResponse> API_HANDLER_PCB::handleGetNets( GetNets& aMsg,
}
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleRefillZones( RefillZones& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleRefillZones( const HANDLER_CONTEXT<RefillZones>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
if( aMsg.zones().empty() )
if( aCtx.Request.zones().empty() )
{
TOOL_MANAGER* mgr = frame()->GetToolManager();
frame()->CallAfter( [mgr]()
@@ -862,15 +857,15 @@ HANDLER_RESULT<Empty> API_HANDLER_PCB::handleRefillZones( RefillZones& aMsg,
HANDLER_RESULT<SavedDocumentResponse> API_HANDLER_PCB::handleSaveDocumentToString(
SaveDocumentToString& aMsg, const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<SaveDocumentToString>& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.document() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.document() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
SavedDocumentResponse response;
response.mutable_document()->CopyFrom( aMsg.document() );
response.mutable_document()->CopyFrom( aCtx.Request.document() );
CLIPBOARD_IO io;
io.SetWriter(
@@ -886,7 +881,7 @@ HANDLER_RESULT<SavedDocumentResponse> API_HANDLER_PCB::handleSaveDocumentToStrin
HANDLER_RESULT<SavedSelectionResponse> API_HANDLER_PCB::handleSaveSelectionToString(
SaveSelectionToString& aMsg, const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<SaveSelectionToString>& aCtx )
{
SavedSelectionResponse response;
@@ -909,12 +904,12 @@ HANDLER_RESULT<SavedSelectionResponse> API_HANDLER_PCB::handleSaveSelectionToStr
HANDLER_RESULT<CreateItemsResponse> API_HANDLER_PCB::handleParseAndCreateItemsFromString(
ParseAndCreateItemsFromString& aMsg, const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<ParseAndCreateItemsFromString>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.document() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.document() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -924,10 +919,10 @@ HANDLER_RESULT<CreateItemsResponse> API_HANDLER_PCB::handleParseAndCreateItemsFr
}
HANDLER_RESULT<BoardLayers> API_HANDLER_PCB::handleGetVisibleLayers( GetVisibleLayers& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<BoardLayers> API_HANDLER_PCB::handleGetVisibleLayers(
const HANDLER_CONTEXT<GetVisibleLayers>& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -941,13 +936,13 @@ HANDLER_RESULT<BoardLayers> API_HANDLER_PCB::handleGetVisibleLayers( GetVisibleL
}
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetVisibleLayers( SetVisibleLayers& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetVisibleLayers(
const HANDLER_CONTEXT<SetVisibleLayers>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -955,7 +950,7 @@ HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetVisibleLayers( SetVisibleLayers&
LSET visible;
LSET enabled = frame()->GetBoard()->GetEnabledLayers();
for( int layerIdx : aMsg.layers() )
for( int layerIdx : aCtx.Request.layers() )
{
PCB_LAYER_ID layer =
FromProtoEnum<PCB_LAYER_ID>( static_cast<board::types::BoardLayer>( layerIdx ) );
@@ -973,9 +968,9 @@ HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetVisibleLayers( SetVisibleLayers&
HANDLER_RESULT<BoardLayerResponse> API_HANDLER_PCB::handleGetActiveLayer(
GetActiveLayer& aMsg, const HANDLER_CONTEXT& aCtx )
const HANDLER_CONTEXT<GetActiveLayer>& aCtx )
{
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
@@ -988,18 +983,18 @@ HANDLER_RESULT<BoardLayerResponse> API_HANDLER_PCB::handleGetActiveLayer(
}
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetActiveLayer( SetActiveLayer& aMsg,
const HANDLER_CONTEXT& aCtx )
HANDLER_RESULT<Empty> API_HANDLER_PCB::handleSetActiveLayer(
const HANDLER_CONTEXT<SetActiveLayer>& aCtx )
{
if( std::optional<ApiResponseStatus> busy = checkForBusy() )
return tl::unexpected( *busy );
HANDLER_RESULT<bool> documentValidation = validateDocument( aMsg.board() );
HANDLER_RESULT<bool> documentValidation = validateDocument( aCtx.Request.board() );
if( !documentValidation )
return tl::unexpected( documentValidation.error() );
PCB_LAYER_ID layer = FromProtoEnum<PCB_LAYER_ID>( aMsg.layer() );
PCB_LAYER_ID layer = FromProtoEnum<PCB_LAYER_ID>( aCtx.Request.layer() );
if( !frame()->GetBoard()->GetEnabledLayers().Contains( layer ) )
{