package mailmux import ( "encoding/json" "errors" "io" "time" "mailmux.net/aliases" ) const ( Tregister = 1 + iota Rregister Rerror Tnew Rnew Tlist Rlist Tremove ) // Mcall represents a message passed between mailmux clients and servers. // Operations requested by clients are T-messages (such as Tregister). // Servers respond with the corresponding R-message (such as Rregister). // Servers may instead respond with Rerror to inform the client, 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 aliases.Aliases // Rnew, Rlist, Tremove Expiry time.Time // Tnew, Rnew } // ParseMcall parses and validates a JSON-encoded Mcall from r. func ParseMcall(r io.Reader) (*Mcall, error) { var mc Mcall if err := json.NewDecoder(r).Decode(&mc); err != nil { return nil, err } switch mc.Type { case Rerror: if mc.Error == "" { return nil, errors.New("empty error message") } case Tregister, Tnew, Tlist, Tremove: if mc.Username == "" { return nil, errors.New("empty username") } else if mc.Password == "" { return nil, errors.New("empty password") } } return &mc, nil }