/* * * Copyright 2022 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package channelz import "fmt" // Identifier is an opaque identifier which uniquely identifies an entity in the // channelz database. type Identifier struct { typ RefChannelType id int64 str string pid *Identifier } // Type returns the entity type corresponding to id. func (id *Identifier) Type() RefChannelType { return id.typ } // Int returns the integer identifier corresponding to id. func (id *Identifier) Int() int64 { return id.id } // String returns a string representation of the entity corresponding to id. // // This includes some information about the parent as well. Examples: // Top-level channel: [Channel #channel-number] // Nested channel: [Channel #parent-channel-number Channel #channel-number] // Sub channel: [Channel #parent-channel SubChannel #subchannel-number] func (id *Identifier) String() string { return id.str } // Equal returns true if other is the same as id. func (id *Identifier) Equal(other *Identifier) bool { if (id != nil) != (other != nil) { return false } if id == nil && other == nil { return true } return id.typ == other.typ && id.id == other.id && id.pid == other.pid } // NewIdentifierForTesting returns a new opaque identifier to be used only for // testing purposes. func NewIdentifierForTesting(typ RefChannelType, id int64, pid *Identifier) *Identifier { return newIdentifer(typ, id, pid) } func newIdentifer(typ RefChannelType, id int64, pid *Identifier) *Identifier { str := fmt.Sprintf("%s #%d", typ, id) if pid != nil { str = fmt.Sprintf("%s %s", pid, str) } return &Identifier{typ: typ, id: id, str: str, pid: pid} }