package cmd import ( "fmt" "log" "os" "strings" "github.com/Jaculabilis/intake/core" "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{ Use: "intake", Short: "Universal and extensible feed aggregator", Long: `intake, the universal and extensible feed aggregator`, } func Execute() { err := rootCmd.Execute() if err != nil { os.Exit(1) } } var dataPath string func init() { // Disable the automatic help command rootCmd.SetHelpCommand(&cobra.Command{Hidden: true}) // All commands need to operate on a database rootCmd.PersistentFlags().StringVarP(&dataPath, "data-dir", "d", "", "Path to the intake data directory containing the database") } // // Common logic shared by multiple commands // func getDbPath() string { if dataPath != "" { return core.DatabasePath(dataPath) } if dataDir := core.ResolveDataDir(); dataDir != "" { return core.DatabasePath(dataDir) } fmt.Println("error: no database specified") fmt.Println("One of --data-dir, INTAKE_DATA_DIR, XDG_DATA_HOME, or HOME must be defined.") os.Exit(1) return "" } // Attempt to open the specified database and exit with an error if it fails. func openDb() *core.DB { dbPath := getDbPath() db, err := core.OpenDb(dbPath) if err != nil { log.Fatalf("error: failed to open %s", dbPath) } return db } // Attempt to open and migrate the specified database and exit with an error if it fails. func openAndMigrateDb() *core.DB { db := openDb() if err := core.InitDatabase(db); err != nil { log.Fatalf("error: failed to init database: %v", err) } if err := core.MigrateDatabase(db); err != nil { log.Fatalf("error: failed to migrate database: %v", err) } return db } func getArgv(cmd *cobra.Command, args []string) []string { lenAtDash := cmd.Flags().ArgsLenAtDash() if lenAtDash == -1 { return nil } else { return args[lenAtDash:] } } // Sort "fetch" action ahead of other actions func actionSort(a string, b string) int { if a == "fetch" { return -1 } if b == "fetch" { return 1 } return strings.Compare(a, b) } func makeFormatHelpText() string { text := "Available formats:\n" for format, desc := range core.AvailableFormats { text += fmt.Sprintf(" %-13s %s\n", format, desc) } return text } func formatAs(format string) func(item core.Item) string { formatter, err := core.FormatAs(format) if err != nil { log.Fatalf("error: %v", err) } return formatter }