google.golang.org/grpc@v1.62.1/internal/channelz/id.go (about)

     1  /*
     2   *
     3   * Copyright 2022 gRPC authors.
     4   *
     5   * Licensed under the Apache License, Version 2.0 (the "License");
     6   * you may not use this file except in compliance with the License.
     7   * You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   */
    18  
    19  package channelz
    20  
    21  import "fmt"
    22  
    23  // Identifier is an opaque identifier which uniquely identifies an entity in the
    24  // channelz database.
    25  type Identifier struct {
    26  	typ RefChannelType
    27  	id  int64
    28  	str string
    29  	pid *Identifier
    30  }
    31  
    32  // Type returns the entity type corresponding to id.
    33  func (id *Identifier) Type() RefChannelType {
    34  	return id.typ
    35  }
    36  
    37  // Int returns the integer identifier corresponding to id.
    38  func (id *Identifier) Int() int64 {
    39  	return id.id
    40  }
    41  
    42  // String returns a string representation of the entity corresponding to id.
    43  //
    44  // This includes some information about the parent as well. Examples:
    45  // Top-level channel: [Channel #channel-number]
    46  // Nested channel:    [Channel #parent-channel-number Channel #channel-number]
    47  // Sub channel:       [Channel #parent-channel SubChannel #subchannel-number]
    48  func (id *Identifier) String() string {
    49  	return id.str
    50  }
    51  
    52  // Equal returns true if other is the same as id.
    53  func (id *Identifier) Equal(other *Identifier) bool {
    54  	if (id != nil) != (other != nil) {
    55  		return false
    56  	}
    57  	if id == nil && other == nil {
    58  		return true
    59  	}
    60  	return id.typ == other.typ && id.id == other.id && id.pid == other.pid
    61  }
    62  
    63  // NewIdentifierForTesting returns a new opaque identifier to be used only for
    64  // testing purposes.
    65  func NewIdentifierForTesting(typ RefChannelType, id int64, pid *Identifier) *Identifier {
    66  	return newIdentifer(typ, id, pid)
    67  }
    68  
    69  func newIdentifer(typ RefChannelType, id int64, pid *Identifier) *Identifier {
    70  	str := fmt.Sprintf("%s #%d", typ, id)
    71  	if pid != nil {
    72  		str = fmt.Sprintf("%s %s", pid, str)
    73  	}
    74  	return &Identifier{typ: typ, id: id, str: str, pid: pid}
    75  }