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 }