github.com/searKing/golang/go@v1.2.117/net/resolver/register.go (about)

     1  // Copyright 2021 The searKing Author. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package resolver
     6  
     7  import (
     8  	"sort"
     9  	"sync"
    10  )
    11  
    12  var (
    13  	resolversMu sync.RWMutex
    14  	resolvers   = make(map[string]Builder)
    15  	// defaultScheme is the default scheme to use.
    16  	defaultScheme = "passthrough"
    17  )
    18  
    19  // Register makes a database driver available by the provided name.
    20  // If Register is called twice with the same name or if driver is nil,
    21  // it panics.
    22  func Register(driver Builder) {
    23  	resolversMu.Lock()
    24  	defer resolversMu.Unlock()
    25  	if driver == nil {
    26  		panic("resolver: Register driver is nil")
    27  	}
    28  	if _, dup := resolvers[driver.Scheme()]; dup {
    29  		panic("resolver: Register called twice for driver " + driver.Scheme())
    30  	}
    31  	resolvers[driver.Scheme()] = driver
    32  }
    33  
    34  // Get returns the resolver builder registered with the given scheme.
    35  //
    36  // If no builder is register with the scheme, nil will be returned.
    37  func Get(scheme string) Builder {
    38  	resolversMu.Lock()
    39  	defer resolversMu.Unlock()
    40  	if b, ok := resolvers[scheme]; ok {
    41  		return b
    42  	}
    43  	return nil
    44  }
    45  
    46  // SetDefaultScheme sets the default scheme that will be used. The default
    47  // default scheme is "passthrough".
    48  //
    49  // NOTE: this function must only be called during initialization time (i.e. in
    50  // an init() function), and is not thread-safe. The scheme set last overrides
    51  // previously set values.
    52  func SetDefaultScheme(scheme string) {
    53  	defaultScheme = scheme
    54  }
    55  
    56  // GetDefaultScheme gets the default scheme that will be used.
    57  func GetDefaultScheme() string {
    58  	return defaultScheme
    59  }
    60  
    61  func unregisterAllDrivers() {
    62  	resolversMu.Lock()
    63  	defer resolversMu.Unlock()
    64  	// For tests.
    65  	resolvers = make(map[string]Builder)
    66  }
    67  
    68  // Resolvers returns a sorted list of the names of the registered resolvers.
    69  func Resolvers() []string {
    70  	resolversMu.RLock()
    71  	defer resolversMu.RUnlock()
    72  	list := make([]string, 0, len(resolvers))
    73  	for name := range resolvers {
    74  		list = append(list, name)
    75  	}
    76  	sort.Strings(list)
    77  	return list
    78  }