chat/message/user: screen -> WriteCloser embedded

This commit is contained in:
Andrey Petrov 2016-09-08 14:09:43 -04:00
parent 5f2a230ecc
commit 01b989cab2
3 changed files with 16 additions and 15 deletions

View File

@ -18,13 +18,13 @@ var ErrUserClosed = errors.New("user closed")
// User definition, implemented set Item interface and io.Writer // User definition, implemented set Item interface and io.Writer
type User struct { type User struct {
colorIdx int io.WriteCloser
joined time.Time
msg chan Message
done chan struct{}
screen io.WriteCloser colorIdx int
joined time.Time
closeOnce sync.Once closeOnce sync.Once
msg chan Message
done chan struct{}
mu sync.Mutex mu sync.Mutex
name string name string
@ -47,7 +47,7 @@ func NewUser(name string) *User {
func NewUserScreen(name string, screen io.WriteCloser) *User { func NewUserScreen(name string, screen io.WriteCloser) *User {
u := NewUser(name) u := NewUser(name)
u.screen = screen u.WriteCloser = screen
return u return u
} }
@ -112,9 +112,7 @@ func (u *User) setColorIdx(idx int) {
// Disconnect user, stop accepting messages // Disconnect user, stop accepting messages
func (u *User) Close() { func (u *User) Close() {
u.closeOnce.Do(func() { u.closeOnce.Do(func() {
if u.screen != nil { u.WriteCloser.Close()
u.screen.Close()
}
// close(u.msg) TODO: Close? // close(u.msg) TODO: Close?
close(u.done) close(u.done)
}) })
@ -182,7 +180,7 @@ func (u *User) render(m Message) string {
// HandleMsg will render the message to the screen, blocking. // HandleMsg will render the message to the screen, blocking.
func (u *User) HandleMsg(m Message) error { func (u *User) HandleMsg(m Message) error {
r := u.render(m) r := u.render(m)
_, err := u.screen.Write([]byte(r)) _, err := u.Write([]byte(r))
if err != nil { if err != nil {
logger.Printf("Write failed to %s, closing: %s", u.Name(), err) logger.Printf("Write failed to %s, closing: %s", u.Name(), err)
u.Close() u.Close()

View File

@ -13,12 +13,15 @@ func TestMakeUser(t *testing.T) {
m := NewAnnounceMsg("hello") m := NewAnnounceMsg("hello")
defer u.Close() defer u.Close()
u.Send(m) err := u.Send(m)
u.HandleMsg(u.ConsumeOne()) if err != nil {
t.Fatalf("failed to send: %s", err)
}
u.HandleMsg(<-u.msg)
s.Read(&actual) s.Read(&actual)
expected = []byte(m.String() + Newline) expected = []byte(m.String() + Newline)
if !reflect.DeepEqual(actual, expected) { if !reflect.DeepEqual(actual, expected) {
t.Errorf("Got: `%s`; Expected: `%s`", actual, expected) t.Errorf("Got: %q; Expected: %q", actual, expected)
} }
} }

View File

@ -31,9 +31,9 @@ func TestSet(t *testing.T) {
t.Error(err) t.Error(err)
} }
err = s.Add(set.Itemize(u2.ID(), u2)) err = s.AddNew(set.Itemize(u2.ID(), u2))
if err != set.ErrCollision { if err != set.ErrCollision {
t.Error(err) t.Errorf("expected ErrCollision, got: %s", err)
} }
size := s.Len() size := s.Len()