repo_description: GitHub’s official command line tool
repo_topics: cli git github-api-v4 golang
code: // Package keyring is a simple wrapper that adds timeouts to the zalando/go-keyring package.
  package keyring
  
  import (
  	"errors"
  	"time"
  
  	"github.com/zalando/go-keyring"
  )
  
  var ErrNotFound = errors.New("secret not found in keyring")
  
  type TimeoutError struct {
  	message string
  }
  
  func (e *TimeoutError) Error() string {
  	return e.message
  }
  
  // Set secret in keyring for user.
  func Set(service, user, secret string) error {
  	ch := make(chan error, 1)
  	go func() {
  		defer close(ch)
  		ch <- keyring.Set(service, user, secret)
  	}()
  	select {
  	case err := <-ch:
  		return err
  	case <-time.After(3 * time.Second):
  		return &TimeoutError{"timeout while trying to set secret in keyring"}
  	}
  }
  
  // Get secret from keyring given service and user name.
  func Get(service, user string) (string, error) {
  	ch := make(chan struct {
  		val string
  		err error
  	}, 1)
  	go func() {
  		defer close(ch)
  		val, err := keyring.Get(service, user)
  		ch <- struct {
  			val string
  			err error
  		}{val, err}
  	}()
  	select {
  	case res := <-ch:
  		if errors.Is(res.err, keyring.ErrNotFound) {
  			return "", ErrNotFound
  		}
  		return res.val, res.err
  	case <-time.After(3 * time.Second):
  		return "", &TimeoutError{"timeout while trying to get secret from keyring"}
  	}
  }
  
  // Delete secret from keyring.
  func Delete(service, user string) error {
  	ch := make(chan error, 1)
  	go func() {
  		defer close(ch)
  		ch <- keyring.Delete(service, user)
  	}()
  	select {
  	case err := <-ch:
  		return err
  	case <-time.After(3 * time.Second):
  		return &TimeoutError{"timeout while trying to delete secret from keyring"}
  	}
  }
  
  func MockInit() {
  	keyring.MockInit()
  }
  
  func MockInitWithError(err error) {
  	keyring.MockInitWithError(err)
  }
  