Commit Diff


commit - 7583dd64601bcc2973ff355bf18e4c09f471245e
commit + 5b8260a55717a51bd99ac6e148cd9bf179561126
blob - df1f9d043def3d6b98d774a67bec68a14dbc6267
blob + d12434921090a07f23a8ab1eec3054d934401d8a
--- client.go
+++ client.go
@@ -3,10 +3,8 @@ package mailmux
 import (
 	"bytes"
 	"encoding/json"
-	"errors"
 	"fmt"
 	"net/http"
-	"net/url"
 )
 
 const apiurl = "https://mailmux.net/v1/aliases"
@@ -15,8 +13,8 @@ const jsonContentType = "application/json"
 
 type Client struct {
 	*http.Client
-	addr string
-	user string
+	addr  string
+	user  string
 	token string
 }
 
@@ -26,7 +24,7 @@ func Dial(uri, user, token string) *Client {
 
 func (c *Client) Register(username, password string) error {
 	mcall := &Mcall{
-		Type: Tregister,
+		Type:     Tregister,
 		Username: username,
 		Password: password,
 	}
@@ -35,7 +33,7 @@ func (c *Client) Register(username, password string) e
 	if err := json.NewEncoder(body).Encode(mcall); err != nil {
 		return fmt.Errorf("register %s: %v", username, err)
 	}
-	resp, err := c.Post(c.addr + "/register", jsonContentType, body)
+	resp, err := c.Post(c.addr+"/register", jsonContentType, body)
 	if err != nil {
 		return fmt.Errorf("register %s: %v", username, err)
 	}
@@ -52,34 +50,53 @@ func (c *Client) Register(username, password string) e
 }
 
 func (c *Client) NewAlias() (Alias, error) {
-	v := url.Values{}
-	v.Add("username", c.user)
-	v.Add("token", c.token)
-	resp, err := http.PostForm(c.addr + "/aliases", v)
+	mcall := &Mcall{
+		Type:     Tnew,
+		Username: c.user,
+		Password: c.token,
+	}
+	buf := &bytes.Buffer{}
+	if err := json.NewEncoder(buf).Encode(mcall); err != nil {
+		return Alias{}, fmt.Errorf("new alias: %w", err)
+	}
+	resp, err := http.Post(c.addr+"/aliases", jsonContentType, buf)
 	if err != nil {
-		return Alias{}, err
+		return Alias{}, fmt.Errorf("new alias: %w", err)
 	}
+
 	defer resp.Body.Close()
-	if resp.StatusCode != http.StatusOK {
-		return Alias{}, errors.New(resp.Status)
+	rmsg, err := ParseMcall(resp.Body)
+	if err != nil {
+		return Alias{}, fmt.Errorf("new alias: parse response: %w", err)
 	}
-
-	return Alias{}, nil
+	if rmsg.Type == Rerror {
+		return Alias{}, fmt.Errorf("new alias: %v", rmsg.Error)
+	}
+	return rmsg.Aliases[0], nil
 }
 
 func (c *Client) Aliases() ([]Alias, error) {
-	v := url.Values{}
-	v.Add("user", c.user)
-	v.Add("token", c.token)
-	req, err := http.NewRequest(http.MethodGet, apiurl, nil)
-	if err != nil {
+	tmsg := &Mcall{
+		Type:     Tlist,
+		Username: c.user,
+		Password: c.token,
+	}
+	buf := &bytes.Buffer{}
+	if err := json.NewEncoder(buf).Encode(tmsg); err != nil {
 		return nil, fmt.Errorf("list aliases: %w", err)
 	}
-	req.URL.RawQuery = v.Encode()
-	resp, err := c.Do(req)
+	resp, err := http.Post(c.addr+"/aliases", jsonContentType, buf)
 	if err != nil {
 		return nil, fmt.Errorf("list aliases: %w", err)
 	}
+
 	defer resp.Body.Close()
-	return nil, nil
+	rmsg, err := ParseMcall(resp.Body)
+	if err != nil {
+		return nil, fmt.Errorf("list aliases: parse response: %w", err)
+	}
+	if rmsg.Type == Rerror {
+		return nil, fmt.Errorf("list aliases: %v", rmsg.Error)
+	}
+	return rmsg.Aliases, nil
 }
blob - 878bf43ea9dab8f037a8240bb85d7449f13ffd31
blob + b3008bfc6eabb6e3a0750bd60e55419257c9291e
--- mcall.go
+++ mcall.go
@@ -24,12 +24,12 @@ const (
 // with a diagnostic message, that the request was not completed successfully.
 // This design is loosely based on the Plan 9 network file protocol 9P.
 type Mcall struct {
-	Type uint
-	Username string // Tregister, Rregister
-	Password string // Tregister
-	Error string // Rerror
-	Aliases []Alias // Rnew, Rlist, Tremove
-	Expiry time.Time // Tnew, Rnew
+	Type     uint
+	Username string    // Tregister, Rregister
+	Password string    // Tregister
+	Error    string    // Rerror
+	Aliases  []Alias   // Rnew, Rlist, Tremove
+	Expiry   time.Time // Tnew, Rnew
 }
 
 // ParseMcall parses and validates one Mcall from r.