private bool TryFetchNode(TransportNodeIdInterop nodeIdInterop, out TransportNode node)
        {
            int incidentDirectedEdgeCount = NativeTransportApi_GetIncidentDirectedEdgeCountForNode(NativePluginRunner.API, nodeIdInterop);

            if (incidentDirectedEdgeCount < 0)
            {
                node = TransportNode.MakeEmpty();
                return(false);
            }

            var incidentDirectedEdgeIdInteropBuffer         = new TransportDirectedEdgeIdInterop[incidentDirectedEdgeCount];
            var incidentDirectedEdgeIdInteropBufferGCHandle = GCHandle.Alloc(incidentDirectedEdgeIdInteropBuffer, GCHandleType.Pinned);
            var incidentDirectedEdgeIdInteropPtr            = incidentDirectedEdgeIdInteropBufferGCHandle.AddrOfPinnedObject();

            var nodeInterop = new TransportNodeInterop()
            {
                Id = nodeIdInterop,
                IncidentDirectedEdgeIdsSize = incidentDirectedEdgeCount,
                IncidentDirectedEdgeIds     = incidentDirectedEdgeIdInteropPtr
            };

            bool success = NativeTransportApi_TryGetNode(NativePluginRunner.API, ref nodeInterop);

            if (!success)
            {
                node = TransportNode.MakeEmpty();
                return(false);
            }

            var incidedDirectedEdgeIds = incidentDirectedEdgeIdInteropBuffer.Select(_x => _x.FromInterop()).ToList();

            node = new TransportNode(
                nodeInterop.Id.FromInterop(),
                nodeInterop.Point,
                incidedDirectedEdgeIds
                );

            incidentDirectedEdgeIdInteropBufferGCHandle.Free();

            return(true);
        }
 private static extern bool NativeTransportApi_TryGetNode(IntPtr ptr, ref TransportNodeInterop nodeInterop);