186 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
	"net/url"
 | 
						|
	"os"
 | 
						|
 | 
						|
	userConfig "github.com/br0xen/user-config"
 | 
						|
)
 | 
						|
 | 
						|
const AppName = "mark"
 | 
						|
const DefDBName = AppName + ".db"
 | 
						|
 | 
						|
var mdb *MarkDB
 | 
						|
var cfg *userConfig.Config
 | 
						|
 | 
						|
// Valid command line options
 | 
						|
var validFlags []cliFlag
 | 
						|
 | 
						|
const (
 | 
						|
	OpSearch = iota
 | 
						|
	OpAdd
 | 
						|
	OpUpdate
 | 
						|
	OpDelete
 | 
						|
	OpError
 | 
						|
)
 | 
						|
 | 
						|
func main() {
 | 
						|
	err := initialize()
 | 
						|
	if err != nil {
 | 
						|
		fmt.Println(err)
 | 
						|
		os.Exit(1)
 | 
						|
	}
 | 
						|
 | 
						|
	// mk is the Bookmark that we're adding/editing
 | 
						|
	var mk *Bookmark
 | 
						|
 | 
						|
	parms := os.Args
 | 
						|
	if len(parms) > 1 {
 | 
						|
		// Trim the program name
 | 
						|
		parms = parms[1:]
 | 
						|
		// Parse all of the parameters
 | 
						|
		for i := range parms {
 | 
						|
			switch parms[i] {
 | 
						|
			case "-h":
 | 
						|
				printUsage()
 | 
						|
				os.Exit(0)
 | 
						|
			case "-a":
 | 
						|
				// Adding a new bookmark
 | 
						|
				mk, err = doOperation(OpAdd, parms[i+1:])
 | 
						|
				assertError(err)
 | 
						|
			case "-u":
 | 
						|
				// Updating an existing bookmark
 | 
						|
				mk, err = doOperation(OpUpdate, parms[i+1:])
 | 
						|
				assertError(err)
 | 
						|
			case "-d":
 | 
						|
				// Delete an existing bookmark
 | 
						|
				mk, err = doOperation(OpDelete, parms[i+1:])
 | 
						|
				assertError(err)
 | 
						|
			}
 | 
						|
		}
 | 
						|
		_ = mk
 | 
						|
	} else {
 | 
						|
		// Enter cui mode
 | 
						|
		mainCui()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// doOperation performs the requested operation
 | 
						|
//		which is the constant that specifies the operation we're performing
 | 
						|
//		parms is the slice of all remaining parameters passed on the cli
 | 
						|
func doOperation(which int, parms []string) (*Bookmark, error) {
 | 
						|
	var mk *Bookmark
 | 
						|
 | 
						|
	var nxt string
 | 
						|
	if len(parms) > 0 {
 | 
						|
		nxt = parms[0]
 | 
						|
	}
 | 
						|
	switch which {
 | 
						|
	case OpAdd:
 | 
						|
		// nxt should be the url, make sure it's valid
 | 
						|
		fmt.Println("Adding Bookmark")
 | 
						|
		url, err := url.Parse(nxt)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		mk = NewBookmark(url)
 | 
						|
		if err = mk.DownloadDetail(); err != nil {
 | 
						|
			fmt.Println(err)
 | 
						|
		}
 | 
						|
		fmt.Println(mk.Desc)
 | 
						|
	case OpUpdate:
 | 
						|
 | 
						|
	case OpDelete:
 | 
						|
 | 
						|
	case OpSearch:
 | 
						|
 | 
						|
	default:
 | 
						|
		return nil, errors.New("Invalid operation")
 | 
						|
	}
 | 
						|
	return mk, nil
 | 
						|
}
 | 
						|
 | 
						|
// initialize sets up the application for general use
 | 
						|
func initialize() error {
 | 
						|
	var err error
 | 
						|
	// Build the list of valid command line options
 | 
						|
	addValidFlag("-h", "help", []string{"Print the usage (this message)"})
 | 
						|
	addValidFlag("-a", "add", []string{"Add a new bookmark"})
 | 
						|
	addValidFlag("-u", "update", []string{"Update an existing bookmark"})
 | 
						|
	addValidFlag("-d", "delete", []string{"Delete an existing bookmark"})
 | 
						|
	addValidFlag("-s", "search", []string{"Search for a bookmark"})
 | 
						|
	addValidFlag("-n", "name (optional)", []string{
 | 
						|
		"When adding/updating, specify the name you wish to give a bookmark.",
 | 
						|
		"When searching, specifiy the name of the bookmark(s) you're searching for.",
 | 
						|
	})
 | 
						|
	addValidFlag("-t", "tag", []string{
 | 
						|
		"Comma delimited tags",
 | 
						|
		"When adding/updating, specify the tags you wish to give a bookmark.",
 | 
						|
		"When searching, specifiy the name of the tags you're searching for.",
 | 
						|
	})
 | 
						|
 | 
						|
	// Load the config
 | 
						|
	cfg, err = userConfig.NewConfig(AppName)
 | 
						|
	if err != nil {
 | 
						|
		fmt.Println(err.Error())
 | 
						|
		fmt.Println("Creating new config")
 | 
						|
		cfg.Save()
 | 
						|
	}
 | 
						|
	// if dbdir isn't set, set it to the config directory
 | 
						|
	if cfg.Get("dbdir") == "" {
 | 
						|
		cfg.Set("dbdir", cfg.GetConfigPath()+"/")
 | 
						|
	}
 | 
						|
	// if dbname isn't set, set it to the default db name
 | 
						|
	if cfg.Get("dbname") == "" {
 | 
						|
		cfg.Set("dbname", DefDBName)
 | 
						|
	}
 | 
						|
	// Get a reference to the database
 | 
						|
	if mdb, err = NewDatabase(cfg.Get("dbdir"), cfg.Get("dbname")); err != nil {
 | 
						|
		fmt.Println("Error loading the database")
 | 
						|
		os.Exit(1)
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Adds an option to the "validFlags" slice
 | 
						|
func addValidFlag(flag, name string, desc []string) {
 | 
						|
	validFlags = append(validFlags, cliFlag{
 | 
						|
		Flag:        flag,
 | 
						|
		Name:        name,
 | 
						|
		Description: desc,
 | 
						|
	})
 | 
						|
}
 | 
						|
 | 
						|
func printUsage() {
 | 
						|
	help := []string{
 | 
						|
		"mark is a tool for keeping your bookmarks organized",
 | 
						|
		"",
 | 
						|
		"Usage: ",
 | 
						|
		"\tmark [operation] [optional flags]",
 | 
						|
		"",
 | 
						|
		"If no arguments are given, we enter gui mode",
 | 
						|
		"If no 'operation' arguments are given (-a, -u, -d, -s) search is assumed",
 | 
						|
		"",
 | 
						|
		"Valid arguments are:",
 | 
						|
		"",
 | 
						|
	}
 | 
						|
	for _, ln := range help {
 | 
						|
		fmt.Println(ln)
 | 
						|
	}
 | 
						|
	for _, v := range validFlags {
 | 
						|
		fmt.Println("\t", v.Flag, "\t", v.Name)
 | 
						|
		for _, hv := range v.Description {
 | 
						|
			fmt.Println("\t\t\t", hv)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func assertError(err error) {
 | 
						|
	if err != nil {
 | 
						|
		fmt.Println(err.Error())
 | 
						|
		os.Exit(1)
 | 
						|
	}
 | 
						|
}
 |