package remote import ( "encoding/json" "fmt" "log" "net/http" "net/url" ) type Client struct { config *Config http *http.Client } 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 fromString(arg) { case LISTS: 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 OPEN: taskID := c.config.args[i+1] i += 1 log.Printf("open: %v", fmt.Sprint(c.OpenTask(Task{ID: taskID}))) case CLOSE: taskID := c.config.args[i+1] i += 1 log.Printf("close: %v", fmt.Sprint(c.CloseTask(Task{ID: taskID}))) default: log.Printf("unknown arg %q", arg) } } return nil } func (c *Client) Lists() (Lists, 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.Lists), nil } func (c *Client) Tasks(list List) (Tasks, 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.Tasks), nil } func (c *Client) NewTask(list List, task Task, tags string) error { 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) } else if resp.StatusCode != http.StatusOK { return fmt.Errorf("non 200 status on new task: %v", resp.StatusCode) } return nil } func (c *Client) CloseTask(task Task) error { 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) } else if resp.StatusCode != http.StatusOK { return fmt.Errorf("non 200 status on close task: %v", resp.StatusCode) } return nil } func (c *Client) OpenTask(task Task) error { 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) } else if resp.StatusCode != http.StatusOK { return fmt.Errorf("non 200 status on open task: %v", resp.StatusCode) } return nil }