96 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
97 e.set_error_message(
"Tried to create an item in a null container" );
98 return tl::unexpected( e );
104 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
105 e.set_error_message( fmt::format(
"Tried to create a pin in {}, which is not a symbol",
107 return tl::unexpected( e );
112 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
113 e.set_error_message( fmt::format(
"Tried to create a symbol in {}, which is not a "
116 return tl::unexpected( e );
124 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
125 e.set_error_message( fmt::format(
"Tried to create an item of type {}, which is unhandled",
126 magic_enum::enum_name( aType ) ) );
127 return tl::unexpected( e );
135 const std::string& aClientName,
136 const types::ItemHeader &aHeader,
137 const google::protobuf::RepeatedPtrField<google::protobuf::Any>& aItems,
138 std::function<
void( ItemStatus, google::protobuf::Any )> aItemHandler )
144 if( !containerResult && containerResult.error().status() == ApiStatusCode::AS_UNHANDLED )
147 e.set_status( ApiStatusCode::AS_UNHANDLED );
148 return tl::unexpected( e );
150 else if( !containerResult )
152 e.CopyFrom( containerResult.error() );
153 return tl::unexpected( e );
159 std::map<KIID, EDA_ITEM*> itemUuidMap;
161 std::for_each( screenItems.
begin(), screenItems.
end(),
164 itemUuidMap[aItem->m_Uuid] = aItem;
169 if( containerResult->has_value() )
171 const KIID& containerId = **containerResult;
173 if( itemUuidMap.count( containerId ) )
175 container = itemUuidMap.at( containerId );
179 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
180 e.set_error_message( fmt::format(
181 "The requested container {} is not a valid schematic item container",
183 return tl::unexpected( e );
188 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
189 e.set_error_message( fmt::format(
190 "The requested container {} does not exist in this document",
192 return tl::unexpected( e );
198 for(
const google::protobuf::Any& anyItem : aItems )
205 status.set_code( ItemStatusCode::ISC_INVALID_TYPE );
206 status.set_error_message( fmt::format(
"Could not decode a valid type from {}",
207 anyItem.type_url() ) );
208 aItemHandler( status, anyItem );
215 if( !creationResult )
217 status.set_code( ItemStatusCode::ISC_INVALID_TYPE );
218 status.set_error_message( creationResult.error().error_message() );
219 aItemHandler( status, anyItem );
223 std::unique_ptr<EDA_ITEM> item( std::move( *creationResult ) );
225 if( !item->Deserialize( anyItem ) )
227 e.set_status( ApiStatusCode::AS_BAD_REQUEST );
228 e.set_error_message( fmt::format(
"could not unpack {} from request",
229 item->GetClass().ToStdString() ) );
230 return tl::unexpected( e );
233 if( aCreate && itemUuidMap.count( item->m_Uuid ) )
235 status.set_code( ItemStatusCode::ISC_EXISTING );
236 status.set_error_message( fmt::format(
"an item with UUID {} already exists",
237 item->m_Uuid.AsStdString() ) );
238 aItemHandler( status, anyItem );
241 else if( !aCreate && !itemUuidMap.count( item->m_Uuid ) )
243 status.set_code( ItemStatusCode::ISC_NONEXISTENT );
244 status.set_error_message( fmt::format(
"an item with UUID {} does not exist",
245 item->m_Uuid.AsStdString() ) );
246 aItemHandler( status, anyItem );
250 status.set_code( ItemStatusCode::ISC_OK );
251 google::protobuf::Any newItem;
255 item->Serialize( newItem );
256 commit->
Add( item.release(), screen );
263 EDA_ITEM* edaItem = itemUuidMap[item->m_Uuid];
267 schItem->SwapItemData(
static_cast<SCH_ITEM*
>( item.get() ) );
268 schItem->Serialize( newItem );
269 commit->
Modify( schItem, screen );
280 aItemHandler( status, newItem );
284 return ItemRequestStatus::IRS_OK;
RequestMessageType Request