github.com/iotexproject/iotex-core@v1.14.1-rc1/ioctl/newcmd/alias/aliasimport.go (about)

     1  // Copyright (c) 2022 IoTeX Foundation
     2  // This source code is provided 'as is' and no warranties are given as to title or non-infringement, merchantability
     3  // or fitness for purpose and, to the extent permitted by law, all liability for your use of the code is disclaimed.
     4  // This source code is governed by Apache License 2.0 that can be found in the LICENSE file.
     5  
     6  package alias
     7  
     8  import (
     9  	"encoding/json"
    10  	"fmt"
    11  
    12  	"github.com/pkg/errors"
    13  	"github.com/spf13/cobra"
    14  	"gopkg.in/yaml.v2"
    15  
    16  	"github.com/iotexproject/iotex-core/ioctl"
    17  	"github.com/iotexproject/iotex-core/ioctl/config"
    18  )
    19  
    20  // Multi-language support
    21  var (
    22  	_importShorts = map[config.Language]string{
    23  		config.English: "Import aliases",
    24  		config.Chinese: "导入别名",
    25  	}
    26  	_importUses = map[config.Language]string{
    27  		config.English: "import 'DATA'",
    28  		config.Chinese: "import '数据'",
    29  	}
    30  	_flagImportFormatUsages = map[config.Language]string{
    31  		config.English: "set format: json/yaml",
    32  		config.Chinese: "设置格式:json/yaml",
    33  	}
    34  	_flagForceImportUsages = map[config.Language]string{
    35  		config.English: "override existing aliases",
    36  		config.Chinese: "覆盖现有别名",
    37  	}
    38  	_failToWriteToConfigFile = map[config.Language]string{
    39  		config.English: "Failed to write to config file.",
    40  		config.Chinese: "写入配置文件失败",
    41  	}
    42  )
    43  
    44  type importMessage struct {
    45  	ImportedNumber int     `json:"importedNumber"`
    46  	TotalNumber    int     `json:"totalNumber"`
    47  	Imported       []alias `json:"imported"`
    48  	Unimported     []alias `json:"unimported"`
    49  }
    50  
    51  // NewAliasImport represents the alias import command
    52  func NewAliasImport(c ioctl.Client) *cobra.Command {
    53  	var (
    54  		format      string
    55  		forceImport bool
    56  	)
    57  
    58  	use, _ := c.SelectTranslation(_importUses)
    59  	short, _ := c.SelectTranslation(_importShorts)
    60  	flagImportFormatUsage, _ := c.SelectTranslation(_flagImportFormatUsages)
    61  	flagForceImportUsage, _ := c.SelectTranslation(_flagForceImportUsages)
    62  	failToWriteToConfigFile, _ := c.SelectTranslation(_failToWriteToConfigFile)
    63  
    64  	ec := &cobra.Command{
    65  		Use:   use,
    66  		Short: short,
    67  		Args:  cobra.ExactArgs(1),
    68  		RunE: func(cmd *cobra.Command, args []string) error {
    69  			cmd.SilenceUsage = true
    70  			var importedAliases aliases
    71  
    72  			switch format {
    73  			case "json":
    74  				if err := json.Unmarshal([]byte(args[0]), &importedAliases); err != nil {
    75  					return errors.Wrap(err, "failed to unmarshal imported aliases")
    76  				}
    77  			case "yaml":
    78  				if err := yaml.Unmarshal([]byte(args[0]), &importedAliases); err != nil {
    79  					return errors.Wrap(err, "failed to unmarshal imported aliases")
    80  				}
    81  			default:
    82  				return errors.New(fmt.Sprintf("invalid flag%s", format))
    83  			}
    84  
    85  			message := importMessage{TotalNumber: len(importedAliases.Aliases), ImportedNumber: 0}
    86  			for _, importedAlias := range importedAliases.Aliases {
    87  				if !forceImport && c.Config().Aliases[importedAlias.Name] != "" {
    88  					message.Unimported = append(message.Unimported, importedAlias)
    89  					continue
    90  				}
    91  				c.SetAlias(args[0], importedAlias.Address)
    92  				message.Imported = append(message.Imported, importedAlias)
    93  				message.ImportedNumber++
    94  			}
    95  			if err := c.WriteConfig(); err != nil {
    96  				return errors.Wrapf(err, failToWriteToConfigFile)
    97  			}
    98  
    99  			line := fmt.Sprintf("%d/%d aliases imported\nExisted aliases:", message.ImportedNumber, message.TotalNumber)
   100  			for _, alias := range message.Unimported {
   101  				line += fmt.Sprint(" " + alias.Name)
   102  			}
   103  			cmd.Println(line)
   104  			return nil
   105  		},
   106  	}
   107  
   108  	ec.Flags().StringVarP(&format,
   109  		"format=", "f", "json", flagImportFormatUsage)
   110  	ec.Flags().BoolVarP(&forceImport,
   111  		"force-import", "F", false, flagForceImportUsage)
   112  
   113  	return ec
   114  }