10 5e70998a 2022-04-12 o const apiurl = "https://mailmux.net/v1/aliases"
12 7583dd64 2022-04-13 o const jsonContentType = "application/json"
14 5e70998a 2022-04-12 o type Client struct {
15 71bdede3 2022-04-21 o conn net.Conn // or io.ReadWriteCloser?
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
23 71bdede3 2022-04-21 o return &Client{conn: c}, nil
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)
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)
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
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)
43 71bdede3 2022-04-21 o func (c *Client) rx() (*Mcall, error) {
44 71bdede3 2022-04-21 o return ParseMcall(c.conn)
47 71bdede3 2022-04-21 o func (c *Client) Auth(username, password string) error {
48 71bdede3 2022-04-21 o tmsg := &Mcall{
50 7583dd64 2022-04-13 o Username: username,
51 7583dd64 2022-04-13 o Password: password,
53 71bdede3 2022-04-21 o rmsg, err := c.exchange(tmsg)
54 7583dd64 2022-04-13 o if err != nil {
57 71bdede3 2022-04-21 o if rmsg.Type == Rerror {
58 71bdede3 2022-04-21 o return errors.New(rmsg.Error)
63 925168e0 2022-04-14 o func (c *Client) NewAlias() ([]Alias, error) {
64 a7e7d1d5 2022-04-13 o tmsg := &Mcall{
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)
71 5b8260a5 2022-04-13 o if rmsg.Type == Rerror {
72 71bdede3 2022-04-21 o return nil, errors.New(rmsg.Error)
74 a7e7d1d5 2022-04-13 o return rmsg.Aliases, nil
77 925168e0 2022-04-14 o func (c *Client) Aliases() ([]Alias, error) {
78 5b8260a5 2022-04-13 o tmsg := &Mcall{
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)
85 5b8260a5 2022-04-13 o if rmsg.Type == Rerror {
86 cb474497 2022-04-19 o return nil, errors.New(rmsg.Error)
88 5b8260a5 2022-04-13 o return rmsg.Aliases, nil
91 71bdede3 2022-04-21 o func (c *Client) Close() error {
92 71bdede3 2022-04-21 o return c.conn.Close()