Blame


1 5e70998a 2022-04-12 o package mailmux
2 5e70998a 2022-04-12 o
3 5e70998a 2022-04-12 o import (
4 7583dd64 2022-04-13 o "encoding/json"
5 cb474497 2022-04-19 o "errors"
6 5e70998a 2022-04-12 o "fmt"
7 71bdede3 2022-04-21 o "net"
8 5e70998a 2022-04-12 o )
9 5e70998a 2022-04-12 o
10 5e70998a 2022-04-12 o const apiurl = "https://mailmux.net/v1/aliases"
11 5e70998a 2022-04-12 o
12 7583dd64 2022-04-13 o const jsonContentType = "application/json"
13 7583dd64 2022-04-13 o
14 5e70998a 2022-04-12 o type Client struct {
15 71bdede3 2022-04-21 o conn net.Conn // or io.ReadWriteCloser?
16 5e70998a 2022-04-12 o }
17 5e70998a 2022-04-12 o
18 71bdede3 2022-04-21 o func Dial(network, address string) (*Client, error) {
19 71bdede3 2022-04-21 o c, err := net.Dial(network, address)
20 71bdede3 2022-04-21 o if err != nil {
21 71bdede3 2022-04-21 o return nil, err
22 925168e0 2022-04-14 o }
23 71bdede3 2022-04-21 o return &Client{conn: c}, nil
24 5e70998a 2022-04-12 o }
25 5e70998a 2022-04-12 o
26 71bdede3 2022-04-21 o func (c *Client) exchange(tmsg *Mcall) (*Mcall, error) {
27 71bdede3 2022-04-21 o if err := c.tx(tmsg); err != nil {
28 71bdede3 2022-04-21 o return nil, fmt.Errorf("transmit tmsg: %w", err)
29 71bdede3 2022-04-21 o }
30 71bdede3 2022-04-21 o rmsg, err := c.rx()
31 71bdede3 2022-04-21 o if err != nil {
32 71bdede3 2022-04-21 o return nil, fmt.Errorf("receive rmsg: %w", err)
33 71bdede3 2022-04-21 o }
34 71bdede3 2022-04-21 o // TODO sanity checks here.
35 71bdede3 2022-04-21 o // did we get back the message type we expected?
36 71bdede3 2022-04-21 o return rmsg, nil
37 71bdede3 2022-04-21 o }
38 71bdede3 2022-04-21 o
39 71bdede3 2022-04-21 o func (c *Client) tx(tmsg *Mcall) error {
40 71bdede3 2022-04-21 o return json.NewEncoder(c.conn).Encode(tmsg)
41 71bdede3 2022-04-21 o }
42 71bdede3 2022-04-21 o
43 71bdede3 2022-04-21 o func (c *Client) rx() (*Mcall, error) {
44 71bdede3 2022-04-21 o return ParseMcall(c.conn)
45 71bdede3 2022-04-21 o }
46 71bdede3 2022-04-21 o
47 71bdede3 2022-04-21 o func (c *Client) Auth(username, password string) error {
48 71bdede3 2022-04-21 o tmsg := &Mcall{
49 71bdede3 2022-04-21 o Type: Tauth,
50 7583dd64 2022-04-13 o Username: username,
51 7583dd64 2022-04-13 o Password: password,
52 7583dd64 2022-04-13 o }
53 71bdede3 2022-04-21 o rmsg, err := c.exchange(tmsg)
54 7583dd64 2022-04-13 o if err != nil {
55 71bdede3 2022-04-21 o return err
56 7583dd64 2022-04-13 o }
57 71bdede3 2022-04-21 o if rmsg.Type == Rerror {
58 71bdede3 2022-04-21 o return errors.New(rmsg.Error)
59 7583dd64 2022-04-13 o }
60 71bdede3 2022-04-21 o return nil
61 7583dd64 2022-04-13 o }
62 7583dd64 2022-04-13 o
63 925168e0 2022-04-14 o func (c *Client) NewAlias() ([]Alias, error) {
64 a7e7d1d5 2022-04-13 o tmsg := &Mcall{
65 71bdede3 2022-04-21 o Type: Tcreate,
66 5b8260a5 2022-04-13 o }
67 71bdede3 2022-04-21 o rmsg, err := c.exchange(tmsg)
68 5e70998a 2022-04-12 o if err != nil {
69 71bdede3 2022-04-21 o return nil, fmt.Errorf("exchange tmsg: %w", err)
70 5e70998a 2022-04-12 o }
71 5b8260a5 2022-04-13 o if rmsg.Type == Rerror {
72 71bdede3 2022-04-21 o return nil, errors.New(rmsg.Error)
73 5b8260a5 2022-04-13 o }
74 a7e7d1d5 2022-04-13 o return rmsg.Aliases, nil
75 5e70998a 2022-04-12 o }
76 5e70998a 2022-04-12 o
77 925168e0 2022-04-14 o func (c *Client) Aliases() ([]Alias, error) {
78 5b8260a5 2022-04-13 o tmsg := &Mcall{
79 71bdede3 2022-04-21 o Type: Tlist,
80 5b8260a5 2022-04-13 o }
81 71bdede3 2022-04-21 o rmsg, err := c.exchange(tmsg)
82 5e70998a 2022-04-12 o if err != nil {
83 71bdede3 2022-04-21 o return nil, fmt.Errorf("exchange tmsg: %w", err)
84 5e70998a 2022-04-12 o }
85 5b8260a5 2022-04-13 o if rmsg.Type == Rerror {
86 cb474497 2022-04-19 o return nil, errors.New(rmsg.Error)
87 5b8260a5 2022-04-13 o }
88 5b8260a5 2022-04-13 o return rmsg.Aliases, nil
89 5e70998a 2022-04-12 o }
90 71bdede3 2022-04-21 o
91 71bdede3 2022-04-21 o func (c *Client) Close() error {
92 71bdede3 2022-04-21 o return c.conn.Close()
93 71bdede3 2022-04-21 o }