github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/settings/settings.go (about)

     1  package settings
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	drycc "github.com/drycc/controller-sdk-go"
    10  	"github.com/drycc/workflow-cli/version"
    11  )
    12  
    13  // DefaultResponseLimit is the default number of responses to return on requests that can
    14  // be limited.
    15  const DefaultResponseLimit = 100
    16  
    17  // UserAgent is the user agent used by the CLI
    18  var UserAgent = "Drycc Client " + version.Version
    19  
    20  type settingsFile struct {
    21  	Username   string `json:"username"`
    22  	VerifySSL  bool   `json:"ssl_verify"`
    23  	Controller string `json:"controller"`
    24  	Token      string `json:"token"`
    25  	Limit      int    `json:"response_limit"`
    26  }
    27  
    28  // Settings is the settings object created from the settings file.
    29  type Settings struct {
    30  	Username string
    31  	Limit    int
    32  	Client   *drycc.Client
    33  }
    34  
    35  // Load loads a new client from a settings file.
    36  func Load(cf string) (*Settings, error) {
    37  	filename := locateSettingsFile(cf)
    38  
    39  	if _, err := os.Stat(filename); err != nil {
    40  		if os.IsNotExist(err) {
    41  			return nil, fmt.Errorf(`client configuration file not found at: %s
    42  Are you logged in? Use 'drycc login' or 'drycc register' to get started`, filename)
    43  		}
    44  
    45  		return nil, err
    46  	}
    47  
    48  	contents, err := os.ReadFile(filename)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  
    53  	sF := settingsFile{}
    54  	if err = json.Unmarshal(contents, &sF); err != nil {
    55  		return nil, err
    56  	}
    57  
    58  	c, err := drycc.New(sF.VerifySSL, sF.Controller, sF.Token)
    59  
    60  	if err != nil {
    61  		return nil, err
    62  	}
    63  
    64  	// Set a custom user agent
    65  	c.UserAgent = UserAgent
    66  
    67  	settings := Settings{}
    68  	settings.Username = sF.Username
    69  	settings.Client = c
    70  
    71  	// If users have defined a custom response limit, respect it.
    72  	if sF.Limit > 0 {
    73  		settings.Limit = sF.Limit
    74  	} else {
    75  		settings.Limit = DefaultResponseLimit
    76  	}
    77  
    78  	return &settings, nil
    79  }
    80  
    81  // Save settings to a file
    82  func (s *Settings) Save(cf string) (string, error) {
    83  	settings := settingsFile{Username: s.Username, VerifySSL: s.Client.VerifySSL,
    84  		Controller: s.Client.ControllerURL.String(), Token: s.Client.Token, Limit: s.Limit}
    85  
    86  	settingsContents, err := json.Marshal(settings)
    87  
    88  	if err != nil {
    89  		return "", err
    90  	}
    91  
    92  	if err = os.MkdirAll(filepath.Join(FindHome(), "/.drycc/"), 0700); err != nil {
    93  		return "", err
    94  	}
    95  
    96  	filename := locateSettingsFile(cf)
    97  
    98  	return filename, os.WriteFile(filename, settingsContents, 0600)
    99  }
   100  
   101  // Delete user's settings file.
   102  func Delete(cf string) error {
   103  	filename := locateSettingsFile(cf)
   104  
   105  	if _, err := os.Stat(filename); err != nil {
   106  		if os.IsNotExist(err) {
   107  			return nil
   108  		}
   109  
   110  		return err
   111  	}
   112  
   113  	return os.Remove(filename)
   114  }