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

View File

@ -13,12 +13,15 @@ func TestMakeUser(t *testing.T) {
m := NewAnnounceMsg("hello")
defer u.Close()
u.Send(m)
u.HandleMsg(u.ConsumeOne())
err := u.Send(m)
if err != nil {
t.Fatalf("failed to send: %s", err)
}
u.HandleMsg(<-u.msg)
s.Read(&actual)
expected = []byte(m.String() + Newline)
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)
}
err = s.Add(set.Itemize(u2.ID(), u2))
err = s.AddNew(set.Itemize(u2.ID(), u2))
if err != set.ErrCollision {
t.Error(err)
t.Errorf("expected ErrCollision, got: %s", err)
}
size := s.Len()