github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/actor/pluginaction/plugin_repository.go (about)

     1  package pluginaction
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/liamawhite/cli-with-i18n/util/configv3"
     8  )
     9  
    10  type RepositoryNotRegisteredError struct {
    11  	Name string
    12  }
    13  
    14  func (e RepositoryNotRegisteredError) Error() string {
    15  	return fmt.Sprintf("Plugin repository %s not found", e.Name)
    16  }
    17  
    18  type RepositoryAlreadyExistsError struct {
    19  	Name string
    20  	URL  string
    21  }
    22  
    23  func (e RepositoryAlreadyExistsError) Error() string {
    24  	return fmt.Sprintf("%s already registered as %s.", e.URL, e.Name)
    25  }
    26  
    27  type RepositoryNameTakenError struct {
    28  	Name string
    29  }
    30  
    31  func (e RepositoryNameTakenError) Error() string {
    32  	return fmt.Sprintf("Plugin repo named '%s' already exists, please use another name.", e.Name)
    33  }
    34  
    35  type AddPluginRepositoryError struct {
    36  	Name    string
    37  	URL     string
    38  	Message string
    39  }
    40  
    41  func (e AddPluginRepositoryError) Error() string {
    42  	return fmt.Sprintf("Could not add repository '%s' from %s: %s", e.Name, e.URL, e.Message)
    43  }
    44  
    45  func (actor Actor) AddPluginRepository(repoName string, repoURL string) error {
    46  	normalizedURL, err := normalizeURLPath(repoURL)
    47  	if err != nil {
    48  		return AddPluginRepositoryError{
    49  			Name:    repoName,
    50  			URL:     repoURL,
    51  			Message: err.Error(),
    52  		}
    53  	}
    54  
    55  	repoNameLowerCased := strings.ToLower(repoName)
    56  	for _, repository := range actor.config.PluginRepositories() {
    57  		existingRepoNameLowerCased := strings.ToLower(repository.Name)
    58  		switch {
    59  		case repoNameLowerCased == existingRepoNameLowerCased && normalizedURL == repository.URL:
    60  			return RepositoryAlreadyExistsError{Name: repository.Name, URL: repository.URL}
    61  		case repoNameLowerCased == existingRepoNameLowerCased && normalizedURL != repository.URL:
    62  			return RepositoryNameTakenError{Name: repository.Name}
    63  		case repoNameLowerCased != existingRepoNameLowerCased:
    64  			continue
    65  		}
    66  	}
    67  
    68  	_, err = actor.client.GetPluginRepository(normalizedURL)
    69  	if err != nil {
    70  		return AddPluginRepositoryError{
    71  			Name:    repoName,
    72  			URL:     normalizedURL,
    73  			Message: err.Error(),
    74  		}
    75  	}
    76  
    77  	actor.config.AddPluginRepository(repoName, normalizedURL)
    78  	return nil
    79  }
    80  
    81  func (actor Actor) GetPluginRepository(repositoryName string) (configv3.PluginRepository, error) {
    82  	repositoryNameLowered := strings.ToLower(repositoryName)
    83  
    84  	for _, repository := range actor.config.PluginRepositories() {
    85  		if repositoryNameLowered == strings.ToLower(repository.Name) {
    86  			return repository, nil
    87  		}
    88  	}
    89  	return configv3.PluginRepository{}, RepositoryNotRegisteredError{Name: repositoryName}
    90  }
    91  
    92  func (actor Actor) IsPluginRepositoryRegistered(repositoryName string) bool {
    93  	for _, repository := range actor.config.PluginRepositories() {
    94  		if repositoryName == repository.Name {
    95  			return true
    96  		}
    97  	}
    98  	return false
    99  }
   100  
   101  func normalizeURLPath(rawURL string) (string, error) {
   102  	prefix := ""
   103  	if !strings.Contains(rawURL, "://") {
   104  		prefix = "https://"
   105  	}
   106  
   107  	normalizedURL := fmt.Sprintf("%s%s", prefix, rawURL)
   108  
   109  	return strings.TrimSuffix(normalizedURL, "/"), nil
   110  }