11 7583dd64 2022-04-13 o Tregister = 1 + iota
24 c7ecbae7 2022-04-13 o // Mcall represents a message passed between mailmux clients and servers.
25 7583dd64 2022-04-13 o // Operations requested by clients are T-messages (such as Tregister).
26 c7ecbae7 2022-04-13 o // Servers respond with the corresponding R-message (such as Rregister).
27 c7ecbae7 2022-04-13 o // Servers may instead respond with Rerror to inform the client, with a diagnostic message,
28 c7ecbae7 2022-04-13 o // that the request was not completed successfully.
29 7583dd64 2022-04-13 o // This design is loosely based on the Plan 9 network file protocol 9P.
30 7583dd64 2022-04-13 o type Mcall struct {
32 925168e0 2022-04-14 o Username string `json:",omitempty"` // Tregister, Rregister
33 925168e0 2022-04-14 o Password string `json:",omitempty"` // Tregister
34 925168e0 2022-04-14 o Error string `json:",omitempty"` // Rerror
35 925168e0 2022-04-14 o Aliases []Alias `json:",omitempty"` // Rnew, Rlist, Tremove
36 cb474497 2022-04-19 o Expiry time.Time `json:",omitempty"` // Tcreate, Rnew
39 c7ecbae7 2022-04-13 o // ParseMcall parses and validates a JSON-encoded Mcall from r.
40 7583dd64 2022-04-13 o func ParseMcall(r io.Reader) (*Mcall, error) {
42 7583dd64 2022-04-13 o if err := json.NewDecoder(r).Decode(&mc); err != nil {
43 7583dd64 2022-04-13 o return nil, err
45 a7e7d1d5 2022-04-13 o switch mc.Type {
47 a7e7d1d5 2022-04-13 o if mc.Error == "" {
48 a7e7d1d5 2022-04-13 o return nil, errors.New("empty error message")
51 a7e7d1d5 2022-04-13 o if mc.Username == "" {
52 a7e7d1d5 2022-04-13 o return nil, errors.New("empty username")
54 71bdede3 2022-04-21 o if mc.Password == "" {
55 a7e7d1d5 2022-04-13 o return nil, errors.New("empty password")
57 71bdede3 2022-04-21 o case Tregister, Tcreate, Tlist, Tremove:
58 71bdede3 2022-04-21 o // check required params
60 7583dd64 2022-04-13 o return &mc, nil
63 71bdede3 2022-04-21 o func writeMcall(w io.Writer, mcall *Mcall) error {
64 71bdede3 2022-04-21 o return json.NewEncoder(w).Encode(mcall)
67 71bdede3 2022-04-21 o // rerror writes a JSON-encoded Rerror message to the underlying writer
68 71bdede3 2022-04-21 o // with its Error field set to errormsg.
69 71bdede3 2022-04-21 o func rerror(w io.Writer, errormsg string) error {
70 71bdede3 2022-04-21 o rmsg := &Mcall{Type: Rerror, Error: errormsg}
71 71bdede3 2022-04-21 o return writeMcall(w, rmsg)