diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 118 | 
1 files changed, 85 insertions, 33 deletions
| @@ -2,58 +2,110 @@ package main  import (  	"fmt" -	"io/ioutil" -	"log"  	"os" +	"time"  	"github.com/teddywing/timetasker/timetask" -	"gopkg.in/yaml.v2" +	"gopkg.in/alecthomas/kingpin.v2"  ) -type Config struct { -	Auth struct { -		Username    string -		PasswordCmd string `yaml:"password_cmd"` -	} -	Fields   timetask.Fields -	Defaults timetask.TimeEntry -} +var VERSION string = "0.1.0"  var config Config  func main() { -	loadConfig() +	var err error -	if len(os.Args) == 1 { -		fmt.Println("Not enough arguments") -		os.Exit(1) +	// Parse command line arguments +	project_alias := kingpin.Flag( +		"project", +		"Project alias defined in config.toml.", +	). +		Short('p'). +		String() +	time_spent := kingpin.Flag("time", "Time spent working on project."). +		Short('t'). +		Default("7"). +		Float() +	date_str := kingpin.Flag("date", "Date when work was done (e.g. 2017-01-31)"). +		Short('d'). +		String() +	description := kingpin.Flag("description", "Description of work."). +		Short('m'). +		String() +	write_config_description := fmt.Sprintf( +		"Initialise a new config file template at %s", +		configFile(), +	) +	write_config := kingpin.Flag("write-config", write_config_description). +		Bool() +	list_modules := kingpin.Flag("list-modules", "List sprints with IDs").Bool() +	kingpin.Version(VERSION) +	kingpin.Parse() + +	// Error if no --project unless --write-config was passed +	if *project_alias == "" && !*write_config { +		kingpin.Fatalf("required flag --project not provided, try --help")  	} -	file_path := os.Args[len(os.Args)-1] -	file, err := ioutil.ReadFile(file_path) -	if err != nil { -		log.Println(err) +	if *write_config { +		err = maybeWriteConfig() +		kingpin.FatalIfError(err, "could not write config file") + +		os.Exit(0)  	} -	time_entries := []timetask.TimeEntry{} -	err = yaml.Unmarshal(file, &time_entries) -	if err != nil { -		log.Println(err) +	err = loadConfig() +	kingpin.FatalIfError(err, "could not load config file, try --write-config") + +	// Submit time entry +	project, ok := config.Projects[*project_alias] +	if !ok { +		kingpin.Errorf("project '%s' not found", *project_alias) +		os.Exit(1)  	} -	log.Printf("%+v", time_entries) +	var date time.Time -	// timetask.SubmitTimeEntries(config.Fields, time_entries) +	// If the date argument isn't sent, default to today +	if *date_str == "" { +		date = time.Now() +	} else { +		date, err = time.Parse("2006-01-02", *date_str) +		kingpin.FatalIfError( +			err, +			"date '%s' could not be parsed. Example: -d 2017-01-31\n", +			*date_str, +		) +	} -	timetask.GenerateWeeklyTimesheet(os.Stdout, config.Defaults) -} +	time_entry := timetask.NewTimeEntry( +		config.Profile, +		project, +		date, +		*time_spent, +		*description, +	) + +	password, err := passwordCmd(config.Auth.PasswordCmd) +	kingpin.FatalIfError(err, "password command failed") -func loadConfig() { -	config_str, err := ioutil.ReadFile("config.yml") -	config = Config{} -	err = yaml.Unmarshal(config_str, &config) -	if err != nil { -		log.Println(err) +	client, err := timetask.Login( +		config.Auth.Username, +		password, +	) +	kingpin.FatalIfError(err, "login request failed") + +	// List modules +	if *list_modules { +		modules, err := timetask.RequestModules(*client, time_entry) +		kingpin.FatalIfError(err, "could not retrieve sprints") +		fmt.Println(modules) + +		os.Exit(0)  	} + +	err = timetask.SubmitTimeEntry(*client, time_entry) +	kingpin.FatalIfError(err, "time entry submission request failed")  } | 
