package remote import ( "encoding/json" "fmt" "log" "net/http" "net/url" ) type Client struct { config *Config http *http.Client session *http.Cookie } func NewClient(config *Config) (*Client, error) { return &Client{ config: config, }, nil } func (c *Client) ParseArgs() error { for i := 0; i < len(c.config.args); i++ { arg := c.config.args[i] switch arg { case "list": log.Printf("lists: %v", fmt.Sprint(c.Lists())) case "tasks": listID := c.config.args[i+1] i += 1 log.Printf("tasks: %v", fmt.Sprint(c.Tasks(List{ID: listID}))) case "new": listID := c.config.args[i+1] i += 1 taskTitle := c.config.args[i+1] i += 1 tagsCSV := c.config.args[i+1] i += 1 log.Printf("new: %v", fmt.Sprint(c.NewTask(List{ID: listID}, Task{Title: taskTitle}, tagsCSV))) case "close": taskID := c.config.args[i+1] i += 1 log.Printf("close: %v", fmt.Sprint(c.CloseTask(Task{ID: taskID}))) case "open": taskID := c.config.args[i+1] i += 1 log.Printf("open: %v", fmt.Sprint(c.OpenTask(Task{ID: taskID}))) default: log.Printf("unknown arg %q", arg) } } return nil } func (c *Client) Lists() ([]List, error) { client, err := NewHTTP(c.config.remote, c.config.password) if err != nil { return nil, err } var lists loadListsResponse if resp, err := client.Get("ajax.php?loadLists"); err != nil { return nil, err } else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil { return nil, fmt.Errorf("cannot read lists: %v", err) } return lists.Lists, nil } func (c *Client) Tasks(list List) ([]Task, error) { client, err := NewHTTP(c.config.remote, c.config.password) if err != nil { return nil, err } var tasks loadTasksResponse if resp, err := client.Get("ajax.php?loadTasks&list=" + list.ID); err != nil { return nil, err } else if err := json.NewDecoder(resp.Body).Decode(&tasks); err != nil { return nil, fmt.Errorf("cannot read tasks: %v", err) } return tasks.Tasks, nil } func (c *Client) NewTask(list List, task Task, tags string) error { log.Printf("new: %v < %v", list, task.Title) client, err := NewHTTP(c.config.remote, c.config.password) if err != nil { return err } form := url.Values{} form.Add("list", list.ID) form.Add("title", task.Title) form.Add("tag", "/"+tags+"/") var lists loadListsResponse if resp, err := client.Post("ajax.php?newTask", form.Encode()); err != nil { return err } else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil { return fmt.Errorf("cannot make task: %v", err) } log.Print(lists) return nil } func (c *Client) CloseTask(task Task) error { log.Printf("close: %v", task.ID) client, err := NewHTTP(c.config.remote, c.config.password) if err != nil { return err } form := url.Values{} form.Add("id", task.ID) form.Add("compl", "1") var lists loadListsResponse if resp, err := client.Post("ajax.php?completeTask="+task.ID, form.Encode()); err != nil { return err } else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil { return fmt.Errorf("cannot close task: %v", err) } log.Print(lists) return nil } func (c *Client) OpenTask(task Task) error { log.Printf("open: %v", task.ID) client, err := NewHTTP(c.config.remote, c.config.password) if err != nil { return err } form := url.Values{} form.Add("id", task.ID) form.Add("compl", "0") var lists loadListsResponse if resp, err := client.Post("ajax.php?completeTask="+task.ID, form.Encode()); err != nil { return err } else if err := json.NewDecoder(resp.Body).Decode(&lists); err != nil { return fmt.Errorf("cannot close task: %v", err) } log.Print(lists) return nil }