|
1 | 1 | package libchan |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "errors" |
4 | 5 | "io" |
5 | 6 | ) |
6 | 7 |
|
| 8 | +var ( |
| 9 | + // ErrIncompatibleSender is used when an object cannot support |
| 10 | + // SendTo for its given argument. |
| 11 | + ErrIncompatibleSender = errors.New("incompatible sender") |
| 12 | + // ErrIncompatibleReceiver is used when an object cannot support |
| 13 | + // ReceiveFrom for its given argument. |
| 14 | + ErrIncompatibleReceiver = errors.New("incompatible receiver") |
| 15 | +) |
| 16 | + |
| 17 | +// ReceiverFrom defines a type which can directly receive objects |
| 18 | +// from a receiver. |
| 19 | +type ReceiverFrom interface { |
| 20 | + // ReceiveFrom receives object from the given receiver. If the given |
| 21 | + // receiver is not a supported type, this function should return |
| 22 | + // ErrIncompatibleReceiver. |
| 23 | + ReceiveFrom(Receiver) (int, error) |
| 24 | +} |
| 25 | + |
| 26 | +// SenderTo defines a type which can directly send objects |
| 27 | +// from a sender. |
| 28 | +type SenderTo interface { |
| 29 | + // SendTo sends object to the given sender. If the given |
| 30 | + // sender is not a supported type, this function should return |
| 31 | + // ErrIncompatibleSender. |
| 32 | + SendTo(Sender) (int, error) |
| 33 | +} |
| 34 | + |
7 | 35 | // Copy copies from a receiver to a sender until an EOF is |
8 | 36 | // received. The number of copies made is returned along |
9 | 37 | // with any error that may have halted copying prior to an EOF. |
10 | 38 | func Copy(w Sender, r Receiver) (int, error) { |
| 39 | + if senderTo, ok := r.(SenderTo); ok { |
| 40 | + if n, err := senderTo.SendTo(w); err != ErrIncompatibleSender { |
| 41 | + return n, err |
| 42 | + } |
| 43 | + } |
| 44 | + if receiverFrom, ok := w.(ReceiverFrom); ok { |
| 45 | + if n, err := receiverFrom.ReceiveFrom(r); err != ErrIncompatibleReceiver { |
| 46 | + return n, err |
| 47 | + } |
| 48 | + } |
| 49 | + |
11 | 50 | var n int |
12 | 51 | for { |
13 | | - m := make(map[string]interface{}) |
| 52 | + var m interface{} |
14 | 53 | err := r.Receive(&m) |
15 | 54 | if err != nil { |
16 | 55 | if err == io.EOF { |
|
0 commit comments