public static bool TryParse()

in Microsoft.Azure.Cosmos/src/Pagination/ResourceIdentifier.cs [223:437]


        public static bool TryParse(string id, out ResourceIdentifier rid)
        {
            try
            {
                uint offer = 0;
                uint database = 0;
                uint documentCollection = 0;
                ulong storedProcedure = 0;
                ulong trigger = 0;
                ulong userDefinedFunction = 0;
                ulong conflict = 0;
                ulong document = 0;
                ulong partitionKeyRange = 0;
                uint user = 0;
                uint clientEncryptionKey = 0;
                ulong permission = 0;
                uint attachment = 0;
                ulong schema = 0;
                uint userDefinedType = 0;
                ulong snapshot = 0;
                ulong roleAssignment = 0;
                ulong roleDefinition = 0;

                if (string.IsNullOrEmpty(id))
                {
                    rid = default;
                    return false;
                }

                if (id.Length % 4 != 0)
                {
                    // our resourceId string is always padded
                    rid = default;
                    return false;
                }

                if (ResourceIdentifier.Verify(id, out byte[] buffer) == false)
                {
                    rid = default;
                    return false;
                }

                if (buffer.Length % 4 != 0 &&
                    buffer.Length != ResourceIdentifier.OfferIdLength &&
                    buffer.Length != ResourceIdentifier.SnapshotIdLength &&
                    buffer.Length != ResourceIdentifier.RbacResourceIdLength)
                {
                    rid = default;
                    return false;
                }

                if (buffer.Length == ResourceIdentifier.OfferIdLength)
                {
                    offer = (uint)ResourceIdentifier.ToUnsignedLong(buffer);
                    rid = new ResourceIdentifier(offer: offer);
                    return true;
                }

                if (buffer.Length == ResourceIdentifier.SnapshotIdLength)
                {
                    snapshot = ResourceIdentifier.ToUnsignedLong(buffer);
                    rid = new ResourceIdentifier(snapshot: snapshot);
                    return true;
                }

                if (buffer.Length == ResourceIdentifier.RbacResourceIdLength)
                {
                    byte rbacResourceType = buffer[ResourceIdentifier.RbacResourceIdLength - 1];
                    ulong rbacResourceId = ResourceIdentifier.ToUnsignedLong(buffer, 4);

                    switch ((RbacResourceType)rbacResourceType)
                    {
                        case RbacResourceType.RbacResourceType_RoleDefinition:
                            roleDefinition = rbacResourceId;
                            rid = new ResourceIdentifier(
                                offer, database, documentCollection, storedProcedure,
                                trigger, userDefinedFunction, conflict, document,
                                partitionKeyRange, user, clientEncryptionKey,
                                userDefinedType, permission, attachment, schema,
                                snapshot, roleAssignment, roleDefinition);
                            return true;

                        case RbacResourceType.RbacResourceType_RoleAssignment:
                            roleAssignment = rbacResourceId;
                            rid = new ResourceIdentifier(
                                offer, database, documentCollection, storedProcedure,
                                trigger, userDefinedFunction, conflict, document,
                                partitionKeyRange, user, clientEncryptionKey,
                                userDefinedType, permission, attachment, schema,
                                snapshot, roleAssignment, roleDefinition);
                            return true;

                        default:
                            rid = default;
                            return false;
                    }
                }

                if (buffer.Length >= 4)
                    database = BitConverter.ToUInt32(buffer, 0);

                if (buffer.Length >= 8)
                {
                    byte[] temp = new byte[4];
                    ResourceIdentifier.BlockCopy(buffer, 4, temp, 0, 4);

                    bool isCollection = (temp[0] & (128)) > 0;

                    if (isCollection)
                    {
                        documentCollection = BitConverter.ToUInt32(temp, 0);

                        if (buffer.Length >= 16)
                        {
                            byte[] subCollRes = new byte[8];
                            ResourceIdentifier.BlockCopy(buffer, 8, subCollRes, 0, 8);

                            UInt64 subCollectionResource = BitConverter.ToUInt64(buffer, 8);
                            if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Document)
                            {
                                document = subCollectionResource;

                                if (buffer.Length == 20)
                                {
                                    attachment = BitConverter.ToUInt32(buffer, 16);
                                }
                            }
                            else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.StoredProcedure)
                            {
                                storedProcedure = subCollectionResource;
                            }
                            else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Trigger)
                            {
                                trigger = subCollectionResource;
                            }
                            else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.UserDefinedFunction)
                            {
                                userDefinedFunction = subCollectionResource;
                            }
                            else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Conflict)
                            {
                                conflict = subCollectionResource;
                            }
                            else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.PartitionKeyRange)
                            {
                                partitionKeyRange = subCollectionResource;
                            }
                            else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Schema)
                            {
                                schema = subCollectionResource;
                            }
                            else
                            {
                                rid = default;
                                return false;
                            }
                        }
                        else if (buffer.Length != 8)
                        {
                            rid = default;
                            return false;
                        }
                    }
                    else
                    {
                        user = BitConverter.ToUInt32(temp, 0);

                        if (buffer.Length == 16)
                        {
                            if (user > 0)
                            {
                                permission = BitConverter.ToUInt64(buffer, 8);
                            }
                            else
                            {
                                uint exDatabaseChildResourceId = BitConverter.ToUInt32(buffer, 8);
                                ExtendedDatabaseChildResourceType exDatabaseChildResType = (ExtendedDatabaseChildResourceType)BitConverter.ToUInt32(buffer, 12);

                                if (exDatabaseChildResType == ExtendedDatabaseChildResourceType.UserDefinedType)
                                {
                                    userDefinedType = exDatabaseChildResourceId;
                                }
                                else if (exDatabaseChildResType == ExtendedDatabaseChildResourceType.ClientEncryptionKey)
                                {
                                    clientEncryptionKey = exDatabaseChildResourceId;
                                }
                                else
                                {
                                    rid = default;
                                    return false;
                                }
                            }
                        }
                        else if (buffer.Length != 8)
                        {
                            rid = default;
                            return false;
                        }
                    }
                }

                rid = new ResourceIdentifier(
                    offer, database, documentCollection, storedProcedure,
                    trigger, userDefinedFunction, conflict, document,
                    partitionKeyRange, user, clientEncryptionKey,
                    userDefinedType, permission, attachment, schema,
                    snapshot, roleAssignment, roleDefinition);
                return true;
            }
            catch (Exception)
            {
                rid = default;
                return false;
            }
        }